Фрагментация и Сборка IP пакетов в Компьютерных Сетях

Напомню, что протокол IP работает на сетевом уровне модель взаимодействия открытых систем, и одна из задач этого уровня объединения сетей построенных на основе разных технологий.

Одно из возможных различий в сетях, это максимальный размер передаваемых данных или Maximum Tranmission Unit, MTU. Для Ethernet это 1 500 байт, для Token Ring 4 464 байта, для FDDI 4 352 байта, а также раньше встречались сети и с другим размером в MTU. Что делать, если на маршрутизатор пришел пакет, размер которого больше, чем может передать сеть?

В этом случае используется фрагментация, разделение пакета на отдельные части, так называемые фрагменты, каждый из которых меньше чем MTU сети.

Формат заголовок IP-пакета

В протоколе IP для реализации фрагментации используются три поля заголовка. Идентификатор пакета, флаги и смещение фрагмента.

Идентификатор пакета задает номер пакета, который разбит на фрагменты, это поле должно быть одинаковое во всех фрагментах пакета.

Размер поля 3 бита, но на практике используется только два. Флаг DF (Dont Fragment) означает запрет фрагментирования. Флаг MF или (More Fragments), говорит о том что полученный фрагмент пакета не последний, будут еще пакеты.

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

В протоколе IP, для того чтобы определить в каком порядке собирать фрагменты в один большой пакет, используется поле смещение фрагмента. Причем в протоколе IP смещение измеряется не в байтах, а в 8-ми байтовых блоках.

Давайте рассмотрим пример, чтобы лучше понять.

  • У нас есть большой пакет размером 4 тысячи байт, в этом пакете 20 байт, это заголовок IP, а полезных данных 3980 байт.
  • Мы хотим передать полученные пакет по сети Ethernet, у который максимальный размер передаваемых данных 1 500 байт. Опять же с 1500 байт, 20 байт отдается под заголовок IP, и 1480 байт под полезные данные.
  • Таким образом, исходные данные размером 3 980 байт, будут разделены на три фрагмента, от 0 до  4179 байт, от 1480 до 2959, от  2960 до 3890.
  • Для того чтобы получить смещение каждого фрагмента, мы должны взять значение первого байта (это 0, 1480 и 2960), и разделить на 8, таким образом смещение получается 0 для первого фрагмента, 185 для второго фрагмента, и 370 для третьего фрагмента.

Фрагментация

Рассмотрим, как работает фрагментация на том же самом примере, большого пакета размером 4000 байт, который нужно передать через сеть Ethernet MTU 1500 байт.

Формируется первый фрагмент, здесь показаны поля IP заголовка, которые имеют отношение к фрагментации.

Маршрутизатор сгенерировал номер пакета 81, номер может быть любой, главное чтобы этот номер был одинаковым во всех фрагментов. Смещение фрагмента равно нулю это означает, что во фрагменте находится самое начало большого пакета. Устанавливается поле More Fragments, и затем записывается первая порция данных 1480 байт.

После этого формируется второй фрагмент с тем же самым номером пакета, значение смещения фрагмента равно 185, 1480 разделенное на 8, и поле More Fragments говорит о том, что будут ещё фрагменты.

Формируется третий пакет с тем же самым номером пакетов 81, смещением 370 и так как это последний фрагмент, то поле More Fragments устанавливается в 0.

Сборка пакета

Сборка пакета происходит в обратном порядке, принимающий маршрутизатор должен определить, что он получил не полный пакет, а фрагмент. Для этого маршрутизатор используют либо поле More Fragments, если поле установлено в единицу, значит это фрагмент. Другим признакам фрагментации является ненулевое значение в поле смещения фрагмента, например, 185 или 370.

Когда маршрутизатор принимает фрагмент пакета, он сохраняют его в память, и затем сохраняет все фрагменты с тем же самым номером, в нашем случае 81. После того как пришел последний фрагмент, маршрутизатор может посчитать размер большого пакета 4000 байт, затем из отдельных фрагментов используя смещение собираются большой пакет.

Флаг DF

Флаг DF или Dont Fragment заголовка IP используется для того чтобы запретить фрагментацию на маршрутизатор. Если этот флаг установлен, то маршрутизатор не имеет право фрагментировать пакет. Что же будет, если размер пакета больше, чем максимальный размер пакета, который может передать данная сеть. В этом случае маршрутизатор просто отбросит пакет и отправит получателю ICMP сообщений с типом 3, кодом 4, это означает что заданный узел недоступен, необходима фрагментация, но установлен флаг DF запрещающий эту фрагментацию.

Заключение

Фрагментация это разбиение IP пакет на несколько частей, фрагментов для передачи по сети с маленьким MTU. Фрагментации используются для объединения сетей построенных на основе разных технологий, у которых отличается MTU.

В заголовке Ip пакета для фрагментации используются три поля: идентификатор пакета, флаги и смещение фрагмента. Следует отметить, что в следующей версии протокола ipv6 отказались от фрагментации на маршрутизаторах, в IPv6  узлы отправителей должны сами подобрать максимальный размер пакета с помощью технологии Path MTU Discovery.

Рекомендую прочесть статьи про протокол IP и IP маршрутизацию в компьютерных сетях.

Оцените статью
Все о технологиях, мобильных приложениях и тарифах на связь