Симулируйте сети потоков с помощью 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

В этой лабораторной работе основное внимание уделено интерактивному использованию OTNS-CLI и OTNS-Web. Другие функции OTNS, такие как написание скриптов на Python, не рассматриваются.

Что вам понадобится

  • Учебник по Thread Primer . Вам необходимо знать основные понятия Thread, чтобы понять материал этой практической работы.
  • Предпочтительно Linux x86_64 или Mac OS с Homebrew . Ubuntu версии 24 или выше в Windows WSL2 также должна работать, но может потребоваться ручная настройка.
  • Гит .
  • Веб-браузер. OTNS-Web использует веб-браузер для отображения результатов моделирования.
  • Анализатор сетевых протоколов Wireshark (опционально).
  • Go версии 1.23 или выше.
    • Скрипт установки проверит установленную версию Go.
    • Если Go не установлен, будет установлена версия >= 1.23, если она доступна в менеджере пакетов.
    • Если пакет недоступен в менеджере пакетов, потребуется ручная установка.
    • Обратите внимание, что Ubuntu 24.04 и более ранние версии не поддерживают Go 1.23 автоматически. Подробности см. на странице «Доступные версии 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

Все последующие консольные команды в этой лабораторной работе запускаются из каталога 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. Подробнее о том, как включить WebGL, читайте на странице https://superuser.com/a/836833 .

В следующих разделах вы научитесь управлять моделированием OTNS с помощью OTNS-CLI и OTNS-Web .

4. Знакомство с OTNS-CLI и OTNS-Web

OTNS-CLI

OTNS-CLI — это интерфейс командной строки (CLI) для управления моделированием OTNS.

$ otns
>_ ← OTNS-CLI prompt

Вы можете вводить команды через OTNS-CLI . Полный список команд см. в справочнике по OTNS CLI . Не волнуйтесь, в этой лабораторной работе вы будете использовать лишь некоторые из них.

Введите команду 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 Router в симуляцию:

> add router
1
Done

Вы увидите созданный узел в OTNS-Web . Узел запускается как маршрутизатор и через несколько секунд становится лидером:

Один узел в роли лидера

Чтобы упростить интерактивный запуск моделирования, каждый новый узел OpenThread по умолчанию снабжается стандартным набором сетевых параметров.

Добавьте больше узлов через OTNS-CLI

Теперь добавим несколько узлов разных типов.

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

Подождите несколько секунд, пока узлы объединятся в один раздел. Вы должны увидеть узлы в OTNS-Web :

Сеть потоков с 4 узлами

Также в OTNS-Web можно выбрать любой узел, чтобы открыть панель с дополнительной информацией о нём. Например, на рисунке ниже выбран узел 1. Запись «Роль» на панели подтверждает, что это Лидер.

Сеть потоков с 4 узлами, выбран узел 1

Добавить узлы через OTNS-Web

Вы также можете добавлять узлы через OTNS-Web . Нажмите кнопку New Router на Action Bar . Справа от выбранного узла должен появиться узел, создаваемый в процессе. Новый маршрутизатор должен присоединиться к существующему разделу потоков:

Добавлен маршрутизатор, всего 5 узлов.

Также нажмите кнопки FED, MED, SSED и BR на панели действий, чтобы создать эти другие типы узлов. Теперь должно быть 9 узлов. При желании перетащите некоторые узлы в другие места, чтобы создать другую топологию физической сети.

Добавлено несколько новых узлов, всего 9 узлов.

Итак, вы создали сеть потоков, состоящую из одного раздела и множества узлов. В следующем разделе мы настроим скорость симуляции, чтобы ускорить её выполнение.

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 маршрутизаторов (шестиугольной формы), возможно, граничный маршрутизатор (квадратной формы) и много дочерних элементов и работать на скорости 10X.

Найдите текущего лидера (красная рамка) из двух маршрутизаторов, щелкните его один раз, чтобы выбрать:

Сеть потоков с выбранным узлом-лидером 1

Выключить радио

Нажмите на Кнопка выключения радио Кнопка на панели действий позволяет отключить радиосвязь узла «Лидер». При выключенной радиосвязи «Лидер» не сможет отправлять и получать сообщения.

Подождите около 12 секунд (120 секунд при моделировании), пока другой маршрутизатор или пограничный маршрутизатор станет новым лидером:

Формируется новый раздел с узлом 9 в качестве нового лидера.

Сеть потоков автоматически восстанавливается после сбоя лидера, формируя новый раздел с новым лидером. Новый раздел также имеет новый цвет.

Включи радио

Выберите лидера, у которого было выключено радио. Нажмите кнопку Кнопка включения радио кнопка на Action Bar для восстановления радиосвязи:

Узел 1 присоединяется к разделу после того, как его радио снова включено.

После восстановления радиосвязи «Лидер» должен повторно подключиться к сети.

8. Перемещение узлов

OTNS позволяет пользователям легко перемещать узлы через OTNS-CLI или OTNS-Web .

Переместить узел через OTNS-CLI

Переместите узел Border Router 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 должен стать лидером нового раздела, а все оставшиеся узлы будут присоединены как дочерние к узлу 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

Чтобы настроить ключ дешифрования, выберите в меню «Правка» -> «Настройки» . Затем в окне настроек выберите «Протоколы» -> «IEEE 802.15.4» . Нажмите кнопку «Изменить...» рядом с пунктом «Ключи дешифрования». Нажмите «+» , чтобы создать новую запись, и введите ключ 00112233445566778899aabbccddeeff (32 символа). В поле «Хеш ключа» выберите «Хеш потока». Значение «Индекс ключа дешифрования» можно оставить равным 0 Затем нажмите «ОК » и ещё раз «ОК» . Теперь файл OTNS PCAP должен корректно дешифроваться при загрузке.

Временные метки, отображаемые в столбце «Время» (в секундах), соответствуют абсолютным значениям времени моделирования, отображаемым в журналах узлов OpenThread. Это упрощает сопоставление сообщений журнала с переданными или полученными радиокадрами. Однако эти значения обычно не совпадают с точностью до одной микросекунды: имитируемое радиооборудование IEEE 802.15.4 может вносить дополнительную задержку после того, как стек OpenThread запросит отправку радиокадра.

12. Поздравления

Поздравляем, вы успешно выполнили свою первую симуляцию OTNS!

Вы узнали, как установить OTNS и его зависимости. Вы запустили моделирование OTNS с использованием узлов OpenThread. Вы узнали, как управлять моделированием различными способами через OTNS-CLI и OTNS-Web .

Теперь вы знаете, что такое OTNS и как можно использовать OTNS для моделирования сетей OpenThread.

Что дальше?

Ознакомьтесь с некоторыми из этих практикумов...

Справочные документы