Фрагментация
Маршрутизатор способен соединять сети с различными сетевыми средами и протоколами канального уровня, но, чтобы направить пакеты из одной сети в другую, ему часто приходится переупаковывать дейтаграмму в другой кадр канального уровня. Иногда это выливается в удаление старого кадра и создание нового. В других случаях протоколы канального уровня различаются настолько сильно, что процесс переупаковки усложняется, как, например, при соединении сети Token Ring с сетью Ethernet. Дело в том, что в сети Token Ring дейтаграмма может иметь длину до 4500 байтов, а в сети Ethernet — не более 1500 байтов.
Для решения этой проблемы маршрутизатор разделяет дейтаграмму, пришедшую из сети Token Ring, на несколько фрагментов (рис. 4). Каждый из них обладает собственным заголовком IP и пересылается в отдельном кадре канального уровня. Размер фрагмента определяется размером максимальной единицы передачи (maximum transfer unit, MTU) в целевой сети. Попадая в сети с меньшим значением MTU, фрагменты могут дробиться дальше. Восстановление исходной дейтаграммы из фрагментов производится только в самом конце их путешествия, в целевой системе.
Маршрутизатор
Рис. 4. Для передачи по сети с меньшим значением MTU маршрутизатор разделяет дейтаграмму на фрагменты
Разбивая дейтаграмму на фрагменты, протокол IP к каждому из них присоединяет IP-заголовок. Поле Identification в заголовке каждого фрагмента содержит то же значение, что и аналогичное поле в заголовке исходной дейтаграммы. Это позволяет целевой системе найти фрагменты, принадлежащие одной и той же дейтаграмме. Кроме того, маршрутизатор записывает в поля Total Length длины фрагментов и изменяет значение бита More Fragments в поле Flags с 0 на 1 во всех фрагментах, кроме последнего. Значение 1 этого бита означает, что существуют и другие фрагменты, относящиеся к той же дейтаграмме. По биту More Fragments целевая система определяет, все ли фрагменты получены и можно ли начинать сборку дейтаграммы.
Значение поля Fragment Offset определяет место фрагмента в дейтаграмме. У первого фрагмента значение этого поля равно 0, у второго фрагмента оно равно размеру первого фрагмента в байтах. Для третьего фрагмента величина смещения равна суммарному размеру первых двух фрагментов и т. д. Целевая система использует эти величины, чтобы скомпоновать фрагменты в правильном порядке. Установка в единицу бита Don't Fragment в поле Flags запрещает маршрутизатору фрагментировать дейтаграмму. Если без фрагментации ее передать нельзя, маршрутизатор проигнорирует дейтаграмму, послав системе-источнику сообщение ICMP об ошибке.
Необходимо отметить разницу между фрагментацией в узле-отправителе и динамической фрагментацией в транзитных узлах сети – маршрутизаторах.
В первом случае деление сообщения на несколько более мелких частей происходит при передачи данных между протоколами одного и того же стека внутри компьютера. Протоколы, выполняющие фрагментацию в пределах узла, анализируют тип технологии нижнего уровня, определяют его MTU и делят сообщения на части, которые умещаются в кадры канального уровня.
В стеке TCP/IP эту задачу решает протокол ТСР, который разбивает поток байтов, передаваемый ему с прикладного уровня, на сегменты нужного размера.
А вот на транзитном узле- маршрутизаторе, когда пакет необходимо передать с большим значением MTU в сеть с меньшим значением MTU, способности протокола IP выполнять фрагментацию становятся востребованными. Пакеты фрагменты, путешествуя по сети могут вторично подвергнуться маршрутизации на каком-либо промежуточном маршрутизаторе.