Mô phỏng mạng luồng bằng OTNS

1. Giới thiệu

Lượt hiển thị của cấu trúc liên kết mạng lưới Thread

Thread và OTNS 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 một điểm lỗi duy nhất.

OpenThread do Google phát hành là một cách triển khai nguồn mở của Thread. Mặc dù có kích thước mã và mức sử dụng bộ nhớ nhỏ, nhưng OpenThread vẫn hỗ trợ tất cả các tính năng được xác định trong Quy cách của Thread.

Bạn có thể sử dụng Trình mô phỏng mạng OpenThread (OTNS) để mô phỏng các mạng Thread bằng cách chạy các nút OpenThread được mô phỏng trên các nền tảng posix. OTNS cung cấp một giao diện Web dễ sử dụng (OTNS-Web) để trực quan hoá và vận hành các mạng Thread mô phỏng. Bạn cũng có thể sử dụng các mô phỏng theo kịch bản (bằng Python).

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

  • Cài đặt OTNS và các phần phụ thuộc của OTNS
  • Tìm hiểu thông tin cơ bản về OTNS-CLI
  • Cách thêm/di chuyển/xoá các nút OpenThread trong OTNS-Web
  • Sử dụng các tính năng hữu ích khác của OTNS-Web để kiểm soát hoạt động mô phỏng mạng
  • Xác minh rằng OpenThread không có một điểm lỗi duy nhất
  • Xem lưu lượng truy cập dữ liệu giữa các nút OpenThread trong Wireshark

Lớp học lập trình này tập trung vào OTNS-CLI và OTNS-Web để sử dụng tương tác. Các tính năng khác của OTNS, chẳng hạn như tập lệnh Python, không được đề cập.

Bạn cần có

  • Thread Primer. Bạn cần nắm được các khái niệm cơ bản về Luồng để hiểu những gì được dạy trong Lớp học lập trình này.
  • Tốt nhất là Linux x86_64 hoặc Mac OS có Homebrew. Ubuntu phiên bản 24 trở lên trong WSL2 của Windows cũng sẽ hoạt động nhưng có thể yêu cầu bạn điều chỉnh một số chế độ cài đặt theo cách thủ công.
  • Git.
  • Trình duyệt web. OTNS-Web sử dụng trình duyệt web để hiển thị các mô phỏng.
  • Trình phân tích giao thức mạng Wireshark (không bắt buộc).
  • Go phiên bản 1.23 trở lên.
    • Tập lệnh cài đặt sẽ kiểm tra phiên bản Go đã cài đặt.
    • Nếu chưa cài đặt Go, thì hệ thống sẽ cài đặt phiên bản >= 1.23 (nếu có trong trình quản lý gói).
    • Nếu không có trong trình quản lý gói, bạn phải cài đặt theo cách thủ công.
    • Xin lưu ý rằng Ubuntu 24.04 trở xuống không tự động hỗ trợ Go 1.23. Hãy xem trang Các phiên bản Golang hiện có trong tài liệu của Ubuntu để biết thông tin chi tiết. Bạn có thể cài đặt theo cách thủ công, bằng cách sử dụng snap hoặc các quy trình khác.
  • Python phiên bản 3.9 trở lên.
    • Tập lệnh cài đặt sẽ kiểm tra phiên bản Python đã cài đặt.
    • Nếu bạn chưa cài đặt Python 3, thì ứng dụng này sẽ cài đặt phiên bản >= 3.9 (nếu có) từ trình quản lý gói.
    • Nếu không có trong trình quản lý gói, bạn phải cài đặt theo cách thủ công.

Thuật ngữ

Thuật ngữ "Bộ định tuyến" được dùng làm thuật ngữ kỹ thuật cho Bộ mở rộng mạng lưới Thread. Ban đầu, thiết bị này có tên là Bộ định tuyến Thread. "Nút" dùng để chỉ mọi thiết bị OpenThread được mô phỏng trong một mô phỏng OTNS.

2. Cài đặt

Nhận mã OTNS

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

Tất cả các lệnh bảng điều khiển tiếp theo trong Lớp học lập trình này đều được chạy từ thư mục otns.

Khởi động và cài đặt

Tập lệnh bootstrap sẽ cài đặt các phần phụ thuộc (bao gồm cả Python 3 và Go/Golang, nếu cần) và cài đặt OTNS. Xin lưu ý rằng tập lệnh có thể dừng nếu không tự động cài đặt được một số phần phụ thuộc nhất định, chẳng hạn như Python phiên bản >= 3.9 hoặc Go phiên bản >= 1.23. Tính năng tự động cài đặt yêu cầu các gói có thể được tìm thấy trong kho lưu trữ gói đã định cấu hình của hệ điều hành.

Tập lệnh này cũng tạo các loại nút OT có thể dùng trực tiếp trong quá trình mô phỏng và thực hiện một số kiểm thử cơ bản. Do các bản dựng nút này, quá trình này có thể mất vài phút.

$ ./script/bootstrap
....
....
OTNS installed - use 'otns' to start it.
$

Bạn có thể được yêu cầu nhập mật khẩu cho sudo trong quá trình thực thi tập lệnh.

Nếu otns không được cài đặt đúng cách

Tập lệnh có thể báo cáo một lỗi như:

....
OTNS installed - please add ~/go/bin to your PATH variable first, to use it.
$

Trong trường hợp này, bạn cần thêm $(go env GOPATH)/bin vào biến $PATH.

Trong trường hợp xảy ra các lỗi khác, bạn có thể tạo một vấn đề trên GitHub.

3. Chạy OTNS lần đầu tiên

Chạy otns:

$ otns
>_ ← OTNS-CLI prompt

Khi khởi động thành công, OTNS sẽ chuyển sang bảng điều khiển CLI (OTNS-CLI) và khởi chạy một trình duyệt web để trực quan hoá và quản lý mạng (OTNS-Web):

Cửa sổ OTNS-Web khi bắt đầu

Nếu bạn chỉ thấy một trang trống cho OTNS-Web, thì có thể WebGL chưa được bật trong trình duyệt của bạn. Vui lòng tham khảo https://superuser.com/a/836833 để biết cách bật WebGL.

Trong các phần sau, bạn sẽ tìm hiểu cách quản lý các hoạt động mô phỏng OTNS thông qua OTNS-CLIOTNS-Web.

4. Làm quen với OTNS-CLI và OTNS-Web

OTNS-CLI

OTNS-CLI là Giao diện dòng lệnh (CLI) để quản lý các hoạt động mô phỏng OTNS.

$ otns
>_ ← OTNS-CLI prompt

Bạn có thể nhập lệnh thông qua OTNS-CLI. Hãy tham khảo tài liệu tham khảo về OTNS CLI để biết danh sách đầy đủ các lệnh. Đừng lo lắng, bạn chỉ cần sử dụng một vài lệnh trong số này trong Lớp học lập trình này.

Nhập lệnh help để xem thông tin tổng quan về các lệnh CLI. Danh sách này giống với tài liệu tham khảo về CLI.

> help
add             Add a node to the simulation and get the node ID.
....
....
Done
> 

Để được trợ giúp thêm về một lệnh cụ thể, hãy dùng tên của lệnh đó, ví dụ:

> help add
add
  Add a node to the simulation and get the node ID.
  
Definition:
....
....
> 

OTNS-Web

OTNS-Web là công cụ quản lý và trực quan hoá mạng của OTNS. Công cụ này cung cấp thông tin trực quan về các nút, thông báo và đường liên kết của mạng Thread mô phỏng. Lưu ý các phần tử khác nhau của OTNS-Web:

OTNS-Web elements explained

5. Thêm nút

Thêm nút thông qua OTNS-CLI

Thêm Bộ định tuyến Thread vào mô phỏng:

> add router
1
Done

Bạn sẽ thấy một nút được tạo trong OTNS-Web. Nút này bắt đầu với vai trò là Bộ định tuyến và trở thành Nút chính sau vài giây:

Một nút trong vai trò Người lãnh đạo

Để dễ dàng bắt đầu mô phỏng một cách tương tác, theo mặc định, mỗi nút OpenThread mới sẽ được uỷ quyền bằng một bộ thông số mạng tiêu chuẩn.

Thêm các nút khác thông qua OTNS-CLI

Bây giờ, chúng ta sẽ thêm một số nút thuộc nhiều loại.

> add fed
2
Done
> add med
3
Done
> add sed
4
Done

Chờ vài giây để các nút hợp nhất thành một phân vùng. Bạn sẽ thấy các nút trong OTNS-Web:

Mạng Thread có 4 nút

Ngoài ra, trong OTNS-Web, bạn có thể chọn bất kỳ nút nào để xem bảng điều khiển có thêm thông tin về nút đó. Ví dụ: trong hình bên dưới, nút 1 được chọn. Mục "Vai trò" trong bảng điều khiển xác nhận rằng đó là một Người lãnh đạo.

Mạng Thread có 4 nút, nút 1 được chọn

Thêm nút bằng OTNS-Web

Bạn cũng có thể thêm các nút thông qua OTNS-Web. Nhấp vào nút New Router của Action Bar. Bạn sẽ thấy một nút được tạo ở bên phải nút đã chọn. Bộ định tuyến mới sẽ kết nối với phân vùng Thread hiện có:

Đã thêm một Bộ định tuyến, tổng cộng 5 nút

Bạn cũng có thể nhấp vào các nút FED, MED, SSED và BR trên Thanh thao tác để tạo các loại nút khác này. Giờ đây, sẽ có tổng cộng 9 nút. Nếu muốn, hãy kéo một số nút đến các vị trí khác để tạo một cấu trúc liên kết mạng vật lý khác.

Thêm nhiều nút mới, tổng cộng 9 nút

Giờ đây, bạn đã tạo một mạng Thread gồm một phân vùng chứa nhiều nút. Trong phần tiếp theo, chúng ta sẽ điều chỉnh tốc độ mô phỏng để quá trình mô phỏng diễn ra nhanh hơn.

6. Điều chỉnh tốc độ

Hiện tại, quá trình mô phỏng sẽ chạy ở tốc độ 1X, tức là thời gian mô phỏng đã trôi qua cho đến nay bằng với thời gian thực kể từ khi chúng ta tạo nút đầu tiên.

Điều chỉnh tốc độ bằng cách nhấn vào biểu tượng OTNS-CLI

Bạn có thể điều chỉnh tốc độ mô phỏng thông qua OTNS-CLI.

Đặt tốc độ mô phỏng thành 100X

> speed 100
Done

Bạn sẽ thấy các nút gửi tin nhắn thường xuyên hơn nhiều so với trước đây.

Đặt tốc độ mô phỏng thành MAX

> speed max
Done

Giờ đây, OTNS đang cố gắng hết sức để mô phỏng nhanh nhất có thể, vì vậy, bạn sẽ thấy các nút gửi một số lượng lớn tin nhắn.

Tạm dừng mô phỏng

> speed 0
Done

Việc đặt tốc độ mô phỏng thành 0 sẽ tạm dừng quá trình mô phỏng.

Khôi phục mô phỏng ở tốc độ bình thường

> speed 1
Done

Việc đặt tốc độ mô phỏng thành một giá trị lớn hơn 0 sẽ tiếp tục mô phỏng.

Điều chỉnh tốc độ bằng cách nhấn vào biểu tượng OTNS-Web

Nút điều khiển tốc độ

Tìm các nút điều khiển tốc độ Nút điều khiển tốc độ trên Action Bar. Các nút này cho biết tốc độ mô phỏng hiện tại và có thể dùng để điều chỉnh tốc độ mô phỏng cũng như tạm dừng/tiếp tục mô phỏng.

Tăng tốc độ mô phỏng

Bạn có thể tăng tốc độ mô phỏng bằng cách nhấp vào nút Nút tăng tốc độ cho đến khi tốc độ đạt đến MAX: Chỉ báo tốc độ mô phỏng TỐI ĐA.

Giảm tốc độ mô phỏng

Bạn có thể giảm tốc độ mô phỏng bằng cách nhấp vào nút Nút giảm tốc độ.

Tạm dừng mô phỏng

Nhấp vào nút Nút tạm dừng để tạm dừng quá trình mô phỏng khi đang chạy. Nút này sẽ thay đổi thành Nút phát.

Tiếp tục mô phỏng

Nhấp vào nút Nút phát để tiếp tục mô phỏng khi quá trình này bị tạm dừng. Nút này sẽ được thay đổi về Nút tạm dừng.

Đặt tốc độ mô phỏng thành 10X

Để tiết kiệm thời gian, hãy sử dụng

OTNS-CLI để điều chỉnh tốc độ mô phỏng thành

10X để chúng ta có thể quan sát các thay đổi về cấu trúc liên kết trong mạng nhanh hơn nhiều.

> speed 10
Done

7. Bật/tắt đài

Giờ đây, mô phỏng phải chứa ít nhất 2 Bộ định tuyến (hình lục giác), có thể là một Bộ định tuyến biên (hình vuông) và nhiều thành phần con, đồng thời chạy ở tốc độ gấp 10 lần.

Tìm Bộ định tuyến chính (đường viền màu đỏ) trong số 2 Bộ định tuyến, nhấp một lần để chọn Bộ định tuyến đó:

Mạng Thread có nút Leader 1 được chọn

Tắt radio

Nhấp vào nút Nút Tắt đài trên Thanh thao tác để tắt đài của nút Leader. Người dẫn đầu sẽ không thể gửi hoặc nhận tin nhắn khi đài phát tắt.

Chờ khoảng 12 giây (120 giây trong thời gian mô phỏng) để Bộ định tuyến hoặc Bộ định tuyến biên khác trở thành Trưởng nhóm mới:

Phân vùng mới được tạo với nút 9 là Trưởng nhóm mới

Mạng Thread tự động khôi phục sau khi Bộ định tuyến ưu tiên gặp sự cố bằng cách tạo một phân vùng mới với Bộ định tuyến ưu tiên mới. Phân vùng mới cũng có màu phân vùng mới.

Bật radio

Chọn Người dẫn đầu có đài phát bị tắt. Nhấp vào nút Nút Bật radio trên Action Bar để khôi phục khả năng kết nối của đài phát:

Nút 1 tham gia vào phân vùng sau khi đài của nút này bật lại

Thiết bị dẫn đầu sẽ kết nối lại với mạng sau khi kết nối vô tuyến được khôi phục.

8. Di chuyển nút

OTNS cho phép người dùng dễ dàng di chuyển các nút thông qua OTNS-CLI hoặc OTNS-Web.

Di chuyển nút qua OTNS-CLI

Di chuyển nút Border Router 9 đến một vị trí mới:

> move 9 50 50
Done

Di chuyển nút thông qua OTNS-Web

Di chuyển nút 5 xuống dưới cùng bên phải bằng cách kéo. Vì nút 5 hiện nằm ngoài phạm vi phủ sóng vô tuyến của các Bộ định tuyến khác, nên nút này tạo thành phân vùng riêng với một Partition ID mới. Bạn có thể kiểm tra mã nhận dạng phân vùng trên bảng thông tin nút bằng cách nhấp vào các nút.

Nút 5 được di chuyển ra khỏi các nút khác và tạo thành một phân vùng mới

Xin lưu ý rằng một đường màu xanh lục vẫn được vẽ giữa nút 5 và nút 9. Điều này thường là do thông tin cũ về một thành phần con vẫn được lưu giữ trong bảng con của một thành phần mẹ cũ. Hoặc đó có thể là thông tin cũ về đường liên kết trước đây giữa bộ định tuyến với bộ định tuyến giữa nút 9 và nút 5. (Hoặc có thể trong trường hợp này, thậm chí là một lỗi hiển thị.) Cuối cùng, thông tin cũ sẽ được dọn dẹp trên các nút sau khi hết thời gian chờ thích hợp.

9. Xoá các nút

Xoá các nút thông qua OTNS-CLI

Xoá nút 5:

> del 5
Done

Nút 5 sẽ biến mất khỏi quá trình mô phỏng:

Nút 5 bị xoá khỏi mô phỏng

Xoá các nút thông qua OTNS-Web

Chọn nút Border Router 9 rồi nhấp vào nút Nút xóa trên Action Bar để xoá nút 9:

Đã xoá nút Bộ định tuyến biên 9

Node 1 sẽ trở thành Trưởng nhóm của một phân vùng mới và tất cả các nút còn lại sẽ được đính kèm dưới dạng Nút con vào nút 1.

10. Ngữ cảnh nút OTNS-CLI

OTNS-CLI cung cấp chế độ ngữ cảnh của nút để dễ dàng tương tác với các nút, giúp nhà phát triển chẩn đoán trạng thái của một nút. Bạn cũng có thể bắt đầu các thao tác trên nút từ chế độ này.

Chuyển sang chế độ ngữ cảnh nút

Nhập ngữ cảnh nút của nút 1:

> node 1
Done
node 1>

Dấu nhắc CLI đã thay đổi thành node 1> , cho biết ngữ cảnh nút hiện tại. Bạn có thể nhập các lệnh OpenThread CLI để thực thi trên nút như thể bạn đang tương tác trực tiếp với nút.

Thực thi các lệnh trong ngữ cảnh nút

node 1> state
leader
Done
node 1> channel
11
Done
node 1> panid
0xface
Done
node 1> networkname
otns
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:b400
fd00:f00d:cafe:0:2505:8719:3685:ebfb
fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb
fe80:0:0:0:e86a:e07:ec97:777
Done

Chuyển sang một bối cảnh nút khác

node 1> node 2
Done
node 2> 

Ngữ cảnh nút thoát

node 1> exit
Done
>

Một cách khác để thoát khỏi ngữ cảnh nút là dùng lệnh node 0.

11. Xem nhật ký nút và dữ liệu chặn bắt gói

Nhật ký nút OpenThread

Theo mặc định, OTNS tạo các tệp nhật ký chi tiết cho tất cả các nút OpenThread được mô phỏng. Bạn có thể xem các tệp này trong thư mục ./tmp. Tên tệp là 0_.log. Ví dụ: Dưới đây là đoạn trích trong tệp nhật ký:

7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-:     src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6    | ..&..!.eSZCN.Y.  |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-:     src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---:     12 0x3000 - me - leader

Thời gian mô phỏng tuyệt đối tính bằng micro giây xuất hiện ở bên trái. Dấu thời gian hh:mm:ss cho biết dấu thời gian nhật ký của chính nút OpenThread, có thể khác với thời gian mô phỏng tuyệt đối.

Dữ liệu bắt gói tin Wireshark

Theo mặc định, tất cả các khung IEEE 802.15.4 được truyền đều được ghi lại trong tệp PCAP current.pcap. Wireshark có thể đọc tệp này trong hoặc sau quá trình mô phỏng. Do quá trình mã hoá lớp liên kết của Thread, bạn cần thực hiện một thao tác định cấu hình một lần trong Wireshark để đặt khoá giải mã cho OTNS một cách thích hợp. Theo mặc định, một Khoá mạng nổi tiếng được dùng để Wireshark dễ dàng giải mã khung.

Hãy xem ảnh chụp màn hình bên dưới để biết ví dụ về tính năng kiểm tra gói OpenThread trong Wireshark.

Ảnh chụp màn hình về hoạt động phân tích gói OpenThread trong Wireshark

Để định cấu hình khoá giải mã, hãy chọn Chỉnh sửa -> Lựa chọn ưu tiên trong trình đơn. Sau đó, trong cửa sổ Preferences (Lựa chọn ưu tiên), hãy chọn Protocols -> IEEE 802.15.4 (Giao thức -> IEEE 802.15.4). Nhấp vào nút Chỉnh sửa... bên cạnh "Khoá giải mã". Nhấp vào + để tạo một mục mới, nhập khoá 00112233445566778899aabbccddeeff (32 ký tự) và chọn "Băm luồng" trong trường "Băm khoá". Bạn có thể để "Chỉ mục khoá giải mã" là 0. Sau đó, nhấp vào OK rồi nhấp lại vào OK. Giờ đây, tệp PCAP OTNS sẽ giải mã đúng cách khi được tải.

Dấu thời gian xuất hiện trong cột "Thời gian" (tính bằng giây) tương ứng với các giá trị thời gian mô phỏng tuyệt đối xuất hiện trong nhật ký nút OpenThread. Điều này giúp bạn dễ dàng liên kết các thông báo nhật ký với các khung vô tuyến đã truyền hoặc nhận. Tuy nhiên, các giá trị thường không giống nhau với độ chính xác đến từng phần triệu giây: phần cứng vô tuyến IEEE 802.15.4 mô phỏng có thể thêm một số độ trễ bổ sung, sau khi ngăn xếp OpenThread yêu cầu gửi một khung vô tuyến.

12. Xin chúc mừng

Xin chúc mừng! Bạn đã thực hiện thành công mô phỏng OTNS đầu tiên!

Bạn đã tìm hiểu cách cài đặt OTNS và các phần phụ thuộc của OTNS. Bạn đã bắt đầu mô phỏng OTNS bằng các nút mô phỏng OpenThread. Bạn đã học cách điều khiển hoạt động mô phỏng theo nhiều cách thông qua cả OTNS-CLIOTNS-Web.

Giờ đây, bạn đã biết OTNS là gì và cách sử dụng OTNS để mô phỏng các mạng OpenThread.

Tiếp theo là gì?

Hãy xem một số lớp học lập trình này...

Tài liệu tham khảo