הדמיה של רשתות Thread באמצעות OTNS

1. מבוא

חשיפה של טופולוגיית רשת אריג בפרוטוקול Thread

מה זה Thread ו-OTNS

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

OpenThread שפורסם על ידי Google הוא הטמעה של Thread בקוד פתוח. למרות גודל הקוד הקטן וטביעת הרגל הקטנה בזיכרון, OpenThread תומך בכל התכונות שמוגדרות במפרט Thread.

אפשר להשתמש ב-OpenThread Network Simulator (OTNS) כדי לדמות רשתות Thread על ידי הפעלת צמתים מדומים של OpenThread בפלטפורמות posix. ‫OTNS מספק ממשק אינטרנט קל לשימוש (OTNS-Web) להצגה חזותית של רשתות Thread מדומה ולהפעלה שלהן. אפשר גם להשתמש בסימולציות מבוססות-סקריפט (עם Python).

מה תלמדו

  • התקנה של OTNS ויחסי התלות שלו
  • הסבר על העקרונות הבסיסיים של OTNS-CLI
  • איך מוסיפים, מעבירים או מוחקים צמתים של OpenThread ב-OTNS-Web
  • אפשר להשתמש בתכונות שימושיות אחרות של OTNS-Web כדי לשלוט בהדמיית הרשת
  • אימות של OpenThread ללא נקודת כשל יחידה
  • הצגת תנועת הנתונים בין צמתי OpenThread ב-Wireshark

ה-codelab הזה מתמקד ב-OTNS-CLI וב-OTNS-Web לשימוש אינטראקטיבי. המאמר לא מתייחס לתכונות אחרות של OTNS, כמו סקריפטים של Python.

מה נדרש

  • הסבר על שרשורים כדי להבין את מה שנלמד ב-Codelab הזה, צריך להכיר את המושגים הבסיסיים של Thread.
  • עדיף Linux x86_64 או Mac OS עם Homebrew. גרסה 24 ואילך של Ubuntu ב-WSL2 ב-Windows אמורה גם היא לפעול, אבל יכול להיות שיהיה צורך לבצע שינויים ידניים בהגדרות.
  • Git.
  • דפדפן אינטרנט. ‫OTNS-Web משתמש בדפדפן אינטרנט כדי להציג סימולציות.
  • Wireshark – כלי לניתוח פרוטוקולי רשת (אופציונלי).
  • Go גרסה 1.23 ואילך.
    • סקריפט ההתקנה יבדוק איזו גרסת Go מותקנת.
    • אם Go לא מותקנת, תותקן גרסה >= 1.23, אם היא זמינה ממנהל החבילות.
    • אם הוא לא זמין במנהל החבילות, צריך להתקין אותו באופן ידני.
    • שימו לב: Ubuntu 24.04 ומטה לא תומך אוטומטית ב-Go 1.23. פרטים נוספים זמינים בדף Available Golang versions (גרסאות Golang זמינות) בתיעוד של Ubuntu. אפשר לבצע התקנה ידנית באמצעות snap או בדרכים אחרות.
  • Python בגרסה 3.9 ואילך.
    • סקריפט ההתקנה יבדוק איזו גרסה של Python מותקנת.
    • אם Python 3 עדיין לא מותקן, תותקן גרסה >= 3.9 אם היא זמינה ממנהל החבילות.
    • אם הוא לא זמין במנהל החבילות, צריך להתקין אותו באופן ידני.

הסברים על המונחים

המונח 'נתב' משמש כמונח הטכני ל-Thread Mesh Extender, שנקרא בהתחלה Thread Router. המונח 'צומת' מתייחס לכל מכשיר OpenThread מדומה בהדמיה של OTNS.

2. התקנה

קבלת קוד OTNS

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

כל פקודות המסוף הבאות ב-Codelab הזה מורצות מהספרייה otns.

הפעלה והתקנה

הסקריפט bootstrap יתקין את הרכיבים התלויים (כולל Python 3 ו-Go/Golang, אם צריך) ויתקין את OTNS. שימו לב: יכול להיות שהסקריפט ייעצר אם הוא לא יוכל להתקין באופן אוטומטי תלות מסוימת, כמו Python בגרסה >= 3.9 או Go בגרסה >= 1.23. כדי שההתקנה תתבצע באופן אוטומטי, צריך לוודא שאפשר למצוא את החבילות במאגר החבילות שהוגדר במערכת ההפעלה.

הסקריפט גם בונה את הסוגים השונים של צמתי OT שאפשר להשתמש בהם ישירות בסימולציה, ומבצע כמה בדיקות בסיסיות. בגלל בניית הצמתים האלה, התהליך יכול להימשך כמה דקות.

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

יכול להיות שתתבקשו להזין סיסמה ל-sudo במהלך ההרצה של הסקריפט.

אם otns לא מותקן בצורה תקינה

יכול להיות שהסקריפט ידווח על שגיאה כמו:

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

במקרה כזה, צריך להוסיף את $(go env GOPATH)/bin למשתנה $PATH.

במקרה של שגיאות אחרות, אפשר ליצור בעיה ב-GitHub.

3. הפעלת OTNS בפעם הראשונה

מריצים את otns:

$ otns
>_ ← OTNS-CLI prompt

אם ההפעלה תצליח, OTNS ייכנס למסוף CLI ‏ (OTNS-CLI) ויפעיל דפדפן אינטרנט להצגה ולניהול של הרשת (OTNS-Web):

חלון OTNS-Web בהתחלה

אם אתם רואים רק דף ריק ב-OTNS-Web, סביר להניח ש-WebGL לא מופעל בדפדפן שלכם. בכתובת https://superuser.com/a/836833 מוסבר איך להפעיל את WebGL.

בקטעים הבאים תלמדו איך לנהל סימולציות של OTNS באמצעות OTNS-CLI ו-OTNS-Web.

4. היכרות עם OTNS-CLI ו-OTNS-Web

OTNS-CLI

OTNS-CLI הוא ממשק שורת הפקודה (CLI) לניהול סימולציות של OTNS.

$ otns
>_ ← OTNS-CLI prompt

אפשר להקליד פקודות דרך OTNS-CLI. רשימה מלאה של הפקודות זמינה במאמרי העזרה בנושא OTNS CLI. אל דאגה, תשתמשו רק בכמה מהפקודות האלה ב-Codelab הזה.

מקלידים את הפקודה help כדי לראות סקירה כללית של פקודות ה-CLI. הרשימה הזו זהה לרשימת ההפניות ל-CLI.

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

כדי לקבל עזרה נוספת לגבי פקודה ספציפית, משתמשים בשם הפקודה, למשל:

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

OTNS-Web

OTNS-Web הוא כלי לניהול הרשת ולהצגת נתונים חזותיים שלה ב-OTNS. הוא מספק ייצוג חזותי של הצמתים, ההודעות והקישורים של רשת Thread המדומה. שימו לב לרכיבים השונים של OTNS-Web:

הסבר על רכיבי OTNS-Web

5. הוספת צמתים

הוספת צמתים באמצעות OTNS-CLI

מוסיפים נתב Thread לסימולציה:

> add router
1
Done

אמור להופיע צומת שנוצר ב-OTNS-Web. הצומת מתחיל כנתב והופך למוביל תוך כמה שניות:

צומת אחד בתפקיד מוביל

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

הוספת עוד צמתים דרך OTNS-CLI

עכשיו נוסיף כמה צמתים מסוגים שונים.

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

ממתינים כמה שניות עד שהצמתים ימוזגו למחיצה אחת. הצמתים אמורים להופיע ב-OTNS-Web:

רשת Thread עם 4 צמתים

בנוסף, ב-OTNS-Web אפשר לבחור כל אחד מהצמתים כדי לקבל חלונית עם מידע נוסף על הצומת. לדוגמה, באיור שלמטה, הצומת 1 נבחר. הרשומה 'תפקיד' בחלונית מאשרת שמדובר במנהיג.

רשת Thread עם 4 צמתים, צומת 1 נבחר

הוספת צמתים באמצעות OTNS-Web

אפשר גם להוסיף צמתים דרך OTNS-Web. לוחצים על הלחצן New Router של Action Bar. אמור להיווצר צומת משמאל לצומת שנבחר. הנתב החדש צריך להצטרף למחיצת ה-Thread הקיימת:

נוסף נתב, סך הכול 5 צמתים

אפשר גם ללחוץ על הלחצנים FED,‏ MED,‏ SSED ו-BR בסרגל הפעולות כדי ליצור את סוגי הצמתים האחרים האלה. עכשיו אמורים להיות 9 צמתים בסך הכול. אם רוצים, אפשר לגרור כמה צמתים למיקומים אחרים כדי ליצור טופולוגיה פיזית שונה של הרשת.

נוספו כמה צמתים חדשים, סך הכול 9 צמתים

יצרתם רשת Thread של מחיצה אחת שמכילה הרבה צמתים. בקטע הבא נשנה את מהירות הסימולציה כדי שהיא תפעל מהר יותר.

6. שינוי המהירות

בשלב הזה, הסימולציה אמורה לפעול במהירות של 1X, כלומר הזמן שחלף בסימולציה עד עכשיו זהה לזמן בפועל מאז שיצרנו את הצומת הראשון.

שינוי המהירות באמצעות OTNS-CLI

אפשר לשנות את מהירות הסימולציה דרך OTNS-CLI.

הגדרת מהירות הסימולציה ל-100X

> speed 100
Done

הצמתים אמורים לשלוח הודעות בתדירות גבוהה בהרבה מבעבר.

הגדרת מהירות הסימולציה ל-MAX

> speed max
Done

עכשיו, OTNS מנסה לבצע סימולציה מהר ככל האפשר, ולכן אמורים לראות צמתים ששולחים מספר רב של הודעות.

הדמיית השהיה

> speed 0
Done

הגדרת מהירות הסימולציה ל-0 תשהה את הסימולציה.

שחזור ההדמיה במהירות רגילה

> speed 1
Done

הגדרת מהירות הסימולציה לערך גדול מ-0 מפעילה מחדש את הסימולציה.

שינוי המהירות באמצעות OTNS-Web

לחצני בקרת מהירות

מחפשים את לחצני השליטה במהירות לחצני בקרת מהירות בAction Bar. הלחצנים מציגים את מהירות הסימולציה הנוכחית, ואפשר להשתמש בהם כדי לשנות את מהירות הסימולציה ולהשהות או להפעיל אותה מחדש.

האצת הסימולציה

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

האטת הסימולציה

כדי להאט את הסימולציה, לוחצים על הלחצן כפתור להורדת המהירות.

הדמיית השהיה

לוחצים על הלחצן כפתור ההשהיה כדי להשהות את הסימולציה בזמן שהיא פועלת. הלחצן ישתנה ל-כפתור ההפעלה.

המשך הסימולציה

לוחצים על הלחצן כפתור ההפעלה כדי להמשיך את הסימולציה כשהיא מושהית. הכפתור ישתנה חזרה ל-כפתור ההשהיה.

הגדרת מהירות הסימולציה ל-10X

כדי לחסוך זמן, כדאי להשתמש ב-

OTNS-CLI כדי לשנות את מהירות הסימולציה ל-

10X כדי שנוכל לזהות שינויים בטופולוגיה של הרשת הרבה יותר מהר.

> speed 10
Done

7. הפעלה או השבתה של הרדיו

עכשיו, הסימולציה צריכה לכלול לפחות 2 נתבים (בצורת משושה), אולי נתב גבול (בצורת ריבוע) והרבה צאצאים, והיא פועלת במהירות של פי 10.

מחפשים את הנתב הנוכחי (גבול אדום) מתוך 2 הנתבים, ולוחצים עליו פעם אחת כדי לבחור אותו:

רשת Thread עם צומת ראשי 1 שנבחר

כבה רדיו

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

ממתינים כ-12 שניות (120 שניות בזמן הסימולציה) עד שהנתב או נתב הגבול השני יהפוך למוביל החדש:

מחיצה חדשה נוצרת עם צומת 9 כמנהיג החדש

רשת Thread מתאוששת מכשל של רכיב Leader באופן אוטומטי על ידי יצירת מחיצה חדשה עם רכיב Leader חדש. למחיצה החדשה יש גם צבע מחיצה חדש.

הפעל רדיו

בוחרים את המנהיג שהמכשיר שלו כבוי. לוחצים על הלחצן כפתור ההפעלה של הרדיו ב-Action Bar כדי לשחזר את הקישוריות של המכשיר:

צומת 1 מצטרף למחיצה אחרי שהרדיו שלו מופעל שוב

הנתב הראשי צריך להתחבר מחדש לרשת אחרי שהקישוריות האלחוטית חוזרת.

8. העברת צמתים

התכונה OTNS מאפשרת למשתמשים להעביר בקלות צמתים באמצעות OTNS-CLI או OTNS-Web.

העברת הצומת דרך OTNS-CLI

מעבירים את הצומת של נתב הגבולות 9 למיקום חדש:

> move 9 50 50
Done

העברת צומת באמצעות OTNS-Web

גוררים את הצומת 5 עד לפינה הימנית התחתונה. מכיוון שהצומת 5 נמצא עכשיו מחוץ לכיסוי הרדיו של הנתבים האחרים, הוא יוצר מחיצה משלו עם מזהה מחיצה חדש. כדי לבדוק את מזהי המחיצות, לוחצים על הצמתים בחלונית המידע על הצומת.

צומת 5 מוזז מהצמתים האחרים ויוצר מחיצה חדשה

שימו לב שעדיין נמשך קו ירוק אחד בין צומת 5 לצומת 9. הסיבה לכך היא לרוב מידע לא עדכני על הילד או הילדה, שעדיין נשמר בטבלת הילדים של הורה לשעבר. או שזה יכול להיות מידע לא עדכני על הקישור הקודם בין נתב לנתב בין צומת 9 לצומת 5. (או אולי, במקרה הזה, אפילו באג בעיבוד). בסופו של דבר, מידע לא עדכני נמחק מהצמתים אחרי פסק הזמן המתאים.

9. מחיקת צמתים

מחיקת צמתים דרך OTNS-CLI

מחיקת צומת 5:

> del 5
Done

צומת 5 אמור להיעלם מהסימולציה:

צומת 5 נמחק מהסימולציה

מחיקת צמתים דרך OTNS-Web

בוחרים את הצומת Border Router 9 ולוחצים על הלחצן כפתור מחיקה ב-Action Bar כדי למחוק את הצומת 9:

צומת נתב הגבול 9 נמחק

Node 1 יהפוך ל-Leader של מחיצה חדשה וכל הצמתים שנותרו יצורפו כ-Child לצומת 1.

10. הקשר של צומת OTNS-CLI

OTNS-CLI מספק מצב הקשר של צומת לאינטראקציה קלה עם צמתים, כדי לעזור למפתחים לאבחן את הסטטוס של צומת. בנוסף, אפשר להתחיל פעולות בצומת מהמצב הזה.

כניסה למצב הקשר של הצומת

מזינים את הקשר של צומת 1:

> node 1
Done
node 1>

ההנחיה של CLI השתנתה ל-node 1> , שמציינת את ההקשר הנוכחי של הצומת. אפשר להקליד פקודות OpenThread CLI להרצה בצומת, כאילו אתם מבצעים אינטראקציה ישירה עם הצומת.

ביצוע פקודות בהקשר של צומת

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

מעבר להקשר של צומת אחר

node 1> node 2
Done
node 2> 

יציאה מההקשר של הצומת

node 1> exit
Done
>

דרך חלופית לצאת מהקשר של הצומת היא הפקודה node 0.

11. צפייה ביומני הצמתים ובלכידות של חבילות נתונים

יומנים של צומת OpenThread

כברירת מחדל, OTNS יוצר קובצי יומן מפורטים לכל הצמתים המדומים של OpenThread. אפשר לראות אותם ב./tmpמאגר. שם הקובץ הוא 0_.log. לדוגמה, קטע מקובץ יומן מוצג בהמשך:

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

משך הסימולציה המוחלט במיקרו-שניות מוצג בצד ימין. חותמת הזמן hh:mm:ss מציגה את חותמת הזמן של היומן של צומת OpenThread עצמו, שיכולה להיות שונה מזמן הסימולציה המוחלט.

תיעוד חבילות ב-Wireshark

כברירת מחדל, כל המסגרות שמועברות בתקן IEEE 802.15.4 נשמרות בקובץ ה-PCAP‏ current.pcap. אפשר לקרוא את הקובץ הזה באמצעות Wireshark במהלך הסימולציה או אחריה. בגלל ההצפנה בשכבת הקישור של Thread, צריך לבצע פעולת הגדרה חד-פעמית ב-Wireshark כדי להגדיר את מפתח הפענוח ל-OTNS בצורה תקינה. כברירת מחדל, נעשה שימוש במפתח רשת מוכר אחד כדי שיהיה קל לפענח את המסגרת באמצעות Wireshark.

בצילום המסך שלמטה אפשר לראות דוגמה לבדיקת מנות OpenThread ב-Wireshark.

צילום מסך של ניתוח חבילות OpenThread ב-Wireshark

כדי להגדיר את מפתח הפענוח, בוחרים באפשרות עריכה -> העדפות בתפריט. אחר כך, בחלון ההעדפות, בוחרים באפשרות Protocols -> IEEE 802.15.4 (פרוטוקולים -> IEEE 802.15.4). לוחצים על הלחצן עריכה... לצד 'מפתחות פענוח'. לוחצים על + כדי ליצור רשומה חדשה, מזינים את המפתח 00112233445566778899aabbccddeeff (32 תווים) ובוחרים באפשרות 'גיבוב של השרשור' בשדה 'גיבוב של המפתח'. אפשר להשאיר את הערך 0 ב'אינדקס מפתח הפענוח'. לאחר מכן לוחצים על אישור, ושוב על אישור. עכשיו, קובץ ה-PCAP של OTNS אמור להיות מפוענח בצורה תקינה כשהוא נטען.

חותמות הזמן שמוצגות בעמודה 'Time' (זמן) (בשניות) תואמות לערכי הזמן המוחלטים של הסימולציה שמוצגים ביומני הצמתים של OpenThread. כך קל יותר לקשר בין הודעות ביומן לבין מסגרות רדיו שמועברות או מתקבלות. עם זאת, בדרך כלל הערכים לא זהים עד לרמת דיוק של מיקרו-שנייה אחת: חומרת הרדיו המדומה IEEE 802.15.4 עשויה להוסיף עיכוב נוסף, אחרי שבקשת שליחת פריים רדיו נשלחת על ידי מחסנית OpenThread.

12. מזל טוב

מזל טוב, ביצעת בהצלחה את הסימולציה הראשונה של OTNS!

למדתם איך להתקין את OTNS ואת יחסי התלות שלו. התחלתם סימולציה של OTNS עם צמתים מדומי OpenThread. למדתם איך לשנות את הסימולציה בדרכים שונות באמצעות OTNS-CLI וגם OTNS-Web.

עכשיו אתם יודעים מה זה OTNS ואיך אפשר להשתמש בו כדי לדמות רשתות OpenThread.

מה השלב הבא?

כדאי לעיין בכמה מה-codelabs האלה…

מסמכי עזר