IPv4

Материал из Викиконспекты
Перейти к: навигация, поиск

IPv4 (англ. Internet Protocol version 4) — четвёртая версия интернет протокола (IP). Описан в IETF в статье RFC 791 (сентябрь 1981 года). Это один из самых используемых интернет протоколов. Был введен в использование в ARPANET в 1983 году.

Функция протокола — передавать дейтаграммы по множеству соединенных сетей.

Структура пакета[править]

Рассмотрим формат IPv4-дейтаграмм.

Дейтаграмма состоит из заголовка и основной части (данных). Биты передаются слева направо и сверху вниз (big-endian порядок). В настоящее время ясно, что лучше было бы использовать обратный (little-endian) порядок, но во время создания протокола это не было очевидно. Так на Intel x86 требуется программное преобразование, как при передаче, так и при приеме.

Рассмотрим структуру заголовка:

IPv4 Header Format
0 1 2 3
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Версия IHL Дифференциальное обслуживание (Тип службы) Полная длина
Идентификатор Флаги Смещение фрагмента
Время жизни Протокол Контрольная сумма заголовка
IP-адрес источника
IP-адрес назначения
Опции Остаток
  • Версия: 4 бита
    • Поле Версия содержит версию протокола, к которому принадлежит пакет. В случае IPv4 это 4.
  • IHL: 4 бита
    • Поле IHL (англ. Internet Header Length) содержит длину заголовка (в нем указано число 32 -разрядных слов). Следовательно, оно указывает на начало данных. Минимальное значение длины равно 5 . Максимальное — 15, что соответствует заголовку длиной 60 байт. Так, максимальный размер необязательного поля равен 40 байтам.
  • Дифференциальное обслуживание (Тип службы): 8 битов
    • Изначально это поле называлось Тип службы. По спецификации оно предназначено для различения классов обслуживания. Но поскольку никто не знал, что с ним делать, оно много лет не использовалось. Теперь, когда появилось дифференцированное обслуживание, ему нашли другое применение. Первые 6 бит задают класс обслуживания (DSCP), а в последние 2 помещаются явные уведомления о перегруженности (ECN).
  • Полная длина: 16 бит
    • Поле Полная длина содержит длину всей дейтаграммы, включая как заголовок, так и данные. Минимальная длина равна 20 байтам. Максимальное допустимое значение равно 65535 байт. Такие длинные дейтаграммы непрактичны для большинства хостов и сетей. Так, все хосты должны уметь принимать дейтаграммы до 576 байтов. Рекоммендуется отправлять дейтаграммы большего размера, только если есть уверенность, что принимающая сторона сможет их обработать.
  • Идентификатор: 16 бит
    • Идентификатор позволяет хосту-получателю определить какому пакеты принадлежат полученные им фрагменты. Все фрагменты одного пакета содержат одно и то же значение идентификатора.
  • Флаги: 3 бита
    • Бит 0: зарезервированное значение, должны быть равно 0.
    • Бит 1 (DF): Не фрагментировать (англ. Don't Fragment). 0 — можно фрагментировать, 1 — нельзя. Также может использоваться при определении путевого значения MTU, которое равно максимальному размеру пакета, передаваемого по пути без фрагментации. Пометив этот бит, отправитель гарантирует, что либо дейтаграмма дойдет единым блоком, либо отправитель получит сообщение об ошибке.
    • Бит 2 (MF): Продолжение следует (англ. More Fragments). 0 — в последнем фрагменте, 1 — в предыдущих.
  • Смещение фрагмента: 13 битов
    • Это поле указывает положение фрагмента в исходном пакете. Длина всех фрагментов в байтах должна быть кратна 8 (кроме последнего). Позволяет (2^13−1)×8=65528 байт смещения, что превышает максимальный размер пакета.
  • Время жизни: 8 битов
    • Поле Время жизни (TTL, англ. Time To Live) представляет собой счетчик, ограничивающий время жизни пакета. По спецификации он отсчитывает время в секундах, таким образом допуская максимальное время жизни пакета в 255 с. На каждом маршрутизаторе значение должно уменьшаться как минимум на единицу плюс время стояния в очереди. Но на практике этот счетчик считает количество переходов черех маршрутизаторы. Когда значение равно 0, пакет отвергается, а отправителю отсылается сообщение ICMP Time Exceeded. Таким образом удается избежать вечного странствования пакетов.
  • Протокол: 8 битов
    • Это поле указывает, какому процес транспортного уровня передать этот пакет, например TCP, UDP, ICMP. Присвоенные номера протоколов можно найти на сайте IANA.
  • Контрольная сумма заголовка: 16 бит
    • Это поле хранит контрольную сумму только заголовка. Так как некоторые поля меняются (например, TTL), то оно пересчитывается на каждом транзитивном участке. Используется следующий алгоритм: складываются все 16-разрядные полуслова заголовка в дополнительном коде, преобразуя результат также в дополнительный код. Таким образом проверяемая получателем контрольная сумма заголовка (вместе с этим полем) должна быть равна нулю. Более подробно алгоритм описан в RFC 1071.
  • IP-адрес источника: 32 бита.
  • IP-адрес получателя: 32 бита.
  • Опции: переменная длина
    • В начале поля всегда располагается однобайтный идентификатор. Иногда за ним может располагаться также однобайтное поле длины, а затем один или несколько информационных байтов. Размер этого поля должен быть кратен 4 байтам. Поле опции имеет следующий формат:
      • 1 бит — флаг копирования. Показывает, если опция скопирована во все фрагменты.
      • 2 бита — класс опции. Могут быть следующие классы: 0 — control, 2 — debugging и измерение, 1 и 3 — зарезервированы на будущее.
      • 5 бит — номер опции.
    • Приведем примеры опций:
      • Безопастность — указывет уровень секретности дейтаграммы. Но на практике все его игнорируют.
      • Строгая маршрутизация от источника — задает полный путь следования дейтаграммы.
      • Свободная маршрутизация от источника — задает список маршрутизаторв, которыенельзя миновать.
      • Запомнить маршрут — требует от всех маршрутизаторов добавлять свой IP-адрес.
      • Временной штамп — требует от всех маршрутизаторв добавлять свой IP-адрес и текущее время.
    • Обычно маршрутизаторы либо игнорируют опции, либо обрабатывают неэффективно, отодвигая в стороны как нечто необычное.
  • Остаток (Padding): переменная длина
    • Часть из нулей, гарантирующая, что длина заголовка заканчивается на 32 бите.