Вопрос

Мне любопытно узнать, где используется бит «Не фрагментировать» [DF] IP-флагов.Поскольку фрагментация невидима для более высоких уровней, их это тоже не волнует.

Я тоже ищу пример.

Заранее большое спасибо.

Это было полезно?

Решение

Фрагментация не всегда незаметна для всех верхних слоев.Некоторые ранние (и, возможно, даже современные) стеки TCP/IP микроконтроллеров не реализовали полные возможности, такие как обработка фрагментации.Использование флага в этой ситуации гарантирует, что пакет прибудет в исходной форме, а не с множеством фрагментов, которые другой конец не сможет обработать.

Кроме того, при использовании UDP нет необходимости доставлять все фрагменты в пункт назначения, поэтому предотвращение фрагментации означает, что сообщение либо прибудет, либо не прибудет - нет никакой возможности, что только часть дейтаграммы UDP достигнет места назначения. .Я не могу вспомнить, как долго стек TCP/IP удерживал несобранные IP-пакеты в ожидании недостающих фрагментов, но использование флага DF означало, что в это время не было задействовано ненужных ресурсов.

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

Другие советы

В дополнение к Ответ @Пакса (или, возможно, в рамках упомянутого им тестирования) флаг DP также используется в обнаружение пути MTU.Это когда вы пытаетесь выяснить, какой самый большой пакет может быть отправлен без фрагментации для данного канала.

Часто полезно избегать фрагментации, хотя протоколы более высокого уровня теоретически изолированы от ее механики, они все равно могут «чувствовать» последствия.Если один уровень приложения write() если сетевой сокет оказывается фрагментированным, поскольку он слишком велик, и один из фрагментов теряется в сети, весь IP-пакет будет потерян.Это, конечно, влияет на пропускную способность.

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

Обратите внимание, что стандартного способа установки DF в C не существует.В Linux этот код работает:

result = setsockopt(mysocket, IPPROTO_IP, 
                IP_MTU_DISCOVER, IP_PMTUDISC_DO, sizeof(int));

но этого нет во FreeBSD 6

Кроме того, обнаружение Path MTU крайне ненадежно в реальном Интернете.Слишком много сломанных брандмауэров и промежуточных устройств отфильтровывают сообщения ICMP «Слишком большой пакет» (вот хороший способ проверить кандидата в администратора сети во время собеседования:попросите его/ее прекратить пинг, и он/она, вероятно, полностью заблокирует ICMP.) См. RFC 2923:«Проблемы TCP с обнаружением Path MTU»

Именно по этой причине IETF теперь предлагает новый способ тестирования MTU, не полагаясь на Path MTU Discovery:RFC 4821:«Обнаружение MTU пути уровня пакетизации»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top