Пакет 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
Заголовок расширения «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 бита | Значение для идентификации пакета, генерируемое отправителем для восстановления |
Полезная нагрузка
Фиксированный и дополнительные заголовки 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].
Примечания
- ↑ 1 2 3 4 5 6 7 8 9 10 11 12 13 RFC 8200: Internet Protocol, Version 6 (IPv6) Specification (англ.). IETF (июль 2017). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 2474: Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers (англ.). IETF (декабрь 1998). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 3260: New Terminology and Clarifications for Diffserv (англ.). IETF (апрель 2002). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ 1 2 3 RFC 4727: Experimental Values In IPv4, IPv6, ICMPv4, ICMPv6, UDP, and TCP Headers (англ.). IETF (ноябрь 2006). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 6437: IPv6 Flow Label Specification (англ.). IETF (ноябрь 2011). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ Use of the IPv6 Flow Label as a Transport-Layer Nonce to Defend Against Off-Path Spoofing Attacks. IETF Internet-Draft. Дата обращения: 24 июня 2024. Архивировано 13 октября 2015 года.
- ↑ 1 2 3 RFC 2675: IPv6 Jumbograms (англ.). IETF (август 1999). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 1726: Technical Criteria for Choosing IP: The Next Generation (IPng) (англ.). IETF (декабрь 1994). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 7401: Host Identity Protocol Version 2 (HIPv2) (англ.). IETF (апрель 2015). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 5533: Shim6: Level 3 Multihoming Shim Protocol for IPv6 (англ.). IETF (июнь 2009). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ 1 2 RFC 3692: Assigning Experimental and Testing Numbers Considered Useful (англ.). IETF (январь 2004). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ Internet Protocol Version 6 (IPv6) Parameters: Routing Types (англ.). IANA. Дата обращения: 24 июня 2024. Архивировано 24 июня 2024 года.
- ↑ Philippe Biondi, Arnoud Ebalard. IPv6 Routing Header Security (англ.). EADS (апрель 2007). Дата обращения: 24 июня 2024. Архивировано 13 марта 2020 года.
- ↑ RFC 5095: Deprecation of Type 0 Routing Headers in IPv6 (англ.). IETF (декабрь 2007). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 1992: The Nimrod Routing Architecture (англ.). IETF (август 1996). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 6554: RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks (англ.). IETF (март 2012). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 8754: IPv6 Segment Routing Header (SRH) (англ.). IETF (мар 2020). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 4302: IP Authentication Header (англ.). IETF (декабрь 2005). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 4303: IP Encapsulating Security Payload (ESP) (англ.). IETF (декабрь 2005). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 7112: Implications of Oversized IPv6 Header Chains (англ.). IETF (январь 2014). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 7113: Implementation Advice for IPv6 Router Advertisement Guard (RA-Guard) (англ.). IETF (февраль 2014). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.
- ↑ RFC 6980: Security Implications of IPv6 Fragmentation with IPv6 Neighbor Discovery (англ.). IETF (август 2013). Дата обращения: 24 июня 2024. Архивировано 24 января 2024 года.