Преимущества "Не фрагментировать" на TCP-пакетах?
У одного из наших клиентов возникли проблемы с отправкой данных из нашего приложения (на их ПК) на сервер (другое географическое местоположение). При отправке пакетов в 1100 байт все работает нормально, но выше этого мы видим, что TCP ретранслирует пакет каждые несколько секунд и не получает ответа. Пакеты, которые мы используем для тестирования, составляют около 1400 байт (но меньше 1472). Я могу отправить запрос ICMP на www.google.com, который составляет 1472 байта, и получить ответ (так что это не их маршрутизатор/первые несколько переходов).
Я обнаружил, что наше приложение устанавливает флаг DF для этих пакетов, и я считаю, что маршрутизатор по пути к серверу имеет MTU меньше/равно 1100 и отбрасывает пакет.
Это влияет на 1 клиент в 5000, но поскольку все маршруты будут разными, это ожидается.
Данные - это SOAP-конверт, и мы ожидаем ответа SOAP. Я не могу оправдать ПОЧЕМУ мы это делаем, код для этого был написан предыдущим разработчиком.
Итак... Есть ли какие-либо преимущества или обоснование для установки флага DF для пакетов TCP для данных приложения?
Я могу думать о причинах, которые необходимы для сетевых диагностических приложений, но не в нашей ситуации (мы хотим, чтобы данные доходили до конечной точки, фрагментировались или нет). Одна из наших системных администраторов сказала, что это может иметь отношение к нам с использованием SSL, но насколько я знаю, SSL подобен потоку и независимо от фрагментации, пока поток не будет восстановлен в конце, нет проблем.
Если нет хорошего оправдания, я буду изменять поведение нашего приложения.
Спасибо заранее.
Ответы
Ответ 1
Флаг DF обычно устанавливается на IP-пакеты, несущие сегменты TCP.
Это связано с тем, что TCP-соединение может динамически изменять размер сегмента для соответствия MTU пути, а лучшая общая производительность достигается, когда каждый из сегментов TCP переносится в одном IP-пакете.
Таким образом, у TCP-пакетов установлен флаг DF, что должно привести к возврату пакета фрагментации ICMP, если промежуточный маршрутизатор должен отказаться от пакета, потому что он слишком велик. Затем отправляющий TCP уменьшит свою оценку MTU пути соединения (Maximum Transmission Unit) и повторно отправит в меньшие сегменты. Если DF не был установлен, отправляющий TCP никогда не узнает, что он посылает слишком большие сегменты. Этот процесс называется PMTU-D ( "Path MTU Discovery" ).
Если пакеты ICMP Fragmentation Needed не пройдут, тогда вы имеете дело с разбитой сетью. В идеале первым шагом было бы определить неправильно сконфигурированное устройство и исправить его; однако, если это не сработает, вы добавите в приложение ручку конфигурации, которая сообщает ей, чтобы установить опцию TCP_MAXSEG
сокета с помощью setsockopt()
. (Типичным примером неправильно сконфигурированного устройства является маршрутизатор или брандмауэр, который был сконфигурирован неопытным администратором сети, чтобы удалить все ICMP, не понимая, что требуемые пакеты для фрагментации требуются TCP PMTU-D).
Ответ 2
Операция обнаружения Path-MTU описана в RFC 1191, https://tools.ietf.org/html/rfc1191.
Лучше TCP обнаруживать Path-MTU, чем иметь каждый пакет с определенным размером, фрагментированным на две части (обычно один большой и один маленький).
Ответ 3
По-видимому, некоторые протоколы, такие как NFS, могут избежать фрагментации (текст ссылки). Тем не менее, вы правы в том, что обычно вам не следует запрашивать DF, если вы действительно этого не требуете.