20. Сеть. Протокол IPv6

IPv6

IPv6 является заменой IPv4, и очень схож по общим принципам и архитектуре. Основное отличие – адрес записывается не в 32 битах, а в 128. Это эффективно расширяет адресное пространство с 4.2 миллиардов до 340 тысяч децилионов (i.e. 3.4 1038). Это не такое космическое число, как может показаться: число атомов на Земле 1,3-1,4 1050, в наблюдаемой вселенной, например, не менее 4 1079 атомов, а оценочное минимальное количество неповторяющихся шахматных партий (число Шеннона) – 10118. Тем не менее, это довольно много и истощить этот диапазон в ближайшую пару десятков лет вряд ли удастся.

Кроме увеличения диапазона, IPv6 добавляет функции, отсутствовавшие в IPv4. Упрощаются некоторые аспекты присвоения адресов узлам, роуминг между сетями и перенумерование сетей. Упрощается обработка пакетов маршрутизаторами за счет переноса ответственности за фрагментацию пакетов на конечные узлы. Мультикаст встроен в протокол (в отличие от IPv4, в котором это было опциональное расширение). В протокол так же включены наработки IPsec. Расширение адресного пространства так же приводит к возможности иерархической адресации сетей, что ограничивает рост таблиц маршрутизации.

Основной недостаток IPv6 в отсутствии обратной совместимости. По сути, сети IPv6 существуют отдельно и параллельно сетям IPv4, хотя и существуют механизмы миграции, такие как 6to4, 6in4 и Teredo.

В адресе IPv6 адрес узла имеет фиксированную длинну 64 бита, соответственно оставшиеся 64 используются для идентификации сети. В результате, фактическое использование адресного пространства будет слабо насыщеным – вряд ли найдется такая сеть, которая использует все 18 квинтиллионов (1018) возможных адресов. Однако по идее, это должно упростить аггрегацию сетей в топологические блоки, а не как сейчас.

Адреса IPv6

IPv6-адрес записывается в шестнадцатиричном представлении. Пары октетов разделяются двоеточиями. Например, 2001:0db8:de54:3da5:00f7:1235:9ae7:0001. Внутри пары, ведущие нули могут быть опущены. Например, предыдущий адрес может быть записан как 2001:db8:de54:3da5:f7:1235:9ae7:1. Так же в целях упрощения записи используется техника сокращения нулей. Любая последовательность идущих подряд пар, состоящих из нулей сокращается до ::. Например, адрес 2001:db8:0:0:0:0:0:1 можно сократить до 2001:db8::1. Это относится так же к последней паре: адрес 2001:db8:0:0:0:0:0:0 сокращается до 2001:db8::. Эта нотация, однако, зарезервирована для обозначения всей сети целиком, т.е. адрес узла не может быть строго равен нулю.

:: не используется для сокращения одной пары. То есть, 2001:db8:1:1:1:1:0:1 не сокращается до 2001:db8:1:1:1:1::1.

Адреса IPv6 делятся на три категории:

  • unicast – адреса с единственным получателем
  • anycast – пакет доставляется на хотя бы один (обычно топологически ближайший) узел с таким адресом
  • multicast – пакет доставляется всем узлам с этим адресом

Широковещательные запросы в IPv6 не поддерживаются. Их заменяет особая группа мультикаст-адресов ff02::1.

Формат unicast и anycast адресов

Обобщенный адрес имеет следующий формат:

48-64 бита
префикс маршрутизации
0-16 бит
идентификатор подсети
64 бита
идентификатор узла

Идентификатор узла может быть полуичен из MAC-адреса сетевой карты, выбран случайно, присвоен вручную либо центральным сервером (по DHCPv6).

Для обозначения длины префикса маршрутизации, используется та же нотация, что и для обозначения префикса сети в IPv4. То есть, 2001:db8:/48 означает, что для идентификации подсети используется 16 бит, а 2001:db8:/64 – что есть только одна подсеть с таким префиксом. Эта нотация так же используется для обозначения размеров блоков адресов.

Обобщенные адреса в целом являются глобально-адресуемыми. Существует так же категория адресов, адресуемых только внутри физической локальной сети. Префикс маршрутизации для таких сетей устанавливается длиной 64 бита и имеет вид fe80::/64. Эффективно это означает, что адрес состоит из 10 бит префикса, 54 нулей и 64 бит адреса узла.

Специальные unicast-адреса IPv6

Неопределенный адрес ::/128
Не должен быть присвоен, маршрутизован или вообще исползован, кроме как для указания приложению, что адрес текущего узла неизвестен. Фактически используется для настройки приложения на использование всех адресов.
Маршрут по умолчанию ::/0
Используется для указания маршрута по умолчанию для unicast-адресов.
Физически локальные адреса
::1/128 локальный хост. Аналог 127.0.0.1/8 в IPv4.
fe80::/10(64) локальная сеть. Формально, используется сеть с префиксом /10, однако определена для использования только нулевая подсеть, что эффективно уменьшает диапазон применимых адресов до fe80::/64. Эти адреса обязательно должны быть сконфигурированы на любом IPv6-интерфейсе.
Логически локальные адреса

Аналог частных сетей IPv4. Выделен диапазон fc00::/7. При этом фактически используется пока только fd00::/8, внутри которого случайным образом выбирается префикс /48 и используется в качестве сети. Случайный выбор нужен для того, чтобы в случае слияния сетей, использующих подобную адресацию, вероятность коллизии адресов была минимальна.

Для сети ::fc00/8 процедура выбора не определена, поэтому ее использование фактически зарезервировано.

Переходные адреса (с v4)
::ffff:0:0/96 префикс отображения IPv4 на IPv6. Позволяет использовать в приложениях только поддержку IPv6, и при этом обслуживать IPv4 адреса.

::ffff:0:0:0/96 используется безусловной трансляцией IP/ICMP (a.k.a. SIIT)

64:ff9b::/96 Используется для автоматической трансляции IPv4 в IPv6.

2002::/16 используется протоколом 6to4.

Адреса для особых целей 2001::/29 – 2001::1f8::/29

Зарезервировано. Из этого диапазона выделены следующие блоки:

  • 2001::/32 – для Teredo
  • 2001::2/48 – для тестирования производительности сетей (аналог 198.18.0.0/15 в IPv4)
  • 2001::20::/28 – ORCHIDv2. Немаршрутизируемые адреса, используемые в качестве криптографических идентификаторов.
Документация 2001:db8::/32
Зарезервирован для примеров и документации.
Отброс трафика 0100::/64
Используется в качестве “черной дыры” в некоторых технологиях фильтрации. Можно считать аналогом /dev/null

Мультикаст

Для мултикаста зарезервирован блок ff00::/8. При этом используется специальный формат адреса.

8 бит
префикс 11111111 = ff
4 бита
флаги. Флаг 0 зарезервирован.
4 бита

область применения. Ограничивает пересылку пакетов через маршрутизаторы.

  1. Зарезервировано
  2. Локальный интерфейс
  3. Локальная физическая сеть
  4. Локальный диапазон IPv4
  5. Локальный административный диапазон (локальный в логическом смысле, должен быть сконфигурирован)
  6. Географически локальная сеть
  7. N/A
  8. N/A
  9. Локальная сеть организации
  10. N/A
  11. N/A
  12. N/A
  13. N/A
  14. N/A
  15. Глобальный диапазон (может маршрутизоваться в глобальной сети)
  16. Зарезервировано
112 бит

Идентификатор группы. По сути идентифицирует используемый сервис. В частности:

  • 1 – все узлы локальной сети
  • 2 – все маршрутизаторы локальной сети
  • 101 – NTP

Фрагментация

IPv6 требует минимального MTU 1280 октетов. При этом, маршрутизаторы не поддерживают промежуточную фрагментацию, и следовательно, поле DF отсутствует.

Для передачи пакетов с большим MTU используется обнаружение MTU: пакет посылается с MTU подключенной сети. Если какой-то передаточный узел не может переслать пакет, он возвращает ICMPv6 сообщение “Пакет слишком велик” (тип 2), с нагрузкой в виде своего MTU. Эта процедура повторяется пока пакет не пройдет по всей цепи.

Некоторые маршрутизаторы блокируют ICMP-трафик во имя какой-то не вполне очевидной “безопасности”. Как следствие, описанный выше вариант не работает. Для таких случаев разработан протокол RFC 4821, который полагается на TCP или другой протокол транспортного уровня с гарантированной доставкой.

Аналогичные алгоритмы широко используются в реализациях IPv4 в целях оптимизации использования канала, так что фактически практически ничего не изменяется.

NDP

Для привязки к протоколу нижележащего (2-го) уровня, вместо ARP используется NDP. В данном протоколе, вместо широковещательного запроса, используются особые multicast-адреса. “Полезная нагрузка” является расширением ICMPv6 (который так же используется для пинга, трейса etc).

Используемые multicast-адреса в некотором смысле “прицельные”. Берутся последние 24 бита IPv6-адреса целевого узла, и добавляются к префиксу ff02::1:ff00:0/104. Принимающая сторона сравнивает последние биты группы и адреса и отбрасывает пакеты, не предназначеные ей. При использовании программируемых свитчей с поддержкой IPv6, это позволяет значительно уменьшить широковещательный трафик в сети.

Формат пакета

Пакет IPv6 имеет 40-байтный фиксированный заголовок, опциональный расширенный заголовок произвольной длины, и собственно “полезную нагрузку”.

Максимальная длина пакета – 65575 октетов (65535 октетов данных и 40 октетов заголовка). Так же существует расширение (т.н. Jumbogram), позволяющее указывать в расширенном заголовке 32-битную длину данных, что позволяет передавать пакеты размером до 4 Гб (минус 1 байт). В таких случаях длина пакета в основном заголовке указывается равной нулю.

Формат заголовка

Версия (4 бита)
Всегда 01102 = 610
Класс трафика (8 бит)
6 бит используются для кодирования сервиса и приоритезации трафика, 2 бита для ECN. Эквивалентно DSCP+ECN из IPv4
Метка потока (20 бит)
Изначально предпологалось использовать для приоритезации трафика, требующего реального времени. Фактически используется для того, чтобы маршрутизаторы использовали один и тот же путь для передачи пакетов с одинаковой меткой, дабы избежать изменения порядка следования.
Длина данных (16 бит)
Длина собственно данных, включая расширенные заголовки, в октетах.
Следующий заголовок (8 бит)
В отсутствие расширенных заголовков, идентификатор протокола, используемого в данных (такой же, как в IPv4). Иначе – идентификатор типа следующего расширенного заголовка.
Предел прыжков (8 бит)
Заменяет TTL. Уменьшается на 1 на каждом промежуточном маршрутизаторе.
Адрес источника (128 бит)

Целевой адрес (128 бит)

Расширенные заголовки

Каждый из расширенных заголовков начинается с 8-битного поля “Следующий заголовок”, что позволяет связывать их в цепочку. Сами расширенные заголовки могут содержать информацию о фрагментации данных, предпочитаемой маршрутизации, заголовки IPsec и т.п.

Следует заметить, что фрагментация данных необходима только в редких случаях, когда протокол более высокого уровня не может ограничить максимальный размер передаваемых данных. Так же следует заметить, что общая длина фрагментированного пакета не должна превышать 1500 октетов, поскольку принимающая сторона может отбрасывать фрагментированные пакеты большей длины (хотя и не обязана этого делать).