Bộ định tuyến đường viền luồng – Đa hướng IPv6

1. Giới thiệu

608c4c35050eb280.png

Thread là gì?

Thread là một giao thức mạng lưới dạng mắt lưới không dây có công suất thấp dựa trên IP, cho phép giao tiếp an toàn giữa các thiết bị và giữa thiết bị với đám mây. Mạng Thread có thể thích ứng với các thay đổi về cấu trúc liên kết để tránh các lỗi tại một điểm duy nhất.

OpenThread là gì?

OpenThread do Google phát hành là một bản triển khai nguồn mở của Thread®.

Bộ định tuyến biên OpenThread là gì?

Bộ định tuyến biên OpenThread (OTBR) do Google phát hành là một cách triển khai nguồn mở của Bộ định tuyến biên sử dụng giao thức Thread.

IPv6 Multicast

Thread xác định một loạt tính năng để hỗ trợ truyền tin đa hướng trên một mạng không đồng nhất (các phân đoạn mạng Thread và Wi-Fi/Ethernet) cho các địa chỉ truyền tin đa hướng có phạm vi lớn hơn phạm vi cục bộ.

Bộ định tuyến biên của luồng đăng ký Tập dữ liệu Bộ định tuyến xương sống (BBR) và dịch vụ BBR đã chọn là Bộ định tuyến xương sống chính (PBBR), chịu trách nhiệm chuyển tiếp đầu vào/đầu ra đa hướng.

Thiết bị Thread sẽ gửi một thông báo CoAP để đăng ký địa chỉ đa hướng với PBBR (Đăng ký người nghe đa hướng, viết tắt là MLR) nếu địa chỉ lớn hơn địa chỉ cục bộ của miền. PBBR sử dụng MLDv2 trên Giao diện bên ngoài để giao tiếp với mạng LAN/WAN IPv6 rộng hơn về các nhóm truyền tin đa hướng IPv6 mà PBBR cần lắng nghe, thay mặt cho Mạng Thread cục bộ. PBBR chỉ chuyển tiếp lưu lượng truy cập đa hướng vào Mạng Thread nếu có ít nhất một thiết bị Thread đăng ký đích đến.

Đối với Thiết bị đầu cuối tối thiểu của Thread, các thiết bị này có thể phụ thuộc vào thiết bị mẹ để tổng hợp địa chỉ truyền tin đa hướng và thực hiện MLR thay cho chúng, hoặc tự đăng ký nếu thiết bị mẹ thuộc Thread 1.1.

Để biết thêm thông tin chi tiết, vui lòng tham khảo Quy cách về luồng.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ thiết lập một Bộ định tuyến biên Thread và 2 thiết bị Thread, sau đó bật và xác minh các tính năng truyền tin đa hướng trên thiết bị Thread và thiết bị Wi-Fi.

Kiến thức bạn sẽ học được

  • Cách tạo chương trình cơ sở nRF52840 có hỗ trợ tính năng Phát đa hướng IPv6.
  • Cách đăng ký địa chỉ phát đa hướng IPv6 trên các thiết bị Thread.

Bạn cần có

  • Một máy trạm Linux để tạo và flash RCP Thread, OpenThread CLI và kiểm thử truyền tin đa hướng IPv6.
  • Một Raspberry Pi cho bộ định tuyến biên sử dụng giao thức Thread.
  • 2 USB Dongle Nordic Semiconductor nRF52840 (một cho RCP và hai cho thiết bị cuối Thread).

2. Thiết lập OTBR

Cách nhanh nhất để thiết lập OTBR là làm theo Hướng dẫn thiết lập OTBR.

Sau khi hoàn tất quá trình thiết lập OTBR, hãy dùng ot-ctl để xác thực rằng OTBR đã trở thành Bộ định tuyến xương sống chính trong vòng vài giây.

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

3. Tạo và truyền nhanh các thiết bị Thread

Tạo ứng dụng Thread CLI bằng Multicast và flash hai bo mạch nRF52840 DK.

Tạo chương trình cơ sở nRF52840 DK

Làm theo hướng dẫn để sao chép dự án và tạo chương trình cơ sở nRF52840.

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

Tiếp tục với Build a Thread network with nRF52840 boards and OpenThread codelab (Xây dựng mạng Thread bằng các bo mạch nRF52840 và lớp học lập trình OpenThread) như đã viết. Sau khi thiết bị cuối được flash bằng hình ảnh CLI, hãy làm theo hướng dẫn trong phần Tham gia nút thứ hai vào mạng Thread để thêm thiết bị Thread vào mạng Thread. Lặp lại các bước trên đối với thiết bị cuối sử dụng giao thức Thread thứ hai.

4. Đăng ký địa chỉ truyền tin đa hướng IPv6

Đăng ký ff05::abcd trên Thiết bị đầu cuối 1 nRF52840:

> ipmaddr add ff05::abcd
Done

Xác minh rằng ff05::abcd đã đăng ký thành công:

> 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

Đăng ký ff05::abcd trên Máy tính xách tay:

Chúng ta cần một tập lệnh Python subscribe6.py để đăng ký một địa chỉ truyền tin đa hướng trên Máy tính xách tay.

Sao chép mã bên dưới và lưu mã này dưới dạng 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.')

Chạy subscribe6.py để đăng ký ff05::abcd trên giao diện mạng Wi-Fi (ví dụ: wlan0):

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

Cấu trúc liên kết mạng cuối cùng có các thuê bao truyền tin đa hướng được minh hoạ bên dưới:

b118448c98b2d583.png

Giờ đây, chúng ta đã đăng ký địa chỉ truyền tin đa hướng IPv6 trên cả Thiết bị đầu cuối 1 nRF52840 trong mạng Thread và Máy tính xách tay trong mạng Wi-Fi. Chúng ta sẽ xác minh khả năng kết nối truyền tin đa hướng IPv6 hai chiều trong các phần sau.

5. Xác minh gói đa hướng IPv6 đến

Giờ đây, chúng ta có thể truy cập cả Thiết bị đầu cuối 1 nRF52840 trong mạng Thread và Máy tính xách tay bằng địa chỉ phát đa hướng IPv6 ff05::abcd từ mạng Wi-Fi.

Ping ff05::abcd trên OTBR thông qua giao diện 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

Chúng ta có thể thấy rằng OTBR có thể nhận được 2 phản hồi ping từ cả Thiết bị đầu cuối 1 nRF52840 và Máy tính xách tay vì cả hai đều đã đăng ký ff05::abcd. Điều này cho thấy OTBR có thể chuyển tiếp các gói phát đa hướng IPv6 Ping Request từ mạng Wi-Fi sang mạng Thread.

6. Xác minh IPv6 Multicast đi

Ping ff05::abcd trên Thiết bị đầu cuối 2 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 End Device 2 có thể nhận được phản hồi ping từ cả nRF52840 End Device 1 và Laptop. Điều này cho thấy OTBR có thể chuyển tiếp các gói phát đa hướng IPv6 Ping Reply từ mạng Thread sang mạng Wi-Fi.

7. Xin chúc mừng

Xin chúc mừng! Bạn đã thiết lập thành công Bộ định tuyến biên theo giao thức Thread và xác minh thành công tính năng truyền tin đa hướng IPv6 hai chiều!

Để biết thêm thông tin về OpenThread, hãy truy cập vào openthread.io.

Tài liệu tham khảo: