Господа, дамы, здравствуйте!
Напомню, что ранее мы разобрались с IP-адресами и, как мне кажется, разобрались. Теперь нужно поговорить о единицах измерения: массу мы измеряем в килограммах, длину в метрах, давления в паскалях, а вот фрагменты данных на сетевом уровне мы измеряем в пакетах, в общем случае фрагмент данных, передаваемый тем или иным протоколом, называется Protocol Data Unit или PDU, пакет это PDU в IP, пакет и будем разбирать.
Глобально IP-пакет состоит из двух частей: заголовка и поля данных, в которое помещается полезная для пользователей информация. В заголовке содержится вся необходимая служебная информация для обработки пакета узлами сети.
В поле данных помещаются данные, которые приходят с транспортного уровня, либо любого другого протокола, который хочет воспользоваться услугами IP. Список протоколов, который можно запихнуть внутрь пакета, легко найти (на вики, сайт IANA).
Ниже три структуры IP-пакета: первая устаревшая, вторая устаревшая, но переведена на рус-яз с ин-яза, третья актуальная.
Устаревшая структура IP-пакета
Актуальная структура заголовка в IP-пакете
Общего у них то, что пакет делится на ячейки, каждая ячейка имеет свой размер и свое имя, такая ячейка называется полем. Разница между представленными выше структурами в том, что в первых двух случаях есть поля Type of Service, но на самом деле это поле сейчас заменено на DSCP и ECN. Если говорить совсем просто, то поле ToS использовалось для того, чтобы узел мог отличить важный пакет от неважного и в первую очередь обрабатывать важные пакеты, а неважные уже по возможности. О DSCP и ECN поговорим ниже.
Важно понимать, что узлы ничего не знают ни о каких пакетах, пакет это лишь удобная абстракция для людей. Для компьютеров и роутеров это последовательность нулей и единиц. IP заголовок можно разбить на пять строк(если не считать опции, которые не обязательны) и длина каждой строки получится 32 бита или 4 байта, такая строка в RFC называется 32 битным словом. Поле заголовка не может начинаться на одном слове, а заканчиваться на другом.
Такой строгий подход к структуре заголовка не случаен, для себя я выделил две основные причины этого, которые в общем-то взаимосвязаны:
Сам IP размер пакетов считает не в битах или байтах, а в словах.
Процессоры сетевых узлов обрабатывают не байты или биты, а слова, если длина слова IP будет равна или кратна машинному слову процессора, то его будет проще обработать.
Кстати говоря, мы уже знаем размер типичного заголовка, он составляет 20 байт, т.к. у нас пять слов (если не считать поля с опциями) и каждое слово 4 байта.
Поля IP заголовка
Теперь разберемся с каждым полем в отдельности. Начнем с версии и размера заголовка.
Версия (Version)
Это версия протокола IP, под него выделено четыре бита, для протокола IPv4 здесь всегда неизменное значение – 4. Хочу заметить, что в IPv4 четверка не связана с количество октетов в IP-адресе, просто такое совпадение.
Размер заголовка (Internet Header Length)
Поле нужно, чтобы узел мог понять: где заканчивается заголовок и начинаются данные, т.к. поле опций не обязательное и их может быть больше чем одна. Под размер заголовка выделено четыре бита, значение данного поля это число, которое равно числу слов в заголовке. Понятно, что максимальное количество слов в заголовке равно пятнадцати.
DSCP и ECN
Под поле DSCP (Differentiated Services Code Point), выделено 6 бит, используется для разделения трафика на классы обслуживания.
Поле ECN (Explicit Congestion Notification) или указатель перегрузки имеет размер два бита. При помощи этого поля узлы могут сигнализировать о перегрузке. Не каждое устройство с этим полем умеет работать, сигнализация через ECN будет работать только в том случае, если узлы сети умеют его обрабатывать.
Размер пакета (Total Length)
Далее обсудим четыре поля, которые имеют отношение к размеру IP-пакета и его фрагментации, начнем с размера.
Это поле позволяет обрабатывающему устройству понять полный размер пакета, то есть заголовок + данные. Под поле выделено два байта, мы уже понимаем, что минимальный размер IP-пакета равен 20 байт, то есть это заголовок без опций и данных, а максимальный размер равен 65535 байт, это максимальное число, которое можно записать при помощи двух байт.
Идентификатор (Identification)
Чаще всего это поле используется в тех ситуация, когда пакет фрагментируется, чтобы принимающая сторона понимала, как из полученных кусочков правильно собрать пакет. У фрагментированных пакетов, которые являются частью одного целого, значение в этом поле должны быть одинаковыми.
Флаги (Flags)
Под флаги выделено три бита, используются для контроля над фрагментацией пакетов. Нумерация бит в поле начинается с нуля, крайний левый бит старший, а крайний правый – младший:
нулевой бит зарезервирован и должен быть всегда равен нулю;
если значение первого бита ноль, то допускается фрагментация пакетов, если единица (бит DF или Do not Fragment), то фрагментация запрещена и, если размер пакета при запрещенной фрагментации будет больше, чем разрешенный на канале, то такой пакет в канал отправлен не будет;
второй бит служит для того, чтобы конечные узлы понимали, где начинается последовательность фрагментированных пакетов, а где она заканчивается, если значение этого бита равно единице (MF More Fragments), то узел понимает, что этот пакет не последний и нужно ждать еще фрагментированные пакеты, чтобы собрать изначально разделенный пакет.
Поскольку тема фрагментации важная, то про нее будет отдельный пост и видео.
Смещение фрагмента (Fragment Offset)
Это поле используется в тех случаях, когда выполняется фрагментация пакетов, размер этого поля равен 13 бит. Об этом поле мы поговорим отдельно и детально, когда будем разбираться с фрагментацией пакетов.
Время жизни (Time to Live, TTL)
TTL имеет размер один байт или восемь бит, поле выполняет функцию защиты от петель маршрутизации. Благодаря TTL пакет не блуждает по сети до бесконечности в ситуациях, когда из-за неверной конфигурации роутеров произошла петля маршрутизации. TTL это число от 0 до 255, это число определяет максимально допустимое число узлов, через которое может пройти пакет, перед тем, как он будет уничтожен.
Время жизни для пакета задается узлом источником и изначально оно измерялось в секундах (то есть максимально возможное время жизни IP пакета раньше было 255 секунд), современные маршрутизаторы обрабатывают пакеты гораздо быстрее, чем за секунду, поэтому сейчас TTL – это значение, которое определяет число транзитных узлов, которые может пройти пакет, прежде чем он будет уничтожен.
Протокол (Protocol)
Под поле выделено 8 бит, поле использует узел получатель, чтобы понять какому процессу передать данные, когда IP-заголовок будет снят. В данное поле записывается код протокола, который был помещен отправителем в IP-пакет, коды регламентированы и их можно найти на сайте IANA.
Контрольная сумма заголовка (Header Checksum)
Под поле выделено два байта и как понятно из названия: протокол IP не имеет механизма проверки целостности данных, поскольку поле «контрольная сумма заголовка» не учитывает поле данных при проверке. Не забываем, что TTL меняется от узла к узлу, а это значит, что и контрольная сумма будет меняться от узла к узлу, то есть каждый транзитный маршрутизатор сперва принимает IP-пакет, вычисляет его контрольную сумму, сравнивает со значением, записанным в поле «контрольная сумма заголовка», затем изменяет поле TTL, вычисляет новую контрольную сумму и отправляет пакет следующему соседу.
Стоит отметить, что если значение контрольной суммы, которую посчитал узел, отличается от контрольной суммы, которая записана в пакете, то он просто уничтожается.
IP-адрес источника
Поле IP-адрес источника имеет размер 32 бита и не изменяется при передаче пакета по сети (если не рассматриваем ситуации с NAT), это поле важно для узла получателя, чтобы знать кому отвечать.
IP-адрес назначения
Данное поле имеет размер четыре байта, в него записывается IP-адрес узла, которому данный пакет предназначен, роутеры смотрят на этот поле при принятии решения о том куда направлять пакет.
Поле данных в IP-пакете
Поле данных в IP-пакете служит контейнером для других протоколов, которым IP оказывает услуги транспорта. Если учитывать, что максимально возможный размер IP-пакета 65535 байт, то максимально возможный размер поля данных 65515 байт.
Поле опций
С большой долей вероятности вы либо не будете использовать опции, либо будете пользоваться ими очень редко, поскольку для штатной передачи трафика опции обычно не используются, поэтому и останавливаться на них сейчас не буду, для самых любознательных дам ссылку.
Структура IP-пакета с опциями Record Route
Если кому интересно, то выше показана структура пакета с опциями Record Route.
Вопросы для ваших ответов
В конце каждого поста обычно стараюсь придумать несколько вопросов, но к данной теме как-то не очень получается, здесь в основном была справочная информация на запоминание.
Видео версия
А вот видео версия у нас есть в наличии, кому больше нравится смотреть - смотрите.