2010-05-06 4 views
15

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

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

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

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

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

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

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

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

+0

Каков фактический вызов API сокета, который вы делаете, что приводит к установке бит DF? –

+1

Есть несколько хороших дискуссий о том, где DF может быть полезен здесь: http://stackoverflow.com/questions/351806/where-is-the-dont-fragment-bit-of-the-ip-flags-used - in Короче говоря, это похоже на ситуацию, когда, если вы не знаете, что вам это нужно, тогда вы этого не сделаете. –

ответ

35

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

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

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

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

+0

Ты прибил это! – jathanism

-2

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

2

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