|
5.3.6. Фрагментация IP-пакетов
Протокол IP позволяет выполнять
фрагментацию пакетов, поступающих на
входные порты маршрутизаторов.
Следует различать фрагментацию
сообщений в узле-отправителе и
динамическую фрагментацию сообщений в
транзитных узлах сети - маршрутизаторах.
Практически во всех стеках протоколов есть
протоколы, которые отвечают за
фрагментацию сообщений прикладного уровня
на такие части, которые укладываются в
кадры канального уровня. В стеке TCP/IP эту
задачу решает протокол TCP, который
разбивает поток байтов, передаваемый ему с
прикладного уровня на сообщения нужного
размера (например, на 1460 байт для протокола
Ethernet). Поэтому протокол IP в узле-отправителе
не использует свои возможности по
фрагментации пакетов.
А вот при необходимости передать
пакет в следующую сеть, для которой размер
пакета является слишком большим, IP-фрагментация
становится необходимой. В функции уровня IP
входит разбиение слишком длинного для
конкретного типа составляющей сети
сообщения на более короткие пакеты с
созданием соответствующих служебных полей,
нужных для последующей сборки фрагментов в
исходное сообщение.
В большинстве типов локальных и
глобальных сетей значения MTU, то есть
максимальный размер поля данных, в которое
должен инкапсулировать свой пакет протокол
IP, значительно отличается. Сети Ethernet имеют
значение MTU, равное 1500 байт, сети FDDI - 4096 байт,
а сети Х.25 чаще всего работают с MTU в 128 байт.
IP-пакет может быть помечен как не
фрагментируемый. Любой пакет, помеченный
таким образом, не может быть фрагментирован
модулем IP ни при каких условиях. Если же
пакет, помеченный как не фрагментируемый,
не может достигнуть получателя без
фрагментации, то этот пакет просто
уничтожается, а узлу-отправителю
посылается соответствующее ICMP-сообщение.
Протокол IP допускает возможность
использования в пределах отдельной подсети
ее собственных средств фрагментирования,
невидимых для протокола IP. Например,
технология АТМ делит поступающие IP-пакеты
на ячейки с полем данных в 48 байт с помощью
своего уровня сегментирования, а затем
собирает ячейки в исходные пакеты на выходе
из сети. Но такие технологии, как АТМ,
являются скорее исключением, чем правилом.
Процедуры фрагментации и сборки
протокола IP рассчитаны на то, чтобы пакет
мог быть разбит на практически любое
количество частей, которые впоследствии
могли бы быть вновь собраны. Получатель
фрагмента использует поле идентификации
для того, чтобы не перепутать фрагменты
различных пакетов. Модуль IP, отправляющий
пакет, устанавливает в поле идентификации
значение, которое должно быть уникальным
для данной пары отправитель - получатель, а
также время, в течение которого пакет может
быть активным в сети.
Поле смещения фрагмента сообщает
получателю положение фрагмента в исходном
пакете. Смещение фрагмента и длина
определяют часть исходного пакета,
принесенную этим фрагментом. Флаг «more fragments»
показывает появление последнего фрагмента.
Модуль протокола IP, отправляющий
неразбитый на фрагменты пакет,
устанавливает в нуль флаг «more fragments» и
смещение во фрагменте.
Эти поля дают достаточное
количество информации для сборки пакета.
Чтобы разделить на фрагменты
большой пакет, модуль протокола IP,
установленный, например, на маршрутизаторе,
создает несколько новых пакетов и копирует
содержимое полей IP-заголовка из большого
пакета в IP-заголовки всех новых пакетов.
Данные из старого пакета делятся на
соответствующее число частей, размер
каждой из которых, кроме самой последней,
обязательно должен быть кратным 8 байт.
Размер последней части данных равен
полученному остатку.
Каждая из полученных частей
данных помещается в новый пакет. Когда
происходит фрагментация, то некоторые
параметры IP-заголовка копируются в
заголовки всех фрагментов, а другие
остаются лишь в заголовке первого
фрагмента. Процесс фрагментации может
изменить значения данных, расположенных в
поле параметров, и значение контрольной
суммы заголовка, изменить значение флага «more
fragments» и смещение фрагмента, изменить длину
IP-заголовка и общую длину пакета, В
заголовок каждого пакета заносятся
соответствующие значения в поле смещения «fragment
offset», а в поле общей длины пакета помещается
длина каждого пакета. Первый фрагмент будет
иметь в поле «fragment offset» нулевое значение. Во
всех пакетах, кроме последнего, флаг «more
fragments» устанавливается в единицу, а в
последнем фрагменте - в нуль.
Чтобы собрать фрагменты пакета,
модуль протокола IP (например, модуль на хост
- компьютере) объединяет IP-пакеты, имеющие
одинаковые значения в полях идентификатора,
отправителя, получателя и протокола. Таким
образом, отправитель должен выбрать
идентификатор таким образом, чтобы он был
уникален для данной пары отправитель-получатель,
для данного протокола и в течение того
времени, пока данный пакет (или любой его
фрагмент) может существовать в составной IP-сети.
Очевидно, что модуль протокола IP,
отправляющий пакеты, должен иметь таблицу
идентификаторов, где каждая запись
соотносится с каждым отдельным получателем,
с которым осуществлялась связь, и указывает
последнее значение максимального времени
жизни пакета в IP-сети. Однако, поскольку
поле идентификатора допускает 65 536
различных значений, некоторые хосты могут
использовать просто уникальные
идентификаторы, не зависящие от адреса
получателя.
В некоторых случаях
целесообразно, чтобы идентификаторы IP-пакетов
выбирались протоколами более высокого, чем
IP, уровня. Например, в протоколе TCP
предусмотрена повторная передача ТСР -
сегментов, по каким-либо причинам не
дошедшим до адресата. Вероятность
правильного приема увеличивалась бы, если
бы при повторной передаче идентификатор
для IP-пакета был бы тем же, что и в исходном
IP-пакете, поскольку его фрагменты могли бы
использоваться для сборки правильного ТСР -
сегмента.
Процедура объединения
заключается в помещении данных из каждого
фрагмента в позицию, указанную в заголовке
пакета в поле «fragment offset».
Каждый модуль IP должен быть
способен передать пакет из 68 байт без
дальнейшей фрагментации. Это связано с тем,
что IP-заголовок может включать до 60 байт, а
минимальный фрагмент данных - 8 байт. Каждый
получатель должен быть в состоянии принять
пакет из 576 байт в качестве единого куска
либо в виде фрагментов, подлежащих сборке.
Если бит флага запрета
фрагментации (Don't Fragment, DF) установлен, то
фрагментация данного пакета запрещена,
даже если в этом случае он будет потерян.
Данное средство может использоваться для
предотвращения фрагментации в тех случаях,
когда хост - получатель не имеет
достаточных ресурсов для сборки фрагментов.
Работа протокола IP по
фрагментации пакетов в хостах и
маршрутизаторах иллюстрируется на рис. 5.21.
Рис.5.21. Фрагментация IP-пакетов
при передаче между сетями с разным
максимальным размером пакетов: К1 и 01 -
канальный и физический уровень сети 1; К2 и Ф2
- канальный и физический уровень сети 2
Пусть компьютер 1 связан с сетью,
имеющей значение MTU в 4096 байт, например с
сетью FDDI, При поступлении на IP-уровень
компьютера 1 сообщения от транспортного
уровня размером в 5600 байт протокол IP делит
его на два IP-пакета, устанавливая в первом
пакете признак фрагментации и присваивая
пакету уникальный идентификатор, например
486, В первом пакете величина поля смещения
равна 0, а во втором - 2800. Признак
фрагментации во втором пакете равен нулю,
что показывает, что это последний фрагмент
пакета. Общая величина IP-пакета составляет
2800 плюс 20 (размер IP-заголовка), то есть 2820
байт, что умещается в поле данных кадра FDDI.
Далее модуль IP компьютера 1 передает эти
пакеты своему сетевому интерфейсу (образуемому
протоколами канального уровня К 1 и
физического уровня Ф1), Сетевой интерфейс
отправляет кадры следующему
маршрутизатору.
После того, как кадры пройдут
уровень сетевого интерфейса
маршрутизатора (К1 и Ф1) и освободятся от
заголовков FDDI, модуль IP по сетевому адресу
определяет, что прибывшие два пакета нужно
передать в сеть 2, которая является сетью
Ethernet и имеет значение MTU, равное 1500.
Следовательно, прибывшие IP-пакеты
необходимо фрагментировать. Маршрутизатор
извлекает поле данных из каждого пакета и
делит его еще пополам, чтобы каждая часть
уместилась в поле данных кадра Ethernet. Затем
он формирует новые IP-пакеты, каждый из
которых имеет длину 1400 + 20 - 1420 байт, что
меньше 1500 байт, поэтому они нормально
помещаются в поле данных кадров Ethernet.
В результате в компьютер 2 по сети Ethernet
приходят четыре IP-пакета с общим
идентификатором 486, что позволяет протоколу
IP, работающему в компьютере 2, правильно
собрать исходное сообщение. Если пакеты
пришли не в том порядке, в котором были
посланы, то смещение укажет правильный
порядок их объединения.
Отметим, что IP-маршрутизаторы не
собирают фрагменты пакетов в более крупные
пакеты, даже если на пути встречается сеть,
допускающая такое укрупнение. Это связано с
тем, что отдельные фрагменты сообщения
могут перемещаться по интерсети по
различным маршрутам, поэтому нет гарантии,
что все фрагменты проходят через какой-либо
промежуточный маршрутизатор на их пути.
При приходе первого фрагмента
пакета узел назначения запускает таймер,
который определяет максимально допустимое
время ожидания прихода остальных
фрагментов этого пакета. Таймер
устанавливается на максимальное из двух
значений: первоначальное установочное
время ожидания и время жизни, указанное в
принятом фрагменте. Таким образом,
первоначальная установка таймера является
нижней границей для времени ожидания при
c6opi. Если таймер истекает раньше прибытия
последнего фрагмента, то все ресурсы сборки,
связанные с данным пакетом, освобождаются,
все полученные к этому моменту фрагменты
пакета отбрасываются, а в узел, пославший
исходный пакет, направляется сообщение об
ошибке с помощью протокола ICMP.
|