Типы взаимодействия (unicast, multicast, anycast), формат 128-битного адреса, типы адресов (global unicast, unique local, link-local) и способы генерации Interface ID.
Сколько адресов разных типов обычно имеет один интерфейс в IPv6?
Могут ли unique local адреса (fd00::/8) использоваться для доступа в интернет?
Как распознать адрес, сгенерированный методом Modified EUI-64?
Что такое Subnet-router anycast адрес?
Что определяют lifetime-параметры IPv6-адреса (preferred и valid)?
Какие три типа взаимодействия существуют в IPv6?
Эта серия посвящена работе протокола IPv6 в целом. Мы не будем вникать в детали, а проговорим, как происходит взаимодействие: что случается, когда мы пытаемся отправить пакет, какие адреса будут использоваться.
Для начала вспомним, что широковещательных рассылок (broadcast) в IPv6 больше нет. То, что в IPv4 были broadcast-ы, в IPv6 как класс отсутствует. Все, что можно было сделать с помощью broadcast, можно сделать и с помощью multicast.
В IPv4 multicast приделали потом, сбоку. На самом деле был протокол IPv5, который рассказывал про то, как должен выглядеть multicast. IPv4 изначально был unicast-овый, а IPv5 изначально был multicast-овый. Потом взяли, объединили: наработки рабочей группы IPv5 сказали — вот вам адресное пространство класса D, вот вы там и веселитесь. И multicast приехал в IPv4.
В IPv6 multicast является частью стандарта. Его не сбоку сделали, а он прямо основной. Основное взаимодействие в IPv6 — одно из двух: unicast или multicast. Третий тип — anycast.
При unicast вы используете одноадресную передачу: указываете единственный адрес, отправляете пакет, и говорите — ровно один участник, ровно тот, которому я это написал, должен это получить. Примерно как если бы вы отправляли письмо Иванову Василию Петровичу и указывали его паспорт — тогда только тот, кто обладает таким паспортом, сможет такой пакет получить.
Если вы используете multicast, или многоадресную передачу на группу, то вы отправляете пакет и указываете, что заранее не знаете, кто его должен получить, но определяете признак, по которому получатель должен обрабатывать содержимое. Например, можно отправить IP-пакет на multicast-группу «все роутеры» или на группу «все получатели первого канала». Вы отправляете один пакет, а его получают сразу несколько абонентов, но не все.
В IPv4 multicast-группа «вообще все» была 224.0.0.1, но она изначально была придумана как часть отдельного протокола и в IPv4 вошла позже. Поэтому есть узлы IPv4, которые multicast не поддерживают, и трафик на 224.0.0.1 такие узлы могут не обрабатывать. А в IPv6 группа «вообще все» в пределах канала, в пределах организации или даже в пределах интернета — это штатная часть протокола.
Многоадресную передачу можно проиллюстрировать следующей аналогией. Вы идете по улице и видите на входе в подъезд объявление: «Дорогие жители первого этажа, пожалуйста, завесьте двери в ваших квартирах, потому что мы будем красить этаж». Через этот подъезд может пройти много разных жителей разных этажей, но жители первого этажа поймут — это им. Они прочитают сообщение и обработают содержимое. Жители второго этажа «зажмурятся» и пройдут мимо — это не им.
Multicast экономит полосу при отправке данных. Типичный пример — телевещание. У вас есть источник трафика, сервер какого-то телеканала. Для отправки трафика всем слушателям есть два варианта:
Multicast-пакеты могут маршрутизироваться. Роутер понимает, что у него есть слушатели multicast-группы за одним интерфейсом и за другим, делает копии и рассылает. Вы отправляете один пакет, а каждый получатель, даже если он не в одной сети с отправителем, получит свою копию.
Маршрутизация multicast — это отдельная большая тема. В рамках нашего курса мы её затрагивать не будем. Основные сценарии работы multicast — это интернет-телевидение и приложения, использующие multicast для передачи данных многим абонентам.
В anycast-взаимодействии (альтернативная передача) вы отправляете IPv6-пакет, и он доставляется до единственного получателя — примерно как unicast. Но тот IP-адрес, который принадлежит получателю, принадлежит ещё и некоторым другим узлам. У нескольких узлов один и тот же IP-адрес, вы отправляете пакет, и он доставляется ровно до одного участника — ближайшего.
В IPv4 такое взаимодействие было, но оно было пристёгнуто сбоку — не являлось частью стандарта. В IPv6 anycast является частью стандарта.
Для чего полезен anycast? Например, для уменьшения времени реакции. У вас есть пачка DNS-серверов, и вы хотите нащупать ближайший. Отправляете пакет на хорошо известный адрес DNS-сервера, и сеть доставляет его до ближайшего сервера.
Почему нельзя сделать то же самое с multicast? Потому что в multicast все получают копию пакета. Если отправлять DNS-запросы multicast-ом на пачку серверов, все серверы получат запрос и все начнут отвечать. Вам вернётся пачка ответов, а вам достаточно одного.
Anycast очень похож на unicast, за одним исключением: в unicast каждый адрес должен принадлежать ровно одному узлу, а в anycast адрес может принадлежать нескольким узлам, но трафик всегда будет ходить именно на один. Anycast использует подмножество unicast-адресов, поэтому их сходство не случайно.
В отличие от IPv4, в IPv6 нормальная ситуация — когда на интерфейсе живёт целая пачка IP-адресов. На узле может быть несколько интерфейсов, на каждом интерфейсе может быть несколько адресов. Адрес назначается именно на интерфейс, а не на машину.
Unicast-адреса должны быть уникальными в пределах какой-то части сети:
По стандарту все адреса, кроме link-local, обязаны быть уникальными в пределах всей сети.
В IPv4 были публичные и частные адреса. Публичные гарантированно уникальные в интернете, потому что использовался механизм, при котором IANA раздавала пачки адресов региональным регистраторам, те — локальным регистраторам, те — провайдерам, провайдеры — абонентам. Каждый уровень следил за тем, чтобы адреса не пересекались.
В IPv6 некоторые адреса будут назначаться так же — через IANA, региональных и локальных регистраторов. А некоторые адреса можно взять случайным образом, и за счёт того, что адресное пространство очень рыхлое, вы можете быть относительно уверены, что случайно придуманные адреса ни у кого больше не встретятся.
Классический пример проблемы неуникальных адресов — покупка Instagram компанией Facebook. У них были пересекающиеся адресные пространства (одинаковые частные сети), и при объединении сетей возникли серьёзные проблемы.
Адрес IPv6 имеет размер 128 бит. Это в 4 раза длиннее IPv4-адреса. Записываются IPv6-адреса в шестнадцатеричном виде: 8 групп по 4 шестнадцатеричных цифры, разделённых двоеточиями.
Полный вид IPv6-адреса:
2001:0db8:b16b:00b5:0000:0000:0000:0001
IPv6-адрес — это просто число. Кстати, в IPv4 не было стандартного способа записи адреса, а в IPv6 — есть, и он именно такой.
Если группа начинается с нулей, ведущие нули в каждой группе можно опустить. Если группа полностью нулевая (0000), её можно сократить до одного нуля (0).
2001:0db8:b16b:00b5:0000:0000:0000:0001
↓
2001:db8:b16b:b5:0:0:0:1
Восстановить полную запись легко: для каждой группы добиваем нулями слева до 4 разрядов.
Не более чем в одном месте адреса несколько нулевых групп подряд (именно несколько, не одну) можно заменить символом :: (двойное двоеточие).
2001:db8:b16b:b5:0:0:0:1
↓
2001:db8:b16b:b5::1
Для восстановления полной записи считаем, сколько групп есть (в примере — 5), определяем, скольких не хватает до 8 (трёх), и вставляем недостающие нулевые группы на место ::.
Не надо пугаться длинных адресов. Длинные адреса — это хорошо: адресов много, и проблем IPv4, связанных с недостатком адресов, в IPv6 нет.
Как и в IPv4, адрес делится на две части:
| Часть | Описание |
|---|---|
| Network ID (левая) | Общая для всех узлов в канале |
| Interface ID (правая) | Уникальный идентификатор интерфейса в канале |
В IPv4 правая часть называлась Host ID, но это было не совсем корректно — она была уникальна для интерфейса, а не для хоста. В IPv6 название стало правильным: Interface ID.
Граница задаётся маской (префиксом). Например:
2001:db8:b16b:b5::1/64
Левые 64 бита — Network ID (4 группы по 16 бит), правые 64 бита — Interface ID.
В большинстве случаев для конечных абонентов используются /64 сети. Это рекомендация, а не обязательное требование, но некоторые механизмы IPv6 хорошо работают именно с /64.
Если назначать /64 на все каналы — это не всегда эффективно. Например, на point-to-point каналах (туннели, PPP, GRE) допустимо использовать /127 сети — по аналогии с /31 масками в IPv4 (RFC 3031). Изначально авторы IPv6 хотели везде использовать /64, но сетевые администраторы попросили разрешить /127 для point-to-point линков, и IETF согласилась.
Можно использовать и /128 маску — например, на loopback-интерфейсах.
Запись вида 2001:db8::/32 означает: все IP-адреса, у которых левые 32 бита совпадают с 2001:0db8, относятся к этой сети.
В IPv4 была целая сеть 127.0.0.0/8 для loopback — огромная /8-я сетка, целиком не задействованная. В IPv6 loopback-адрес ровно один:
::1/128
Если нужно запускать несколько приложений на разных адресах для себя — используйте multicast.
Адрес :: (128 нулевых бит) используется, когда узел не знает своего адреса. Например, при взаимодействии с DHCPv6, когда вы хотите получить адрес, пакет отправляется с адреса источника ::.
Global unicast — адреса, маршрутизируемые в интернете. Полный аналог публичных адресов IPv4. Начинаются с битов 001, то есть с 2000::/3.
Если вы видите адрес, начинающийся на 2 или 3 (в hex) — он глобальный unicast, маршрутизируемый в интернете.
| Уровень | Типичная маска | Описание |
|---|---|---|
| IANA → RIR | /23 (и крупнее) | Региональные интернет-регистраторы (RIPE, ARIN и др.) |
| RIR → LIR | /32 | Локальные интернет-регистраторы (крупные провайдеры) |
| LIR → Клиент (юрлицо) | /48 или /56 | Конечные клиенты-организации |
| Клиент → Канал | /64 | Конечные канальные сети |
| LIR → Физлицо | /64 | Конечный абонент |
Изначально клиентам выдавали /48 (65 536 подсетей /64), но IANA затянула гайки и рекомендовала /56 (256 подсетей /64). Этого более чем достаточно для большинства сценариев.
Структура global unicast адреса (пример с /64):
| RIR | LIR | Клиент | Subnet | Interface ID |
| /23 | /32 | /48 | /64 | 64 бита |
Такая иерархия позволяет агрегировать маршруты: клиент анонсирует свою /56, LIR — свой /32 блок, RIR — свой /23. По первым битам адреса можно определить, какому региональному регистратору он принадлежит.
Unique local адреса — аналог частных адресов из RFC 1918 в IPv4 (сети 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16). Их можно использовать без согласования с IANA.
Блок: fc00::/7, который делится на две части:
| Блок | Статус |
|---|---|
fc00::/8 |
Зарезервирован под управляемые IANA адреса. По факту не используется — IANA так и не запустила этот механизм |
fd00::/8 |
Используется. Адреса генерируются самостоятельно |
Для генерации ULA по RFC нужно:
fdПо факту все на это кладут болт и берут красивую сетку, например fd00::/64, потому что эти адреса всё равно не выходят в интернет.
Пример красивого ULA-адреса:
fd00::1
Короче, чем практически любой адрес IPv4, и легко запоминается.
В IPv6 NAT нет. Эти адреса нельзя выпустить в интернет. В IPv4 можно было «занатить» частные адреса, в IPv6 — нельзя. Если вы из-под ULA-адреса отправите пакеты в интернет, провайдер их зарежет.
Если нужен и ULA, и доступ в интернет — назначайте на интерфейс два адреса: один unique local, другой global unicast. Это нормальная ситуация в IPv6 — на одном интерфейсе целая пачка адресов.
При взаимодействии IPv6 автоматически выбирает нужный адрес источника:
Link-local адреса — адреса, уникальные только в пределах канала. Не маршрутизируются вообще.
Блок: fe80::/10, но на практике всегда fe80::/64.
В IPv4 был похожий механизм — APIPA (Automatic Private IP Addressing), сеть 169.254.0.0/16. Если DHCP-сервер не отвечал, узлы автоматически придумывали себе адреса из этой сети. Но в IPv4 это был пристёгнутый сбоку механизм, а в IPv6 — штатный.
Особенности link-local адресов:
Поскольку link-local адреса могут совпадать в разных каналах, при работе с ними нужно указывать интерфейс (zone index) через символ %:
ping fe80::1%GigabitEthernet0/1ping fe80::1%8 (номер интерфейса)Используются для служебных задач: протоколы динамической маршрутизации (OSPF, EIGRP), обнаружение соседей и т.д. — взаимодействие между узлами, гарантированно находящимися в одном канале.
Как минимум на любом IPv6-интерфейсе будет link-local адрес. Если нужна маршрутизация — добавляется global unicast (и, возможно, unique local).
Сетка fec0::/10 — адреса, маршрутизируемые в пределах сайта. Deprecated с 2004 года. Тем не менее до сих пор всплывают в некоторых реализациях, в частности Windows использует site-local адреса для DNS.
Пример: fec0:0:0:ffff::1%1
Использовать не нужно.
Правые 64 бита адреса (при /64 сети) — Interface ID. Можно назначить вручную, но удобнее, когда узлы придумывают их сами.
Зарезервированные значения:
Самая простая схема. Берётся MAC-адрес (EUI-48, 48 бит) и превращается в 64-битный идентификатор:
FF:FE (16 бит)Смысл инверсии U/L бита: если MAC-адрес заводской (U/L = 0), то Modified EUI-64 получается «некрасивый». Если MAC назначен вручную (U/L = 1), то после инверсии бит становится 0, и IPv6-адрес получается более компактным и красивым.
Пример для заводского MAC 78:84:3C:EB:4F:C7:
MAC: 78:84:3C:EB:4F:C7
Разделили: 78:84:3C | EB:4F:C7
Вставили FFFE: 78:84:3C:FF:FE:EB:4F:C7
Флип U/L бита: 78 → 7A (0111 1000 → 0111 1010)
Modified EUI-64: 7A:84:3C:FF:FE:EB:4F:C7
Характерный признак EUI-64 — токен FF:FE на границе 6-й и 7-й групп адреса. Если видите его — скорее всего, адрес сгенерирован по Modified EUI-64.
Для получения полного IPv6-адреса Modified EUI-64 приклеивается к Network ID:
Сеть: 2001:db8:b16b:b5::/64
+ EUI-64: 7a84:3cff:feeb:4fc7
= Адрес: 2001:db8:b16b:b5:7a84:3cff:feeb:4fc7
Если MAC-адреса нет (например, serial link с PPP), можно взять:
Все multicast-адреса входят в блок ff00::/8. Видите адрес, начинающийся с ff — это multicast.
FF [флаги][scope] : [идентификатор группы — 112 бит]
| Значение | Область | Описание |
|---|---|---|
| 1 | Interface-local | В пределах интерфейса (аналог 127.0.0.0/8) |
| 2 | Link-local | В пределах канала (не маршрутизируется, аналог 224.0.0.0/24) |
| 4 | Admin-local | В пределах сайта (административная граница) |
| 5 | Site-local | В пределах сайта |
| 8 | Organization-local | В пределах организации |
| E | Global | В пределах интернета |
Scope для unicast-адресов:
| Тип адреса | Scope |
|---|---|
| Link-local | 2 (канал) |
| Unique local | 8 (организация) |
| Global unicast | E (интернет) |
| Адрес | Описание | Аналог в IPv4 |
|---|---|---|
ff02::1 |
Все узлы в пределах канала | 224.0.0.1 |
ff02::2 |
Все маршрутизаторы в пределах канала | 224.0.0.2 |
ff02::5 |
OSPF | 224.0.0.5 |
ff02::6 |
OSPF DR | 224.0.0.6 |
При работе IPv6 поверх Ethernet:
Для получения Ethernet MAC из multicast IPv6-адреса:
Префикс: 33:33 (16 бит)
+ последние 32 бита IPv6-адреса
Пример:
IPv6: ff02::1
MAC: 33:33:00:00:00:01
Преимущество: не нужно заранее узнавать MAC для multicast — он вычисляется из IPv6-адреса.
В IPv4 anycast был пристёгнут сбоку (использовалась сетка 192.88.99.0/24). В IPv6 anycast — полноценная часть протокола.
Механизм работы: несколько узлов получают один и тот же IPv6-адрес, а сеть доставляет пакеты до ближайшего. Обратно ответы идут unicast-ом.
Самый первый адрес в /64 сети (Interface ID = все нули) — это subnet-router anycast-адрес. Например, fd00:: в сети fd00::/64. Его можно назначить одному роутеру или нескольким — тогда трафик клиентов будет направляться на ближайший.
Для предотвращения конфликтов при anycast нужно отключить DAD (Duplicate Address Detection) на соответствующих интерфейсах.
Все динамически назначенные адреса имеют жизненный цикл:
[Создание] → DAD → Tentative → Preferred → Deprecated → Invalid
Если маршрутизатор повторно присылает анонс (Router Advertisement) с указанием той же сети:
Если анонсы прекращаются — адрес проходит через deprecated и становится invalid.
2000::/3) — для интернетаfd00::/8) — для внутренних сетей, NAT нетfe80::/64) — для канала, генерируется автоматическиВ следующем разделе разберём устройство заголовка IPv6, его сходства и различия с IPv4.