Повторная сборка не удалась в пункте назначения

Допустим, у меня есть Host1 и 2, подключенные к маршрутизатору с

Host1  <--100 Mbps-->  Router  <--10 Mbps-->  Host2

Host1 отправляет 10 МБ данных UDP с помощью команды nc на Host2, но Host2 не может повторно собрать фрагментированные пакеты и отправляет ICMP (Превышено время жизни / истекло время сборки фрагмента).

Когда на обоих концах 100 Мбит / с, я не вижу сбоев, и фрагментация не происходит.

Я пытался избежать фрагментации следующими методами.

1. Enabling PMTU on destination, router 
        echo 0 > /proc/sys/net/ipv4/ip_no_pmtu_disc
2. Reducing MTU to 576 from 1500

Но фрагментация все равно происходит. Я могу видеть через журнал wirehark. Не могли бы вы посоветовать мне избежать фрагментации и как справиться с этим сценарием.

Редактировать:
Это своего рода стрессовый сценарий с точки зрения маршрутизатора. Я не должен ничего менять на стороне источника / назначения.

0
задан 23 March 2017 в 17:43
1 ответ

Ключевой проблемой здесь является не фрагментация, а потеря пакетов, которая происходит на маршрутизаторе при заполнении его очереди. Затем некоторые фрагменты отбрасываются, и вы видите ошибку повторной сборки.

Чтобы избежать фрагментации, вы должны установить размер вашего пакета на отправляющей стороне, чтобы фрагментация не происходила,но даже если вы это сделаете, вы, вероятно, увидите потерю пакетов в этом же сценарии из-за разницы в скорости и ограничений размера буфера маршрутизатора.

Вы можете использовать socat , который позволяет вам устанавливать размер вашего пакета с помощью UDP (функция, которой netcat , похоже, не имеет, поскольку он просто сбрасывает все данные, которые есть в буфер в один пакет) и установите его так, чтобы фрагментация не происходила, и наблюдайте результаты, предсказанные выше.

В общем, описанное выше является характером чистого UDP, которого можно избежать только путем реализации определенного протокола управления потоком поверх UDP.

2
ответ дан 4 December 2019 в 13:34

Теги

Похожие вопросы