Поле Полная длина содержит длину всей дейтаграммы, включая как заголовок, так и данные. Максимальная длина дейтаграммы 65 535 байт. В настоящий момент этот верхний предел достаточен, однако в будущем могут понадобиться дейтаграммы большего размера.
Поле Идентификатор позволяет хосту-получателю определить, какому пакету принадлежат полученные им фрагменты. Все фрагменты одного пакета содержат одно и то же значение идентификатора.
Следом идет один неиспользуемый бит, что достаточно странно, так как место в IP-заголовке принято использовать экономно. В качестве первоапрельской шутки Белловин (2003) предложил использовать его для обнаружения вредоносного трафика. Тогда обеспечить безопасность сети было бы гораздо проще: пакеты с таким «злым» битом можно было бы просто удалять, зная, что они отправлены злоумышленниками. К сожалению, безопасность не так проста.
Далее следуют два однобитных поля, относящиеся к фрагментации. Бит DF означает Don’t Fragment (Не фрагментировать). Это команда маршрутизатору, запрещающая ему фрагментировать пакет. Изначально предполагалось, что это поле будет помогать хостам, которые не могут восстановить пакет из фрагментов. Сейчас оно используется при определении путевого значения MTU, которое равно максимальному размеру пакета, передаваемого по пути без фрагментации. Пометив дейтаграмму битом DF, отправитель гарантирует, что либо дейтаграмма дойдет единым блоком, либо отправитель получит сообщение об ошибке.
Бит MF означает More Fragments (Продолжение следует). Он устанавливается во всех фрагментах, кроме последнего. По этому биту получатель узнает о прибытии последнего фрагмента дейтаграммы.
Поле Смещение фрагмента указывает положение фрагмента в исходном пакете. Длина всех фрагментов в байтах, кроме длины последнего фрагмента, должна быть кратна 8. Так как на это поле выделено 13 бит, максимальное количество фрагментов в дейтаграмме равно 8192, что дает максимальную длину пакета вплоть до пределов поля Полная длина. Поля Идентификатор, MF и Смещение фрагмента используются при реализации схемы фрагментации, описанной в разделе 5.5.5.
Поле Время жизни представляет собой счетчик, ограничивающий время жизни пакета. Предполагалось, что он будет отсчитывать время в секундах, таким образом, допуская максимальное время жизни пакета в 255 с. На каждом маршрутизаторе это значение должно было уменьшаться как минимум на единицу плюс время стояния в очереди. Однако на практике этот счетчик просто считает количество переходов через маршрутизаторы. Когда значение этого поля становится равным нулю, пакет отвергается, а отправителю отсылается пакет с предупреждением. Таким образом, удается избежать вечного странствования пакетов, что может произойти, если таблицы маршрутизаторов по какой-либо причине испортятся.
Собрав пакет из фрагментов, сетевой уровень должен решить, что с ним делать. Поле Протокол сообщит ему, какому процессу транспортного уровня передать этот пакет. Это может быть TCP, UDP или что-нибудь еще. Нумерация процессов глобально стандартизирована по всему Интернету. Номера протоколов вместе с некоторыми другими были сведены в RFC 1700, однако теперь доступна интернет-версия в виде базы данных, расположенной по адресу www.iana.org.
Поскольку заголовок содержит важную информацию (в частности, адрес), для ее защиты существует отдельное поле Контрольная сумма заголовка. Алгоритм вычисления суммы просто складывает все 16-разрядные полуслова заголовка в дополнительном коде, преобразуя результат также в дополнительный код. Таким образом, проверяемая получателем контрольная сумма заголовка (вместе с этим полем) должна быть равна нулю. Подобная контрольная сумма полезна для обнаружения ошибок, возникающих во время прохождения пакета по сети. Обратите внимание на то, что значение Контрольной суммы заголовка должно подсчитываться заново на каждом транзитном участке, так как по крайней мере одно поле постоянно меняется (поле Время жизни). Для ускорения расчетов применяются некоторые хитрости.
Поля Адрес отправителя и Адрес получателя указывают IP-адреса сетевых интерфейсов отправителя и получателя. Интернет-адреса будут обсуждаться в следующем разделе.
Поле Необязательная часть было создано для того, чтобы с появлением новых вариантов протокола не пришлось вносить в заголовок поля, отсутствующие в нынешнем формате. Оно же может служить пространством для различного рода экспериментов, испытания новых идей. Кроме того, оно позволяет не включать в стандартный заголовок редко используемую информацию. Размер поля Необязательная часть может варьироваться. В начале поля всегда располагается однобайтный идентификатор. Иногда за ним может располагаться также однобайтное поле длины, а затем один или несколько информационных байтов. В любом случае, размер поля Необязательная часть должен быть кратен 4 байтам. Изначально было определено пять разновидностей этого поля, перечисленных в табл. 5.5.
Читать дальше
Конец ознакомительного отрывка
Купить книгу