Преимущества «Не фрагментировать» на пакетах TCP? - PullRequest
16 голосов
/ 06 мая 2010

У одного из наших клиентов возникли проблемы с отправкой данных из нашего приложения (на их ПК) на сервер (в другом географическом местоположении). При отправке пакетов размером менее 1100 байт все работает нормально, но выше этого мы видим, что TCP ретранслирует пакет каждые несколько секунд и не получает ответа. Пакеты, которые мы используем для тестирования, имеют размер около 1400 байт (но менее 1472). Я могу отправить пинг ICMP на www.google.com, который составляет 1472 байта, и получить ответ (так что это не их маршрутизатор / первые несколько переходов).

Я обнаружил, что наше приложение устанавливает флаг DF для этих пакетов, и я считаю, что маршрутизатор на пути к серверу имеет MTU меньше / равный 1100 и отбрасывает пакет.

Это влияет на 1 клиента из 5000, но, поскольку маршруты у всех будут разные, это ожидается.

Данные представляют собой конверт SOAP, и мы ожидаем ответа SOAP. Я не могу объяснить, ПОЧЕМУ мы это делаем, код для этого был написан предыдущим разработчиком.

Итак ... Есть ли какие-либо преимущества ИЛИ обоснование установки флага DF для пакетов TCP для данных приложения?

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

Если нет веских оснований, я буду изменять поведение нашего приложения.

Заранее спасибо.

Ответы [ 3 ]

39 голосов
/ 07 мая 2010

Флаг DF обычно устанавливается для IP-пакетов, несущих сегменты TCP.

Это связано с тем, что TCP-соединение может динамически изменять размер своего сегмента в соответствии с MTU пути, и общая общая производительность достигается, когда каждый TCP-сегмент переносится в одном IP-пакете.

Таким образом, для пакетов TCP установлен флаг DF, который должен вызвать возврат пакета ICMP Fragmentation Needed, если промежуточный маршрутизатор должен отбросить пакет, потому что он слишком большой. Затем отправляющий TCP уменьшит оценку MTU пути соединения (максимальная единица передачи) и повторно отправит его в меньшие сегменты. Если DF не был установлен, отправляющий TCP никогда бы не узнал, что отправляет слишком большие сегменты. Этот процесс называется PMTU-D («Обнаружение MTU пути»).

Если пакеты ICMP Fragmentation Needed не проходят, значит, вы имеете дело с поврежденной сетью. В идеале первым шагом было бы выявить неправильно настроенное устройство и исправить его; однако, если это не сработает, тогда вы добавляете в приложение ручку конфигурации, которая говорит ему установить параметр сокета TCP_MAXSEG с помощью setsockopt(). (Типичным примером неправильно настроенного устройства является маршрутизатор или межсетевой экран, который был настроен неопытным сетевым администратором для отбрасывания всех ICMP, не понимая, что TCP PMTU-D требует пакеты, необходимые для фрагментации).

2 голосов
/ 12 января 2016

Операция обнаружения Path-MTU описана в RFC 1191, https://tools.ietf.org/html/rfc1191. TCP лучше обнаружить Path-MTU, чем разбивать каждый пакет определенного размера на две части (обычно один большой и один маленький).

0 голосов
/ 06 мая 2010

Очевидно, что некоторые протоколы, такие как NFS, выигрывают от фрагментации ( текст ссылки ). Тем не менее, вы правы в том, что вам, как правило, не следует запрашивать DF, если вам это действительно не нужно.

...