Вы должны фрагментировать полезную нагрузку пакета на восьмибайтовых границах. При 128-байтовом MTU максимальный фрагмент полезной нагрузки, который вы можете иметь, составляет 104 байта, что меньше, чем простое вычитание IP-заголовка из MTU (108 байт). Что текст говорит вам, что вычитая размер заголовка пакета (20 байт) из MTU, следующий меньший размер фрагмента, делящийся на восемь, составляет 104 байта.
Фрагментация
Фрагментация интернет-датаграммы необходима, когда она исходит из локальной сети, которая допускает большой размер пакета, и должна пройти через локальную сеть, которая ограничивает пакеты меньшим размером, чтобы достичь места назначения.
Дейтаграмма Интернета может быть помечена как «не фрагментировать». Любая интернет-датаграмма, помеченная таким образом, ни при каких обстоятельствах не должна подвергаться интернет-фрагментации. Если интернет-датаграмма, помеченная как «не фрагментировать», не может быть доставлена к месту назначения без ее фрагментации, вместо этого она должна быть отброшена.
Фрагментация, передача и повторная сборка по локальной сети, которая невидима для модуля интернет-протокола, называется фрагментацией интрасети и может использоваться [6].
Процедура фрагментации и повторной сборки в Интернете должна иметь возможность разбить дейтаграмму на почти произвольное количество частей, которые впоследствии можно будет собрать заново. Получатель фрагментов использует поле идентификации, чтобы гарантировать, что фрагменты разных дейтаграмм не смешаны. Поле смещения фрагмента сообщает получателю позицию фрагмента в исходной дейтаграмме. Смещение и длина фрагмента определяют часть исходной дейтаграммы, охватываемую этим фрагментом. Флаг дополнительных фрагментов указывает (путем сброса) последний фрагмент. Эти поля предоставляют достаточную информацию для повторной сборки дейтаграмм.
Поле идентификации используется для того, чтобы отличать фрагменты одной дейтаграммы от фрагментов другой. Исходный модуль протокола интернет-датаграммы устанавливает поле идентификации в значение, которое должно быть уникальным для этой пары источник-получатель и протокола на время, пока дейтаграмма будет активна в интернет-системе. Исходный модуль протокола полной дейтаграммы устанавливает флаг дополнительных фрагментов в ноль и смещение фрагмента в ноль.
Чтобы фрагментировать длинную дейтаграмму Интернета, модуль протокола Интернета (например, в шлюзе) создает две новые дейтаграммы Интернета и копирует содержимое полей заголовка Интернета из длинной дейтаграммы в оба новых заголовка Интернета. Данные длинной дейтаграммы делятся на две части на границе 8 октетов (64 бита) (вторая часть может не быть целым числом, кратным 8 октетам, но первая должна быть). Назовите количество блоков из 8 октетов в первой части NFB (для числа блоков фрагментов). Первая часть данных помещается в первую новую интернет-дейтаграмму, а в поле общей длины устанавливается длина первой дейтаграммы. Флаг большего количества фрагментов установлен в единицу. Вторая часть данных помещается во вторую новую интернет-дейтаграмму, а в поле общей длины устанавливается длина второй дейтаграммы. Флаг дополнительных фрагментов имеет то же значение, что и длинная дейтаграмма. Поле смещения фрагмента второй новой интернет-дейтаграммы устанавливается равным значению этого поля в длинной дейтаграмме плюс NFB.
Эта процедура может быть обобщена для n-стороннего разделения, а не для описанного двустороннего разделения.
Чтобы собрать фрагменты интернет-дейтаграммы, модуль интернет-протокола (например, на хосте-получателе) объединяет интернет-дейтаграммы, которые имеют одинаковые значения для четырех полей: идентификатор, источник, место назначения и протокол. Комбинация выполняется путем помещения части данных каждого фрагмента в относительное положение, указанное смещением фрагмента в интернет-заголовке этого фрагмента. Первый фрагмент будет иметь нулевое смещение фрагмента, а последний фрагмент будет иметь сброс флага дополнительных фрагментов в ноль.