Перейти к содержанию

Групповые адреса IPv6 (multicast)

В IPv6 нет широковещательного адреса: всё, что в IPv4 слали на 255.255.255.255, здесь уходит в группу «все узлы канала» FF02::1 или в более узкую группу. Поэтому даже прошивка, которой multicast не нужен, обязана вступать в несколько групп — иначе не заработает Neighbor Discovery.

Обновлено Редакция GAW

Групповой адрес IPv6 (multicast address) — идентификатор группы интерфейсов, обычно на разных узлах; пакет с таким адресом назначения получают все члены группы. RFC 4291 (разд. 2) знает три типа адресов — unicast, anycast и multicast — и прямо говорит, что широковещательных адресов в IPv6 нет: их работу делает multicast. Интерфейс может состоять в любом числе групп, а multicast-адрес никогда не бывает адресом источника (разд. 2.7).

Формат

ПолеБитЗначение
Префикс811111111 — всё, что начинается с FF
Флаги 0RPT4T = 0 — постоянный адрес, назначенный IANA; T = 1 — временный; P и R определены в RFC 3306 и RFC 3956
Область (scop)41 interface-local, 2 link-local, 4 admin-local, 5 site-local, 8 organization-local, E global; 0 и F зарезервированы
Идентификатор группы112номер группы внутри области

Маршрутизатор не передаёт пакет за пределы области, указанной в адресе (разд. 2.7). Смысл постоянной группы от области не зависит: RFC приводит пример группы серверов NTP с идентификатором 101 — FF01::101 на том же узле, FF02::101 на том же канале, FF05::101 на сайте, FF0E::101 во всём интернете. Временные группы с T = 1, напротив, имеют смысл только внутри своей области.

Группы, которые нужны каждому узлу

  • FF02::1 — все узлы канала (есть и FF01::1 для одного интерфейса). Сюда маршрутизатор рассылает Router Advertisement.
  • FF02::2 — все маршрутизаторы канала (также FF01::2 и FF05::2 для сайта). Сюда хост шлёт Router Solicitation (RFC 4861 разд. 6.3.7).
  • FF02::1:FFxx:xxxx — solicited-node адрес: префикс FF02:0:0:0:0:1:FF00::/104 плюс младшие 24 бита unicast-адреса. Узел обязан вступить в такую группу для каждого своего адреса (разд. 2.7.1), потому что именно туда приходят Neighbor Solicitation при разрешении адреса и при проверке дубликатов во время SLAAC. Так запрос распределяется по 16 миллионам групп и не беспокоит весь сегмент, как ARP (RFC 4861 разд. 3.1).

Эти три группы — основа Neighbor Discovery; без них узел не получит ни префикса, ни адреса шлюза. Свои постоянные группы с областью канала есть у других служб: DHCPv6 использует ff02::1:2 для всех серверов и ретрансляторов, RPL — ff02::1a для всех узлов RPL, mDNS — свою группу для разрешения имён в локальной сети.

В прошивке

Стек вступает в группы ND сам, как только интерфейс получает link-local адрес. Прикладным группам нужно членство явно: в lwIP на ESP32 это опции UDP-сокета IPV6_JOIN_GROUP (он же IPV6_ADD_MEMBERSHIP) и IPV6_LEAVE_GROUP, выбор интерфейса IPV6_MULTICAST_IF и число переходов исходящих пакетов IPV6_MULTICAST_HOPS. Для пакета с областью link-local достаточно одного перехода: за пределы канала его всё равно не выпустят.

Частые вопросы

Что такое FF02::1 и FF02::2?

Постоянные группы из RFC 4291 (разд. 2.7.1): FF02::1 — все узлы IPv6 на канале, FF02::2 — все маршрутизаторы на канале. Цифра 2 во втором байте — область link-local, поэтому за пределы сегмента такой пакет не уйдёт. Хост шлёт Router Solicitation на FF02::2, маршрутизатор рассылает Router Advertisement на FF02::1. Есть и варианты с другой областью: FF01::1 — узлы одного интерфейса, FF05::2 — маршрутизаторы сайта.

Что такое solicited-node адрес?

Группа, которую узел образует из каждого своего unicast-адреса: к префиксу FF02::1:FF00::/104 приписываются младшие 24 бита адреса, например для 4037::01:800:200E:8C6C получается FF02::1:FF0E:8C6C (RFC 4291 разд. 2.7.1). Neighbor Solicitation уходит именно туда, а не всем узлам, и его обрабатывает почти только искомый узел: групп 2^24, совпадения младших 24 бит редки. Узел обязан вступить в такую группу для каждого своего адреса.

Как вступить в multicast-группу IPv6 на ESP32?

Через стандартные опции сокета, которые lwIP в ESP-IDF поддерживает для UDP-сокетов IPv6: IPV6_JOIN_GROUP (синоним IPV6_ADD_MEMBERSHIP) и IPV6_LEAVE_GROUP, интерфейс отправки — IPV6_MULTICAST_IF, число переходов для исходящих пакетов — IPV6_MULTICAST_HOPS. В группы Neighbor Discovery — все узлы и solicited-node — стек вступает сам.

Источники

  1. IETF. R. Hinden, S. Deering. IP Version 6 Addressing Architecture. RFC 4291, February 2006 — разд. 2: три типа адресов — unicast, anycast, multicast; широковещательных адресов в IPv6 нет, их функцию взял multicast; разд. 2.7: формат — 8 бит 11111111, 4 бита флагов 0RPT, 4 бита области (scop), 112 бит идентификатора группы; T = 0 — постоянный адрес, назначенный IANA, T = 1 — временный; области: 1 interface-local, 2 link-local, 4 admin-local, 5 site-local, 8 organization-local, E global, 0 и F зарезервированы; смысл постоянного адреса не зависит от области (пример FF01/FF02/FF05/FF0E::101 — серверы NTP на узле, канале, сайте, в интернете); multicast-адрес нельзя использовать как источник; маршрутизаторы не передают пакеты за пределы области; разд. 2.7.1: FF02::1 и FF01::1 — все узлы, FF02::2, FF01::2, FF05::2 — все маршрутизаторы; solicited-node адрес — младшие 24 бита unicast- или anycast-адреса к префиксу FF02:0:0:0:0:1:FF00::/104, пример 4037::01:800:200E:8C6C → FF02::1:FF0E:8C6C; узел обязан вычислить и вступить в такие группы для всех своих адресов
  2. IETF. T. Narten, E. Nordmark, W. Simpson, H. Soliman. Neighbor Discovery for IP version 6 (IPv6). RFC 4861, September 2007 — разд. 3: NS для разрешения адреса идёт на solicited-node адрес цели, ответ NA — unicast; разд. 3.1: запросы распределены по 16 миллионам (2^24) групповых адресов, узлы без IPv6 не отвлекаются; разд. 6.3.7: Router Solicitation отправляется на группу всех маршрутизаторов
  3. Espressif. ESP-IDF Programming Guide v6.1, ESP32: lwIP — разд. Socket Options, IPv6 Options: для multicast UDP-сокетов IPv6 поддерживаются IPV6_JOIN_GROUP / IPV6_ADD_MEMBERSHIP, IPV6_LEAVE_GROUP / IPV6_DROP_MEMBERSHIP, IPV6_MULTICAST_IF, IPV6_MULTICAST_HOPS
Страница помогла?

Нашли ошибку? ·