Мне любопытно узнать, где используется «Do not Fragment» [DF] бит IP-флагов. Поскольку фрагментация невидима для более высоких уровней, и они тоже не заботятся.Где не используется фрагмент флагов IP-флагов?
Я также ищу пример.
Большое спасибо.
Мне любопытно узнать, где используется «Do not Fragment» [DF] бит IP-флагов. Поскольку фрагментация невидима для более высоких уровней, и они тоже не заботятся.Где не используется фрагмент флагов IP-флагов?
Я также ищу пример.
Большое спасибо.
Фрагментация не всегда невидима для всех верхних слоев. Некоторые ранние (и, возможно, даже текущие) стеки TCP/IP с микроконтроллером не реализовали все возможности, такие как обработка фрагментации. Использование флага в этой ситуации гарантирует, что пакет поступит в исходную форму, а не много фрагментов, которые другой конец не смог обработать.
Кроме того, при использовании UDP для всех фрагментов необязательно прибывать в пункт назначения, поэтому предотвращение фрагментации означает, что сообщение прибывает или не прибывает - нет никакой возможности, что только бит дейтаграммы UDP достигнет места назначения. Я не могу вспомнить, как долго стек TCP/IP удерживал незакомпонуемые IP-пакеты, ожидающие отсутствия фрагментов, но использование флага DF означало, что за это время не было ненужных ресурсов.
И, наконец, вы можете использовать его для тестирования поведения сетевой инфраструктуры, например, что происходит, когда вы получаете пакет, который больше, чем максимальный блок передачи (DF предотвратит фрагментацию пакета для «сжимания» отверстия) ,
В дополнение к @Pax's answer (или, возможно, в качестве части тестирования, о котором он упомянул), флаг DP также используется в . Это когда вы пытаетесь выяснить, какой самый большой пакет, который может быть отправлен без фрагментации, для данной ссылки.
Часто полезно избегать фрагментации, даже если протоколы более высокого уровня теоретически изолированы от их механики, они все еще могут «ощущать» последствия. Если один уровень приложения write()
в сетевой сокет заканчивается фрагментацией, поскольку он слишком велик, и один из фрагментов теряется в сети, весь IP-пакет будет потерян. Это, конечно, влияет на пропускную способность.
По этой причине часто желательно знать максимальный блок передачи, то есть самый большой пакет, который может быть отправлен в пункт назначения без фрагментации. Path MTU discovery используется для поиска этого размера, просто устанавливая бит 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 Discovery"
Вот причина, почему IETF в настоящее время предложить новый способ проверить MTU, не полагаясь на Path MTU Discovery: RFC 4821: "Пакетирования Layer Path MTU Discovery"
Это очень удобно знать. +1. – paxdiablo 2008-12-09 08:54:30