Допустим, у меня есть 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. Не могли бы вы посоветовать мне избежать фрагментации и как справиться с этим сценарием.
Редактировать:
Это своего рода стрессовый сценарий с точки зрения маршрутизатора. Я не должен ничего менять на стороне источника / назначения.
Ключевой проблемой здесь является не фрагментация, а потеря пакетов, которая происходит на маршрутизаторе при заполнении его очереди. Затем некоторые фрагменты отбрасываются, и вы видите ошибку повторной сборки.
Чтобы избежать фрагментации, вы должны установить размер вашего пакета на отправляющей стороне, чтобы фрагментация не происходила,но даже если вы это сделаете, вы, вероятно, увидите потерю пакетов в этом же сценарии из-за разницы в скорости и ограничений размера буфера маршрутизатора.
Вы можете использовать socat
, который позволяет вам устанавливать размер вашего пакета с помощью UDP (функция, которой netcat
, похоже, не имеет, поскольку он просто сбрасывает все данные, которые есть в буфер в один пакет) и установите его так, чтобы фрагментация не происходила, и наблюдайте результаты, предсказанные выше.
В общем, описанное выше является характером чистого UDP, которого можно избежать только путем реализации определенного протокола управления потоком поверх UDP.