Thread Border Router - IPv6 Multicast, Thread Border Router - IPv6 Multicast

۱. مقدمه

608c4c35050eb280.png

نخ چیست؟

ترد (Thread) یک پروتکل شبکه مش بی‌سیم کم‌مصرف مبتنی بر IP است که ارتباطات امن دستگاه به دستگاه و دستگاه به ابر را امکان‌پذیر می‌کند. شبکه‌های ترد می‌توانند با تغییرات توپولوژی سازگار شوند تا از خرابی‌های تک نقطه‌ای جلوگیری کنند.

اوپن‌ترید چیست؟

OpenThread که توسط گوگل منتشر شده است، یک پیاده‌سازی متن‌باز از Thread® است.

روتر مرزی OpenThread چیست؟

روتر مرزی OpenThread (OTBR) که توسط گوگل منتشر شده است، یک پیاده‌سازی متن‌باز از روتر مرزی Thread است.

IPv6 چندپخشی

Thread مجموعه‌ای از ویژگی‌ها را برای پشتیبانی از چندپخشی در یک شبکه ناهمگن (بخش‌های Thread و شبکه Wi-Fi/Ethernet) برای آدرس‌های چندپخشی با دامنه بزرگتر از قلمرو محلی تعریف می‌کند.

یک روتر Thread Border مجموعه داده روتر Backbone (BBR) خود را ثبت می‌کند و سرویس BBR انتخاب شده، روتر Backbone اصلی (PBBR) است که مسئول ارسال/دریافت multicast است.

یک دستگاه Thread یک پیام CoAP برای ثبت آدرس چندپخشی به PBBR (ثبت شنونده چندپخشی، به اختصار MLR) ارسال می‌کند اگر آدرس بزرگتر از محدوده محلی باشد. PBBR از MLDv2 در رابط خارجی خود برای ارتباط با LAN/WAN گسترده‌تر IPv6 در مورد گروه‌های چندپخشی IPv6 که باید به آنها گوش دهد، به نمایندگی از شبکه Thread محلی خود استفاده می‌کند. و PBBR فقط در صورتی ترافیک چندپخشی را به شبکه Thread ارسال می‌کند که مقصد توسط حداقل یک دستگاه Thread مشترک شده باشد.

برای دستگاه‌های انتهایی با حداقل نخ (Thread Minimal End Devices)، ممکن است برای تجمیع آدرس چندپخشی و انجام MLR از طرف آنها به والد خود وابسته باشند، یا اگر والد آنها از نخ ۱.۱ باشد، خودشان ثبت نام کنند.

برای جزئیات بیشتر، لطفاً به مشخصات نخ مراجعه کنید.

آنچه خواهید ساخت

در این آزمایشگاه کد، شما یک روتر Thread Border و دو دستگاه Thread راه‌اندازی خواهید کرد، سپس ویژگی‌های Multicast را در دستگاه‌های Thread و دستگاه‌های Wi-Fi فعال و تأیید خواهید کرد.

آنچه یاد خواهید گرفت

  • نحوه ساخت میان‌افزار nRF52840 با پشتیبانی از IPv6 Multicast.
  • نحوه اشتراک در آدرس‌های چندپخشی IPv6 در دستگاه‌های Thread.

آنچه نیاز دارید

  • یک ایستگاه کاری لینوکس، برای ساخت و فلش کردن RCP Thread، رابط خط فرمان OpenThread و آزمایش IPv6 multicast.
  • یک رزبری پای برای روتر مرزی Thread.
  • دو دانگل USB از شرکت Nordic Semiconductor به شماره nRF52840 (یکی برای RCP و دو تا برای دستگاه‌های Thread-end).

۲. راه‌اندازی OTBR

سریع‌ترین راه برای راه‌اندازی OTBR، دنبال کردن راهنمای راه‌اندازی OTBR است.

پس از اتمام راه‌اندازی OTBR، ot-ctl برای تأیید اینکه OTBR در عرض چند ثانیه به روتر اصلی Backbone تبدیل شده است، استفاده کنید.

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

۳. ساخت و فلش کردن دستگاه‌های Thread

برنامه Thread CLI را با Multicast بسازید و دو برد nRF52840 DK را فلش کنید.

ساخت سیستم عامل nRF52840 DK

دستورالعمل‌ها را برای کلون کردن پروژه و ساخت میان‌افزار nRF52840 دنبال کنید.

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

با ساخت یک شبکه Thread با بردهای nRF52840 و OpenThread codelab همانطور که نوشته شده است ادامه دهید. پس از اینکه دستگاه نهایی با تصویر CLI فلش شد، گره دوم را به شبکه Thread متصل کنید تا دستگاه Thread به شبکه Thread اضافه شود. این کار را برای دستگاه نهایی Thread دوم تکرار کنید.

۴. در آدرس چندپخشی IPv6 مشترک شوید

مشترک شدن در ff05::abcd در nRF52840 دستگاه انتهایی ۱:

> 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 مشترک شوید:

برای اشتراک در یک آدرس چندپخشی روی لپ‌تاپ، به یک اسکریپت پایتون 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.')

برای ff05::abcd در رابط شبکه وای‌فای (مثلاً wlan0)، subscribe6.py اجرا کنید:

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

توپولوژی نهایی شبکه با اشتراک‌های چندپخشی در زیر نشان داده شده است:

b118448c98b2d583.png

اکنون که آدرس چندپخشی IPv6 را هم در دستگاه انتهایی nRF52840 1 در شبکه Thread و هم در لپ‌تاپ در شبکه Wi-Fi مشترک شده‌ایم، در بخش‌های بعدی قصد داریم قابلیت دسترسی چندپخشی IPv6 دو جهته را تأیید کنیم.

۵. تأیید ورودی IPv6 Multicast

اکنون، ما باید بتوانیم از طریق شبکه وای‌فای به هر دو دستگاه انتهایی nRF52840 در شبکه Thread و لپ‌تاپ با استفاده از آدرس چندپخشی IPv6 ff05::abcd دسترسی پیدا کنیم.

از طریق رابط وای‌فای، ff05::abcd را روی OTBR پینگ کنید:

$ 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 می‌تواند دو پاسخ پینگ را از هر دو دستگاه انتهایی nRF52840 و لپ‌تاپ دریافت کند، زیرا هر دو در ff05::abcd مشترک شده‌اند. این نشان می‌دهد که OTBR می‌تواند بسته‌های چندپخشی درخواست پینگ IPv6 را از شبکه Wi-Fi به شبکه Thread ارسال کند.

۶. تأیید خروجی IPv6 Multicast

پینگ ff05::abcd روی nRF52840 دستگاه انتهایی ۲:

> 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 2 می‌تواند پاسخ‌های پینگ را هم از دستگاه انتهایی nRF52840 1 و هم از لپ‌تاپ دریافت کند. این نشان می‌دهد که OTBR می‌تواند بسته‌های چندپخشی IPv6 Ping Reply را از شبکه Thread به شبکه Wi-Fi ارسال کند.

۷. تبریک

تبریک می‌گویم، شما با موفقیت یک روتر Thread Border راه‌اندازی کردید و IPv6 multicast دو جهته را تأیید کردید!

برای اطلاعات بیشتر در مورد OpenThread، به openthread.io مراجعه کنید.

اسناد مرجع: