Маршрутизатор границы потока — многоадресная передача IPv6

1. Введение

608c4c35050eb280.png

Что такое нить?

Thread — это протокол беспроводной ячеистой сети с низким энергопотреблением на основе IP-протокола, обеспечивающий безопасную связь между устройствами и между устройствами и облаком. Сети Thread могут адаптироваться к изменениям топологии, чтобы избежать отказов в одной точке.

Что такое OpenThread?

OpenThread, выпущенный компанией Google, — это реализация Thread® с открытым исходным кодом.

Что такое пограничный маршрутизатор OpenThread?

OpenThread Border Router (OTBR), выпущенный Google, представляет собой реализацию Thread Border Router с открытым исходным кодом.

Многоадресная рассылка IPv6

Thread определяет ряд функций для поддержки многоадресной рассылки в гетерогенной сети (Thread и сегменты сети Wi-Fi/Ethernet) для многоадресных адресов с областью действия, превышающей локальную область (realm local).

Маршрутизатор Thread Border Router регистрирует свой набор данных Backbone Router (BBR), и выбранная служба BBR — это Primary Backbone Router (PBBR), который отвечает за пересылку входящих/исходящих многоадресных сообщений.

Устройство Thread отправляет сообщение CoAP для регистрации многоадресного адреса в PBBR (Multicast Listener Registration, сокращенно MLR), если адрес превышает локальный диапазон. PBBR использует MLDv2 на своем внешнем интерфейсе для связи с более широкой сетью IPv6 LAN/WAN о группах многоадресной рассылки IPv6, которые ему необходимо прослушивать, от имени своей локальной сети Thread. И PBBR пересылает многоадресный трафик в сеть Thread только в том случае, если на адрес назначения подписано хотя бы одно устройство Thread.

Для минимальных по количеству потоков конечных устройств (Thread Minimal End Devices) они могут полагаться на своего родительского устройства, которое будет агрегировать многоадресный адрес и выполнять MLR от их имени, или зарегистрироваться самостоятельно, если их родительское устройство относится к потоку 1.1.

Для получения более подробной информации, пожалуйста, обратитесь к Спецификации резьбы .

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

В этом практическом задании вы настроите маршрутизатор Thread Border Router и два устройства Thread, а затем включите и проверите функции многоадресной рассылки на устройствах Thread и устройствах Wi-Fi.

Что вы узнаете

  • Как собрать прошивку для nRF52840 с поддержкой многоадресной рассылки IPv6.
  • Как подписаться на многоадресные IPv6-адреса на устройствах Thread.

Что вам понадобится

  • Рабочая станция под управлением Linux для сборки и прошивки Thread RCP, интерфейса командной строки OpenThread и тестирования многоадресной рассылки IPv6.
  • Raspberry Pi для маршрутизатора Thread Border.
  • 2 USB-адаптера Nordic Semiconductor nRF52840 (один для RCP и два для концевых устройств Thread).

2. Настройка OTBR

Самый быстрый способ настроить OTBR — следовать руководству по настройке OTBR .

После завершения настройки OTBR используйте ot-ctl , чтобы убедиться, что OTBR в течение нескольких секунд стал основным магистральным маршрутизатором.

> bbr state
Primary
Done
> bbr
BBR Primary:
server16: 0xF800
seqno:    21
delay:    5 secs
timeout:  3600 secs
Done

3. Сборка и прошивка устройств Thread.

Соберите CLI-приложение Thread с поддержкой многоадресной рассылки и прошейте две платы nRF52840 DK.

Сборка прошивки nRF52840 DK

Следуйте инструкциям, чтобы клонировать проект и собрать прошивку для nRF52840.

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_MLR=ON

Продолжайте выполнение инструкций из руководства по созданию сети Thread с использованием плат nRF52840 и OpenThread . После прошивки конечного устройства образом CLI выполните действия по подключению второго узла к сети Thread , чтобы добавить устройство Thread в сеть Thread. Повторите эти действия для второго конечного устройства Thread.

4. Подпишитесь на многоадресный IPv6-адрес.

Подпишитесь на канал ff05::abcd на конечном устройстве nRF52840 1:

> ipmaddr add ff05::abcd
Done

Убедитесь, что ff05::abcd успешно подписан:

> ipmaddr
ff05:0:0:0:0:0:0:abcd            <--- ff05::abcd subscribed
ff33:40:fdde:ad00:beef:0:0:1
ff32:40:fdde:ad00:beef:0:0:1
ff02:0:0:0:0:0:0:2
ff03:0:0:0:0:0:0:2
ff02:0:0:0:0:0:0:1
ff03:0:0:0:0:0:0:1
ff03:0:0:0:0:0:0:fc
Done

Подпишитесь на ff05::abcd на ноутбуке:

Нам нужен скрипт на Python subscribe6.py для подписки на многоадресный адрес на ноутбуке.

Скопируйте приведенный ниже код и сохраните его как subscribe6.py :

import ctypes
import ctypes.util
import socket
import struct
import sys

libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')

Запустите subscribe6.py , чтобы подписать ff05::abcd на сетевой интерфейс Wi-Fi (например, wlan0):

$ sudo python3 subscribe6.py wlan0 ff05::abcd
Subscribed ff05::abcd on interface wlan0.
Press ENTER to quit.

Ниже представлена ​​окончательная топология сети с многоадресными подписками:

b118448c98b2d583.png

Теперь, когда мы подписали многоадресный IPv6-адрес на устройстве nRF52840 End Device 1 в сети Thread и на ноутбуке в сети Wi-Fi, в следующих разделах мы проверим двустороннюю доступность многоадресной рассылки IPv6.

5. Проверка входящего многоадресного IPv6-трафика

Теперь мы должны иметь возможность связаться как с устройством nRF52840 End Device 1 в сети Thread, так и с ноутбуком, используя многоадресный IPv6-адрес ff05::abcd из сети Wi-Fi.

Пинг ff05::abcd на OTBR через Wi-Fi-интерфейс:

$ ping -6 -b -t 5 -I wlan0 ff05::abcd
PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!)
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!)
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!)

# If using MacOS, use this command. The interface is typically not "wlan0" for Mac.
$ ping6 -h 5 -I wlan0 ff05::abcd

Мы видим, что OTBR может получить два ответа на ping как от конечного устройства nRF52840 1, так и от ноутбука, поскольку оба устройства подписаны на ff05::abcd . Это показывает, что OTBR может пересылать многоадресные пакеты запроса ping по IPv6 из сети Wi-Fi в сеть Thread.

6. Проверка исходящей многоадресной рассылки IPv6.

Пинг ff05::abcd на конечном устройстве nRF52840 2:

> ping ff05::abcd 100 10 1
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms

Устройство nRF52840 End Device 2 может принимать ответы на ping-запросы как от устройства nRF52840 End Device 1, так и от ноутбука. Это показывает, что OTBR может пересылать многоадресные пакеты ответов на ping-запросы IPv6 из сети Thread в сеть Wi-Fi.

7. Поздравляем!

Поздравляем, вы успешно настроили маршрутизатор Thread Border Router и подтвердили двунаправленную многоадресную рассылку IPv6!

Для получения дополнительной информации об OpenThread посетите сайт openthread.io .

Справочная документация: