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

1. מבוא

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

מה זה Thread ו-OTNS

פרוטוקול Thread הוא פרוטוקול רשת אלחוטית מסוג Mesh שמבוסס על 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.

הדרישות

  • Thread Primer. כדי להבין את מה שנלמד ב-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 הזה.

כדי לראות סקירה כללית של פקודות ה-CLI, מקלידים את הפקודה help. הרשימה הזו זהה לרשימת ההפניות ל-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

מוסיפים משחזר Mesh (באמצעות סוג הצומת router) לסימולציה:

> add router
1
Done

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

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

כדי שיהיה קל להתחיל סימולציות באופן אינטראקטיבי, כל צומת חדש של 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. אמור להיווצר צומת משמאל לצומת שנבחר. המאריך החדש של רשת ה-Mesh צריך להצטרף למחיצה הקיימת של רשת ה-Thread:

נוסף מגדיל טווח מסוג Mesh, סה"כ 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 משחזרים של רשת Mesh (בצורת משושה), אולי נתב גבול (בצורת ריבוע) והרבה צאצאים, והיא פועלת במהירות של פי 10.

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

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

כבה רדיו

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

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

מחיצה חדשה נוצרת עם צומת 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 נמצא עכשיו מחוץ לטווח הכיסוי של שאר המרחיבים של רשת ה-Mesh, הוא יוצר מחיצה משלו עם מזהה מחיצה חדש. כדי לבדוק את מזהי המחיצות, לוחצים על הצמתים בחלונית המידע על הצומת.

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

שימו לב שעדיין מצויר קו ירוק אחד בין צומת 5 לצומת 9. לרוב זה קורה בגלל מידע לא עדכני על הילד או הילדה, שעדיין נשמר בטבלת הילדים של הורה לשעבר. או שזה יכול להיות מידע לא עדכני על הקישור הקודם של Mesh Extender בין צומת 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 Node Context

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

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

12. מזל טוב

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

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

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

מה השלב הבא?

כדאי לעיין ב-Codelabs הבאים…

מסמכים לדוגמה