Пакет IPv6
Пакет IPv6 (англ. IPv6 packet) — это наименьшая единица сообщения, передаваемая с использованием шестой версии протокола Интернета (IPv6). Пакеты состоят из управляющей информации для адресации и маршрутизации, а также полезной нагрузки, содержащей пользовательские данные. Управляющая информация в пакетах IPv6 делится на обязательный фиксированный заголовок и необязательные заголовки расширений. Полезная нагрузка пакета IPv6 чаще всего представляет собой датаграмму или сегмент протокола более высокого, транспортного уровня, однако может представлять и данные для интернет-уровня — ICMPv6, или канального уровня — OSPF.
Описание
Пакеты IPv6 обычно передаются на канальном уровне по Ethernet или Wi-Fi, который инкапсулирует каждый пакет в кадр. Пакеты также могут быть переданы по протоколу туннелирования вышестоящего уровня, такому как IPv4 при использовании переходных технологий 6to4 или Teredo.
В отличие от IPv4, маршрутизаторы не фрагментируют пакеты IPv6, превышающие максимальную пропускную единицу — MTU; ответственность за это полностью лежит на исходящем узле. IPv6 устанавливает минимальное значение MTU в 1 280 октетов, однако хостам настоятельно рекомендуется использовать Path MTU Discovery для использования максимальных размеров пакетов возможных на маршруте[1].
С июля 2017 года Управление присвоением интернет-номеров — IANA, отвечает за регистрацию всех параметров IPv6, используемых в заголовках пакетов IPv6[1].
Фиксированный заголовок
Фиксированный заголовок начинает пакет IPv6 и имеет размер 40 октетов (320 битов)[1]. Байты многобайтовых полей располагаются в сетевом порядке байтов.
| Смещение (октеты) | Поле (бит) | ||
|---|---|---|---|
| 0 | Версия (4) | Класс трафика (8) | Метка потока (20) |
| 4 | Длина полезной нагрузки (16) | Следующий заголовок (8) | Лимит переходов (8) |
| 8 | Адрес источника (128) | ||
| 24 | Адрес назначения (128) |
- Версия (4 бита)
- Постоянное значение 6 (битовая последовательность 0110).
- Класс трафика (6+2 бита)
- Этот набор битов содержит два значения. Шесть старших бит содержат поле дифференцированных сервисов — DS, используемое для классификации пакетов[2][3]. Все стандартные DS-поля сейчас оканчиваются битом '0'. Любое поле DS, заканчивающееся двумя '1', предназначено для локального или экспериментального использования[4]. Два младших бита — для Explicit Congestion Notification (ECN). Приоритеты трафика делятся на диапазоны: трафик с контролем перегрузки от источника и трафик без контроля перегрузки.
- Метка потока (20 бит)
- Идентификатор с высокой энтропией для потока пакетов между источником и получателем. Например, поток TCP или медиапоток. Метка потока «0» означает, что пакет не принадлежит ни одному потоку. В старой схеме поток идентифицируется по адресам и портам источника и получателя и протоколу — значение последнего поля «Следующий заголовок»[5]. Также предлагалось использовать метку потока для обнаружения поддельных пакетов[6].
- Длина полезной нагрузки (16 бит)
- Размер полезной нагрузки в октетах, включая любые заголовки расширений. Значение устанавливается в ноль, если расширение Hop-by-Hop содержит опцию Jumbo Payload[7].
- Следующий заголовок (8 бит)
- Определяет тип следующего заголовка. Обычно указывает на транспортный протокол полезной нагрузки, либо указывает на следующий заголовок расширения. Значения разделены с аналогичным полем в IPv4.
- Лимит переходов (8 бит)
- Заменяет поле TTL в IPv4. Значение декрементируется на каждом промежуточном узле, и пакет удаляется при достижении нуля. Однако получающий узел должен обработать пакет даже с лимитом переходов, равным нулю.
- Адрес источника (128 бит)
- Уникаст-адрес IPv6 отправляющего узла.
- Адрес назначения (128 бит)
- Unicast- или мультикаст-адрес IPv6 получающего узла.
Для повышения производительности и с учётом того, что современные технологии канального уровня и транспортные протоколы обеспечивают достаточное обнаружение ошибок[8], заголовок не включает контрольную сумму[1]
Заголовки расширений
Заголовки расширений содержат дополнительную опциональную информацию интернет-уровня и располагаются между фиксированным заголовком и заголовком протокола вышестоящего уровня[1]. Заголовки расширений формируют цепочку, используя поле «Следующий заголовок». Поле «Следующий заголовок» фиксированного заголовка указывает тип первого заголовка расширения; в последнем заголовке расширения это поле определяет тип заголовка или протокола полезной нагрузки. Все заголовки расширений имеют размер, кратный 8 октетам; для этого некоторые из них требуют внутреннего дополнения нулями.
Существуют различные типы заголовков расширений, и новые типы могут появляться в будущем. Большинство заголовков расширений анализируется и обрабатывается только на узле-получателе. Расширение «Hop-by-Hop Options» может быть обработано и изменено промежуточными узлами и, если используется, всегда должно быть первым заголовком расширения. Все заголовки расширений опциональны и не должны повторяться более одного раза, за исключением «Destination Options», который может встречаться дважды[1].
Если узел не распознаёт конкретный заголовок расширения, он должен отбросить пакет и отправить сообщение «Parameter Problem» — ICMPv6, тип 4, код 1[1].
Ниже перечислены определённые заголовки расширений в рекомендуемом порядке для случая, если после фиксированного заголовка присутствует более одного заголовка расширения.
| Заголовок расширения | Значение поля «Следующий заголовок» | Описание |
|---|---|---|
| Hop-by-Hop Options | 0 | Опции, которые должны анализироваться всеми устройствами на пути |
| Routing | 43 | Методы указания маршрута для датаграммы (например, для Mobile IPv6) |
| Fragment | 44 | Содержит параметры для фрагментации пакетов |
| Authentication Header (AH) | 51 | Сведения, используемые для проверки аутентичности частей пакета |
| Encapsulating Security Payload (ESP) | 50 | Несёт зашифрованные данные для защищённого обмена |
| Destination Options (перед заголовком верхнего уровня) | 60 | Опции, которые должны анализироваться только получателем пакета |
| Mobility | 135 | Параметры, используемые с Mobile IPv6 |
| Host Identity Protocol | 139 | Используется для HIPv2[9]. |
| Shim6 Protocol | 140 | Используется для Shim6[10] |
| Зарезервировано | 253 | Для экспериментов и тестирования[4][11] |
| Зарезервировано | 254 | Для экспериментов и тестирования[4][11] |
Значение 59 («No Next Header») в поле «Следующий заголовок» указывает на отсутствие какого-либо следующего заголовка, включая заголовок верхнеуровневого протокола; с точки зрения заголовка, пакет IPv6 заканчивается немедленно после него: полезная нагрузка должна быть пуста. Однако, если поле «Длина полезной нагрузки» в первом заголовке пакета превышает длину заголовков расширений, в полезной нагрузке всё же могут оставаться данные. Эти данные должны игнорироваться конечными хостами, но передаваться маршрутизаторами без изменения[1].
Заголовок расширения «Hop-by-Hop Options» может быть обработан и изменён всеми узлами по пути пакета, включая отправителя и получателя. (Для аутентификации опции, меняющиеся в пути, игнорируются.) Заголовок «Destination Options» анализируется только узлом-получателем. Оба заголовка имеют минимальный размер 8 октетов; если опций больше, чем поместится за 8 октетов, блоки по 8 октетов с опциями и заполнением добавляются до полного представления всех опций.
| Поле | Длина | Описание |
|---|---|---|
| Следующий заголовок | 8 бит | Указывает тип следующего заголовка |
| Длина расширения | 8 бит | Длина этого заголовка в единицах по 8 октетов, не считая первых 8 октетов. |
| Опции и заполнение | переменная | Одна или более опций, а также необходимые для выравнивания поля заполнения. Опции кодируются по схеме TLV. |
Заголовок расширения «Routing» используется для задания одного или нескольких промежуточных узлов для прохождения пакета перед его доставкой назначению. Минимальный размер заголовка — 8 октетов; если для типа требуется больше данных, чем содержится в 4 октетах, дополнительные блоки по 8 октетов добавляются для размещения всех данных.[1]
| Поле | Длина | Описание |
|---|---|---|
| Следующий заголовок | 8 бит | Тип следующего заголовка |
| Длина расширения | 8 бит | Величина заголовка в 8-октетных блоках, не считая первых 8 байт |
| Тип маршрутизации | 8 бит | Значение 0–255, присваивается IANA[12]. |
| Сегментов осталось | 8 бит | Сколько узлов пакету ещё предстоит пройти до финального назначения |
| Специфические для типа данные | переменная | Зависит от типа маршрутизации |
Типы маршрутизации:
| Тип | Статус | Комментарий |
|---|---|---|
| 0 | Устаревший | Позволял простую, но опасную атаку отказа в обслуживании; устарел в 2007 и должен быть игнорирован[13].[14] |
| 1 | Устаревший | Использовался проектом Nimrod[15], устарел в 2009 году. |
| 2 | Разрешён | Ограниченная версия типа 0, используется для Mobile IPv6 |
| 3 | Разрешён | RPL Source Route Header[16] для сетей с низким энергопотреблением и потерями. |
| 4 | Разрешён | Segment Routing Header (SRH)[17] |
| 253 | Частное использование | Для тестов, не для реальных внедрений (RFC3692-style Experiment 1) |
| 254 | Частное использование | Для тестов, не для реальных внедрений (RFC3692-style Experiment 2) |
Чтобы отправить пакет, превышающий MTU пути, исходящий узел разбивает его на фрагменты. Заголовок расширения «Fragment» содержит всю необходимую для восстановления исходного пакета информацию[1]
| Поле | Длина | Описание |
|---|---|---|
| Следующий заголовок | 8 бит | Тип следующего заголовка |
| Зарезервировано | 8 бит | Ноль (зарезервировано) |
| Смещение фрагмента | 13 бит | Смещение в единицах по 8 октетов |
| Зарезервировано 2 | 2 бита | Зарезервировано, должны быть нули |
| Флаг M | 1 бит | 1 — есть ещё фрагменты; 0 — последний фрагмент |
| Идентификатор | 32 бита | Значение для идентификации пакета, генерируемое отправителем для восстановления |
Заголовки Authentication Header и Encapsulating Security Payload входят в состав IPsec и одинаково используются для IPv6 и IPv4.[18].[19]
Полезная нагрузка
Фиксированный и дополнительные заголовки IPv6 следуют перед «полезной нагрузкой верхнего уровня» — данными транспортного уровня, например, сегментом TCP или датаграммой UDP. Поле «Следующий заголовок» последнего заголовка IPv6 определяет тип данных в этом пакете.
Поле длины полезной нагрузки IPv6, как и у IPv4, имеет размер 16 бит, что позволяет указывать до 65 535 октетов. На практике максимальная пригодная для передачи нагрузка определяется с помощью Path MTU Discovery по минимальному MTU на всём пути передачи пакета. Большинство протоколов канального уровня поддерживают MTU значительно меньше 65 535 октетов.
Опциональная особенность IPv6 — опция «jumbo payload», реализуемая через заголовок расширения Hop-by-Hop[7], — позволяет передавать пакеты с полезной нагрузкой до одного октета менее 4 ГБ (232 − 1 = 4 294 967 295 октетов), используя 32-битное поле длины. Такие пакеты называются джамбограммами.
Поскольку и TCP, и UDP используют 16-битные поля — длина, указатель экстренных данных, поддержка джамбограмм IPv6 требует модификаций реализации транспортного уровня[7]. Джамбограммы актуальны только для каналов, где возможен MTU более 65 583 октетов — длина полезной нагрузки превышает 65535, плюс 40 байт фиксированного заголовка и 8 байт расширения Hop-by-Hop. Лишь немногие протоколы канального уровня способны обработать пакеты такого размера.
Фрагментация
В отличие от IPv4, маршрутизаторы IPv6 никогда не фрагментируют пакеты. Пакеты, превышающие MTU звена назначения, отбрасываются, и исходному узлу возвращается сообщение «Packet too big» (ICMPv6), аналогично методу IPv4 при выставленном флаге «Don't Fragment»[1] Конечные узлы должны использовать Path MTU Discovery для определения максимального размера пакета, а использование заголовка расширения «Fragment» допустимо только при невозможности такого ограничения на верхнем уровне.
Любой канал передачи, по которому передаются данные IPv6, обязан поддерживать передачу пакета размером минимум 1 280 байт; поэтому, чтобы избежать фрагментации и необходимости Path MTU Discovery, отправитель может ограничить пакеты этим размером.
Пакет, содержащий первый фрагмент исходного (большого) пакета, состоит из: заголовков для каждого фрагмента — важные исходные заголовки, повторяющиеся для каждого фрагмента, заголовка расширения Fragment с нулевым смещением, всех остальных оригинальных расширений, исходного заголовка верхнего уровня и части полезной нагрузки.[1] Каждый следующий пакет состоит из собственных заголовков, Fragment-заголовка и очередной порции исходной полезной нагрузки, определяемой смещением фрагмента.
Набор заголовков для каждого фрагмента определяется наличием «Routing» либо «Hop-by-Hop» расширения: если их нет, только фиксированный заголовок. Если есть «Routing», то все заголовки до и включая его; если есть «Hop-by-Hop Options» — фиксированный заголовок и данный заголовок.
В любом случае последний заголовок из этой серии имеет значение поля «Следующий заголовок» 44, что указывает на следующий Fragment-заголовок. Во всех Fragment-заголовках, кроме последнего, флаг M выставляется в 1 - фрагменты есть ещё, в последнем — в 0. Длина каждого фрагмента — кратна 8 октетам, кроме, возможно, последнего.
Так называемые раньше «нефрагментируемые части» исторически означали возможность фрагментации остальных заголовков; однако с 2014 года никакие заголовки больше не фрагментируются.[20].
Оригинальный пакет собирается получающим узлом по всем поступившим фрагментам, размещая их по указанным смещениям и отбрасывая заголовки Fragment. Фрагменты могут приходить в любом порядке и будут упорядочены узлом получателя.
Если не все фрагменты поступили в течение 60 секунд после первого фрагмента, сборка пакета отменяется и все хранящиеся фрагменты отбрасываются. Если первый фрагмент (с фиксированным заголовком) получен, но других не хватает, отправляется сообщение «Time Exceeded» — ICMPv6, тип 3, код 1, источнику.
Если при восстановлении обнаруживается, что один фрагмент перекрывает другой, сборка пакета прекращается и все фрагменты удаляются. Узел может игнорировать точные дубликаты фрагментов вместо того, чтобы считать их перекрывающими[1].
Получающие хосты должны пытаться собирать фрагментированные IP-датаграммы размером до 1 500 байт после сборки. Разрешается собирать и большие датаграммы, но также разрешается их молча удалять, если пакет после сборки превышает 1 500 байт. Поэтому отправителям не рекомендуется фрагментировать пакеты так, чтобы общий размер после сборки превышал 1 500 байт, если только они не уверены, что принимающий способен обработать такие пакеты.
Исследования показали, что фрагментация может быть использована для обхода средств сетевой безопасности. В 2014 году поэтому была запрещена практика размещения избыточно длинных цепочек заголовков IPv6 за пределами первого фрагмента. Кроме того, по результатам исследований методов обхода защиты Router Advertisement Guard,[21]. фрагментация для Neighbor Discovery устарела, а для Secure Neighbor Discovery её использование считается нежелательным[22].


