Рассмотрим вначале процедуру фрагментации. Прежде чем разделить прибывший пакет на фрагменты, модуль протокола IP, установленный на маршрутизаторе, организует несколько буферов для новых пакетов-фрагментов.
Затем он копирует в эти буферы содержимое некоторых полей заголовка IP из исходного пакета, создавая тем самым «заготовки» заголовков IP всех новых пакетов-фрагментов. Одни параметры заголовка IP копируются в заголовки всех фрагментов, а другие остаются лишь в заголовке первого фрагмента. Процесс фрагментации может изменить значения некоторых полей заголовков IP в пакетах-фрагментах по сравнению с заголовком IP исходного пакета. Так, каждый фрагмент имеет собственное значение контрольной суммы заголовка, смещения фрагмента и общей длины пакета. Во всех пакетах, кроме последнего, флаг MF устанавливается в единицу, а в последнем фрагменте — в нуль.
Содержимое поля данных каждого фрагмента формируется в результате деления содержимого поля данных исходного пакета. При этом должны быть выполнены два условия. Во-первых, размер фрагмента (заголовка в сумме с полем данных) не должен превосходить MTU нижележащей технологии. Во-вторых, размер поля данных каждого фрагмента, кроме самого последнего, должен быть кратным 8 байт. Размер последней части данных равен полученному остатку.
|
|
А теперь обсудим, как происходит сборка фрагментированного пакета. Сборка пакета происходит на хосте назначения.
ВНИМАНИЕ --------------------------------------------------------------------------------------------------------
Отметим, что IP-маршрутизаторы не собирают фрагменты пакетов в более крупные пакеты, даже если на пути встречается сеть, допускающая такое укрупнение. Это связано с тем, что отдельные фрагменты сообщения могут перемещаться по составной сети разными маршрутами, поэтому нет гарантии, что все фрагменты пройдут через какой-то один определенный маршрутизатор на их пути.
Итак, на хосте назначения для каждого фрагментированного пакета отводится отдельный буфер. В этот буфер принимающий протокол IP помещает IP-фрагменты, у которых совпадают IP-адреса отправителя и получателя, а также значения в полях идентификатора и протокола. Все эти признаки говорят модулю IP, что данные пакеты являются фрагментами одного исходного пакета. Собственно сборка заключается в размещении данных из каждого фрагмента в позицию, определенную смещением, указанным в заголовке фрагмента.
Когда первый фрагмент исходного пакета приходит на хост-получатель, этот хост запускает таймер, который определяет максимальное время ожидания прибытия остальных фрагментов данного пакета. В различных реализациях IP применяются разные правила выбора максимального времени ожидания. В частности, таймер может быть установлен на фиксированный период времени (от 60 до 120 секунд), рекомендуемый RFC. Как правило, этот интервал достаточен для доставки пакета от отправителя получателю. В других реализациях максимальное время ожидания определяется с помощью адаптивных алгоритмов измерения и статистической обработки временных параметров сети, позволяющих оценивать ожидаемое время прибытия фрагментов. Наконец, тайм-аут может быть выбран на базе значений TTL прибывающих фрагментов. Последний подход основан на том, что нет смысла ожидать, пока прибудут другие фрагменты пакета, если время жизни одного из прибывших фрагментов уже истекло.
|
|
Признаком окончания сборки является отсутствие незаполненных промежутков в поле данных и прибытие последнего фрагмента (с равным нулю флагом MF). После того как данные собраны, их можно передавать вышележащему протоколу, например TCP.
ВНИМАНИЕ --------------------------------------------------------------------------------------------------------
Если хотя бы один фрагмент пакета не успеет прийти на хост назначения к моменту истечения таймера, то никаких действий по дублированию отсутствующего фрагмента не предпринимается, а все полученные к этому времени фрагменты пакета отбрасываются! Хосту, пославшему исходный пакет, направляется ICMP-сообщепие об ошибке. Такому поведению протокола IP вполне соответствует его кредо «с максимальными усилиями» — стараться по возможности, но никаких гарантий не давать.
Пример
Рассмотрим пример фрагментации на маршрутизаторе (рис. 18.19).
Пусть компьютер-отправитель связан с сетью, имеющей значение MTU 17 914 байт, например с сетью Token Ring. Транспортный уровень, как правило, знает MTU нижележащей технологии и соответствующим образом выбирает размер своих сегментов. Пусть в данном примере с транспортного уровня на уровень IP поступает сообщение
размером 6600 байт. Протокол IP формирует из этого сообщения поле данных 1Р-паке- та и снабжает его заголовком. Обратим особое внимание на заполнение полей заголовка, связанных с фрагментацией. Во-первых, пакету присваивается уникальный идентификатор, например 12456. Во-вторых, поскольку пакет пока еще не был фрагментирован, в поле смещения помещается значение 0, признак MF также обнулен — это показывает, что пакет одновременно является и своим последним фрагментом. В-третьих, признак DF устанавливается в 1, это означает, что данный пакет можно фрагментировать. Общая величина IP-пакета составляет 6600 плюс 20 (размер заголовка IP), то есть 6620 байт, что умещается в поле данных кадра Token Ring. Далее модуль IP хоста-от- иравителя передает этот кадр своему сетевому интерфейсу, который отправляет кадры следующему маршрутизатору.
Хост-получатель |
После того как наш кадр пройдет уровень сетевого интерфейса маршрутизатора и освободится от заголовка Token Ring, модуль IP по сетевому адресу определяет, что прибывший IP-пакет нужно передать в сеть Ethernet, которая имеет значение MTU, равное 1492, что значительно меньше размера поступившего на входной интерфейс пакета. Следовательно, IP-пакет необходимо фрагментировать. Маршрутизатор извлекает поле данных из пакета и делит его на 4 части по 1400 байт и 1 часть в 1000 байт (обратите внимание, что каждый фрагмент данных кратен 8). Затем модуль IP формирует новые IP-пакеты, четыре из которых имеют длину 1400 + 20 = 1420 байт, а один — 1000 + + 20 = 1020 байт, что меньше 1500 байт, поэтому они нормально помещаются в поле данных кадров Ethernet.
В результате хосту-получателю по сети Ethernet приходят пять IP-пакетов с одинаковым идентификатором 12456. Если время прихода фрагментов не превысило тайм- аут, модуль IP может собирать исходное сообщение. При этом смещение укажет правильный порядок их сборки.