Посмотреть исходный код на GitHub
Давайте посмотрим, как Thread идентифицирует каждое устройство в сети и какие типы адресов они используют для связи друг с другом.
Области применения

В сети Thread существует три области действия для одноадресной адресации:
- Link-Local — все интерфейсы доступны по одной радиопередаче.
- Mesh-Local — все интерфейсы доступны в пределах одной сети Thread.
- Глобальный — все интерфейсы, доступные извне сети Thread.
Первые две области видимости соответствуют префиксам, заданным сетью Thread. Для Link-Local используются префиксы fe80::/16 , а для Mesh-Local — префиксы fd00::/8 .
Unicast
Для идентификации одного устройства Thread существует несколько одноадресных IPv6-адресов. Каждый из них выполняет свою функцию в зависимости от области применения и сценария использования.
Прежде чем подробно рассматривать каждый тип, давайте узнаем больше об одном распространенном типе, называемом локатором маршрутизации (RLOC). RLOC идентифицирует интерфейс Thread на основе его местоположения в топологии сети.
Как генерируется локатор маршрута
Всем устройствам присваиваются идентификатор маршрутизатора (Router ID) и идентификатор дочернего устройства (Child ID). Каждое родительское устройство ведет таблицу всех своих дочерних устройств, комбинация которых однозначно идентифицирует устройство в топологии. Например, рассмотрим выделенные узлы в следующей топологии, где число в расширителе сетки (пятиугольник) — это идентификатор маршрутизатора, а число в конечном устройстве (круг) — это идентификатор дочернего устройства:

Идентификатор маршрутизатора каждого дочернего узла соответствует его родительскому узлу (расширителю сетки). Поскольку расширитель сетки не является дочерним узлом, идентификатор дочернего узла для расширителя сетки всегда равен 0. Вместе эти значения уникальны для каждого устройства в сети Thread и используются для создания RLOC16, который представляет собой последние 16 бит RLOC.
Например, вот как рассчитывается значение RLOC16 для верхнего левого узла (идентификатор маршрутизатора = 1 и идентификатор дочернего узла = 1):

RLOC16 является частью идентификатора интерфейса (IID), который соответствует последним 64 битам IPv6-адреса. Некоторые IID могут использоваться для идентификации некоторых типов интерфейсов потоков. Например, IID для RLOC всегда имеет следующий вид:
0000:00ff:fe00:RLOC16
Идентификатор узла (IID) в сочетании с префиксом Mesh-Local Prefix определяет количество строк кода (RLOC). Например, при использовании префикса Mesh-Local Prefix fde5:8dba:82e1:1::/64 , количество строк кода для узла, у которого RLOC16 = 0x401 будет следующим:

Аналогичную логику можно использовать для определения количества строк кода (RLOC) для всех выделенных узлов в приведенной выше схеме топологии:

Однако, поскольку значение RLOC зависит от местоположения узла в топологии, значение RLOC узла может изменяться по мере изменения топологии.
Например, узел 0x400 может быть удален из сети Thread. Узлы 0x401 и 0x402 устанавливают новые связи с различными расширителями Mesh, и в результате каждому из них назначаются новые RLOC16 и RLOC:

Типы одноадресных адресов
RLOC — это лишь один из многих одноадресных IPv6-адресов, которые может иметь устройство Thread. Другая категория адресов называется идентификаторами конечных точек (EID), которые идентифицируют уникальный интерфейс Thread в сетевом разделе Thread. EID не зависят от топологии сети Thread.
Ниже подробно описаны распространенные типы одноадресной рассылки.
Локальный адрес канала (LLA) | |
|---|---|
| Идентификатор элемента (EID), который определяет интерфейс потока, доступный по одной радиопередаче. | |
| Пример | fe80::54db:881c:3845:57f4 |
| ИИД | На основе расширенного адреса 802.15.4 |
| Объем | Локальная ссылка |
| Подробности |
|
Локальный EID сетки (ML-EID) | |
|---|---|
| Идентификатор EID, который идентифицирует интерфейс Thread независимо от топологии сети. Используется для доступа к интерфейсу Thread в пределах одного и того же раздела Thread. Также называется уникальным локальным адресом (ULA). | |
| Пример | fde5:8dba:82e1:1:416:993c:8399:35ab |
| ИИД | Случайный, выбирается после завершения заказа. |
| Объем | Mesh-Local |
| Подробности |
|
Маршрутный локатор (RLOC) | |
|---|---|
| Идентифицирует интерфейс Thread на основе его расположения в топологии сети. | |
| Пример | fde5:8dba:82e1:1::ff:fe00:1001 |
| ИИД | 0000:00ff:fe00: RLOC16 |
| Объем | Mesh-Local |
| Подробности |
|
Anycast Locator (ALOC) | |
|---|---|
| Идентифицирует интерфейс потока с помощью поиска RLOC, когда RLOC целевого объекта неизвестен. | |
| Пример | fde5:8dba:82e1:1::ff:fe00:fc01 |
| ИИД | 0000:00ff:fe00:fc XX |
| Объем | Mesh-Local |
| Подробности |
|
Глобальный одноадресный адрес (GUA) | |
|---|---|
| Идентификатор элемента (EID), который идентифицирует интерфейс потока в глобальном масштабе, за пределами сети потоков. | |
| Пример | 2000::54db:881c:3845:57f4 |
| ИИД |
|
| Объем | Глобальный |
| Подробности |
|
Многоадресная рассылка
Многоадресная рассылка используется для одновременной передачи информации нескольким устройствам. В сети Thread определенные адреса резервируются для многоадресной рассылки с различными группами устройств в зависимости от области действия.
| IPv6-адрес | Объем | Доставлено в |
|---|---|---|
ff02::1 | Локальная ссылка | Все FTD и MED |
ff02::2 | Локальная ссылка | Все FTD |
ff03::1 | Mesh-Local | Все FTD и MED |
ff03::2 | Mesh-Local | Все FTD |
Вы можете заметить, что спящие конечные устройства (SED) не включены в приведенную выше таблицу многоадресной рассылки в качестве получателей. Вместо этого Thread определяет многоадресные IPv6-адреса на основе префикса одноадресной рассылки в локальной сети и в пределах области, используемые для всех узлов Thread, включая SED. Эти многоадресные адреса различаются в зависимости от сети Thread, поскольку она построена на основе префикса Mesh-Local (подробнее о многоадресных IPv6-адресах на основе префикса одноадресной рассылки см. в RFC 3306 ).
Для устройств Thread поддерживаются также произвольные области видимости, выходящие за рамки уже перечисленных.
Anycast
Anycast используется для маршрутизации трафика к интерфейсу Thread, когда RLOC назначения неизвестен. Anycast Locator (ALOC) определяет местоположение нескольких интерфейсов в пределах раздела Thread. Последние 16 бит ALOC, называемые ALOC16, имеют формат 0xfc XX , который обозначает тип ALOC.
Например, адрес ALOC16 в диапазоне от 0xfc01 до 0xfc0f зарезервирован для агентов DHCPv6. Если конкретный адрес RLOC агента DHCPv6 неизвестен (возможно, из-за изменения топологии сети), можно отправить сообщение на адрес ALOC агента DHCPv6 для получения адреса RLOC.
Поток определяет следующие значения ALOC16:
| ALOC16 | Тип |
|---|---|
0xfc00 | Лидер |
0xfc01 – 0xfc0f | Агент DHCPv6 |
0xfc10 – 0xfc2f | Услуга |
0xfc30 – 0xfc37 | Комиссар |
0xfc40 – 0xfc4e | Агент по поиску соседей |
0xfc38 – 0xfc3f0xfc4f – 0xfcff | Сдержанный |
Краткий обзор
Что вы узнали:
- Сеть Thread состоит из трех областей видимости: локальная (Link-Local), локальная (Mesh-Local) и глобальная (Global).
- Устройство Thread имеет несколько одноадресных IPv6-адресов.
- RLOC обозначает местоположение устройства в сети Thread.
- ML-EID — это уникальный идентификатор устройства Thread в пределах раздела, и его следует использовать приложениям.
- Поток использует многоадресную рассылку для пересылки данных группам узлов.
- Поток использует Anycast, когда значение RLOC целевого объекта неизвестно.
Чтобы узнать больше об адресации IPv6 в Thread, см. разделы 5.2 и 5.3 спецификации Thread .
Проверьте свое понимание
ff03::2 . Что это говорит нам об этом устройстве?ff03::2 . Они делают это в локальной области Mesh-сети.