Читаем TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) полностью

Теперь настало время более подробно рассмотреть поля при фрагментации датаграммы.

<p>6.14.1 Поле идентификации</p>

Поле идентификации содержит 16-разрядное число, помогающее хосту назначения распознать фрагмент датаграммы при сборке.

<p>6.14.2 Поле Флагов</p>

Поле флагов содержит три бита:

Бит 0Бит 1Бит 2
0=Зарезервировано0=Можно фрагментировать 1=Нельзя фрагментировать0=Последний фрагмент (Last) 1=Есть еще фрагменты (More)

Бит 0 зарезервирован, но должен иметь значение 0. Отправитель может указать в следующем бите значение 1, и датаграмму нельзя будет фрагментировать. Если ее нельзя будет доставить без фрагментации, а бит фрагментации равен 1, то датаграмма будет отброшена с посылкой сообщения отправителю.

Бит 2 устанавливается в 0 для последней или единственной части датаграммы. Бит 2, установленный в 1, указывает, что датаграмма фрагментирована и имеет следующие далее части.

<p>6.14.3 Поле смещения фрагмента</p>

Блок фрагментации (fragment block) — это 8-октетная порция данных. Число в поле смещения фрагмента (Fragment Offset) указывает величину смещения данного фрагмента (относительно начала датаграммы) в единицах блоков фрагментирования. Это поле имеет длину 13 бит (т.е. смещение может быть от 0 до 8192 блоков фрагментирования — или от 0 до 65 528 октетов). Предположим, что маршрутизатор разделил датаграмму (с идентификатором 348) из 3000 байт данных на три датаграммы по 1000 байт. Каждый фрагмент будет содержать собственный заголовок и 1000 байт данных (125 блоков фрагментирования). Содержимое полей идентификации, флагов и смещений фрагментов будет следующим:

ФрагментИдентификаторФлагиСмещение фрагмента
1348Можно фрагментировать, More0 блоков от начала
2348Можно фрагментировать, More125 блоков (1000 октетов) от начала
3348Можно фрагментировать, Last250 блоков (2000 октетов) от начала

Когда датаграмма доставляется без фрагментации, значения полей будут следующими:

ИдентификаторФлагиСмещение фрагмента
348Можно фрагментировать, Last0 блоков от начала

Хост получателя, приняв датаграмму, помеченную как "Last" и имеющую смещение 0, знает, что она не фрагментирована.

<p>6.14.4 Сборка фрагментированной датаграммы</p>

Сборка фрагментированной датаграммы выполняется хостом-получателем. Отдельные части такой датаграммы могут прибывать в произвольном порядке. Когда в точке назначения появляется первый фрагмент, IP выделяет определенную область памяти для последующей сборки всей датаграммы. Поле смещения фрагмента указывает на байтовую границу для данных полученного фрагмента.

Совпадающие по полям идентификации, IP-адреса источника, IP-адреса назначения и протокола фрагменты составляются вместе по мере их поступления. Однако в протоколе IP имеется небольшой недостаток: хост получателя не может узнать общей длины датаграммы, пока не получит последний фрагмент. Поле общей длины (Total Length) содержит сведения только о данном фрагменте, а не об общей длине датаграммы.

Таким образом, система-получатель должна иметь возможность предвидеть, сколько именно буферного пространства нужно зарезервировать для принимаемой датаграммы. Разработчики решают эту проблему различными способами. Некоторые последовательно выделяют для буфера небольшие части памяти, другие сразу предоставляют единый большой буфер.

В любом случае при реализации необходимо обслуживать поступающую датаграмму с общей длиной, как минимум, в 576 октетов. Или, что более точно, система должна быть способна обрабатывать датаграммы с общим размером не менее чем MTU интерфейса, по которому поступают датаграммы.

<p>6.14.5 Тайм-аут сборки датаграммы</p>

Рассмотрим следующую последовательность событий:

■ Пересылается датаграмма.

■ Пославший ее процесс аварийно завершается.

■ Датаграмма фрагментируется при пересылке.

■ По пути следования теряется один из фрагментов.

При потере отправленного фрагмента хост получателя должен ждать, пока этот фрагмент не будет отправлен повторно. При этом, разумеется, необходимо ограничить время ожидания. Когда тайм-аут сборки завершится, хост назначения отбросит уже полученные фрагменты и отправит источнику сообщение об ошибке. Обычно величину тайм-аута сборки можно конфигурировать. Ее значение рекомендуется устанавливать в диапазоне от 60 до 120 с.

Перейти на страницу:

Похожие книги