נתב Thread-Border – IPv6 Multicast

1. מבוא

608c4c35050eb280.png

מה זה Thread?

‫Thread הוא פרוטוקול רשת אלחוטית מבוסס-IP שצורכת מעט חשמל, ומאפשרת תקשורת מאובטחת בין מכשירים ובין מכשירים לענן. רשתות Thread יכולות להתאים את עצמן לשינויים בטופולוגיה כדי להימנע מכשל בנקודה אחת.

מה זה OpenThread?

OpenThread שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread®.

מה זה OpenThread Border Router?

OpenThread Border Router‏ (OTBR) שפורסם על ידי Google הוא הטמעה בקוד פתוח של נתב גבולות עם פרוטוקול Thread.

IPv6 Multicast

פרוטוקול Thread מגדיר סדרה של תכונות לתמיכה בשידור מרובה כתובות ברשת הטרוגנית (פרוטוקול Thread ופרוטוקול Wi-Fi/פרוטוקול Ethernet) לכתובות של שידור מרובה כתובות עם היקף גדול יותר מהיקף מקומי.

נתב גבול של Thread רושם את מערך הנתונים של נתב הרשת המרכזי (BBR), ושירות ה-BBR שנבחר הוא נתב הרשת המרכזי הראשי (PBBR), שאחראי על העברה של נתונים נכנסים ויוצאים בשיטת Multicast.

מכשיר Thread שולח הודעת CoAP כדי לרשום את כתובת השידור לקבוצה ל-PBBR (רישום מאזינים לשידור לקבוצה, MLR בקיצור) אם הכתובת גדולה יותר מהכתובת המקומית של התחום. פרוטוקול PBBR משתמש ב-MLDv2 בממשק החיצוני שלו כדי לתקשר עם רשת ה-LAN/WAN הרחבה יותר של IPv6 לגבי קבוצות מולטיקאסט של IPv6 שהוא צריך להאזין להן, בשם רשת ה-Thread המקומית שלו. בנוסף, PBBR מעביר תנועת שידור לקבוצה לרשת Thread רק אם לפחות מכשיר Thread אחד רשום ליעד.

במכשירי קצה מינימליים של Thread, יכול להיות שהם יסתמכו על ההורה שלהם כדי לצבור את כתובת ה-Multicast ולבצע MLR בשמם, או שהם יירשמו בעצמם אם ההורה שלהם הוא Thread 1.1.

פרטים נוספים זמינים במפרט של שרשור.

מה תפַתחו

ב-codelab הזה תגדירו נתב גבולות לפרוטוקול Thread ושני מכשירי Thread, ואז תפעילו ותאמתו תכונות של מולטיקאסט במכשירי Thread ובמכשירי Wi-Fi.

מה תלמדו

  • איך ליצור קושחה של nRF52840 עם תמיכה ב-IPv6 Multicast.
  • איך נרשמים לכתובות מולטיקאסט של IPv6 במכשירי Thread.

מה נדרש

  • תחנת עבודה של Linux, ליצירה ולהפעלה של Thread RCP,‏ OpenThread CLI ובדיקה של IPv6 multicast.
  • ‫Raspberry Pi לנתב הגבולות עם פרוטוקול Thread.
  • ‫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 ואיך מעבירים אליהם נתונים

מפתחים את אפליקציית Thread CLI באמצעות Multicast ומעדכנים את שני לוחות nRF52840 DK.

Build nRF52840 DK firmware

פועלים לפי ההוראות כדי לשכפל את הפרויקט וליצור קושחה של nRF52840.

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

ממשיכים עם המדריך המעשי ליצירת רשת Thread באמצעות לוחות nRF52840 ו-OpenThread כמו שהוא כתוב. אחרי שמבצעים Flashing למכשיר הקצה עם תמונת ה-CLI, פועלים לפי השלבים שבקטע הצטרפות לצומת השנייה ברשת Thread כדי להוסיף את מכשיר Thread לרשת Thread. חוזרים על הפעולה במכשיר הקצה השני של Thread.

4. הרשמה לכתובת IPv6 Multicast

Subscribe to ff05::abcd on nRF52840 End Device 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 multicast גם במכשיר הקצה nRF52840 1 ברשת Thread וגם במחשב הנייד ברשת ה-Wi-Fi, נבדוק את יכולת ההגעה (reachability) של IPv6 multicast דו-כיוונית בקטעים הבאים.

5. אימות של Multicast ב-IPv6 של אימייל נכנס

עכשיו אמורה להיות לנו אפשרות להגיע גם למכשיר הקצה nRF52840 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 יכול לקבל שתי תשובות פינג גם ממכשיר הקצה nRF52840 מספר 1 וגם מהמחשב הנייד, כי שניהם נרשמו ל-ff05::abcd. אפשר לראות ש-OTBR יכול להעביר את חבילות הנתונים של בקשת הפינג של IPv6 מהרשת של Wi-Fi לרשת Thread.

6. אימות של Multicast יוצא ב-IPv6

Ping ff05::abcd on nRF52840 End Device 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 יכול לקבל תשובות לפינג גם ממכשיר הקצה nRF52840 End Device 1 וגם מהמחשב הנייד. אפשר לראות ש-OTBR יכול להעביר חבילות multicast של תשובות פינג IPv6 מרשת Thread לרשת Wi-Fi.

7. מזל טוב

מזל טוב! הגדרתם בהצלחה נתב גבולות לפרוטוקול Thread ואימתתם שידור מרובה כתובות IPv6 דו-כיווני.

מידע נוסף על OpenThread זמין באתר openthread.io.

מסמכי עזר: