Скажем, у меня есть 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.