Simuler des réseaux Thread à l'aide d'OTNS

1. Introduction

Impression d'une topologie de réseau maillé Thread

Qu'est-ce que Thread et OTNS ?

Thread est un protocole de réseau maillé sans fil basse consommation basé sur IP qui permet des communications sécurisées entre appareils et entre appareils et le cloud. Les réseaux Thread peuvent s'adapter aux changements de topologie pour éviter un point de défaillance unique.

OpenThread publié par Google est une implémentation Open Source de Thread. Malgré la petite taille de son code et son faible encombrement mémoire, OpenThread prend en charge toutes les fonctionnalités définies dans la spécification Thread.

OpenThread Network Simulator (OTNS) peut être utilisé pour simuler des réseaux Thread en exécutant des nœuds OpenThread simulés sur des plates-formes POSIX. OTNS fournit une interface Web facile à utiliser (OTNS-Web) pour visualiser et exploiter les réseaux Thread simulés. Il est également possible d'effectuer des simulations scriptées (avec Python).

Points abordés

  • Installer OTNS et ses dépendances
  • Découvrir les principes de base de l'OTNS-CLI
  • Ajouter/Déplacer/Supprimer des nœuds OpenThread dans OTNS-Web
  • Utiliser les autres fonctionnalités utiles d'OTNS-Web pour contrôler la simulation du réseau
  • Vérifier l'absence de point de défaillance unique d'OpenThread
  • Afficher le trafic de données entre les nœuds OpenThread dans Wireshark

Cet atelier de programmation porte sur OTNS-CLI et OTNS-Web pour une utilisation interactive. Les autres fonctionnalités d'OTNS, telles que les scripts Python, ne sont pas abordées.

Prérequis

  • Principes de base de Thread. Vous devez connaître les concepts de base de Thread pour comprendre ce qui est enseigné dans cet atelier de programmation.
  • De préférence Linux x86_64 ou Mac OS avec Homebrew. La version 24 ou ultérieure d'Ubuntu dans WSL2 pour Windows devrait également fonctionner, mais peut nécessiter quelques ajustements manuels des paramètres.
  • Git
  • Navigateur Web OTNS-Web utilise un navigateur Web pour afficher les simulations.
  • Analyseur de protocole réseau Wireshark (facultatif).
  • Go version 1.23 ou ultérieure.
    • Le script d'installation vérifiera la version Go installée.
    • Si Go n'est pas installé, une version >= 1.23 sera installée, si elle est disponible dans le gestionnaire de packages.
    • Si elle n'est pas disponible dans le gestionnaire de packages, une installation manuelle est requise.
    • Notez qu'Ubuntu 24.04 ou version antérieure ne sont pas compatibles automatiquement avec Go 1.23. Pour en savoir plus, consultez la page Available Golang versions (Versions Golang disponibles) dans la documentation Ubuntu. L'installation manuelle, à l'aide de snap ou d'autres procédures, est possible.
  • Version 3.9 ou ultérieure de Python.
    • Le script d'installation vérifie la version de Python installée.
    • Si Python 3 n'est pas encore installé, une version >= 3.9 sera installée si elle est disponible dans le gestionnaire de packages.
    • Si elle n'est pas disponible dans le gestionnaire de packages, une installation manuelle est requise.

Terminologie

Le terme "routeur" est utilisé comme terme technique pour le répéteur Thread Mesh, qui s'appelait initialement routeur Thread. Le terme "nœud" désigne tout appareil OpenThread simulé dans une simulation OTNS.

2. Installation

Obtenir le code OTNS

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

Toutes les commandes de console suivantes de cet atelier de programmation sont exécutées à partir du répertoire otns.

Amorcer et installer

Le script bootstrap installe les dépendances (y compris Python 3 et Go/Golang, si nécessaire) et OTNS. Notez que le script peut s'arrêter s'il ne parvient pas à installer automatiquement certaines dépendances, telles que Python version >= 3.9 ou Go version >= 1.23. L'installation automatique nécessite que les packages soient disponibles dans le dépôt de packages configuré du système d'exploitation.

Le script crée également les différents types de nœuds OT qui peuvent être utilisés directement dans une simulation et effectue des tests de base. En raison de ces compilations de nœuds, cela peut prendre plusieurs minutes.

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

Vous serez peut-être invité à saisir un mot de passe pour sudo lors de l'exécution du script.

Si otns n'est pas installé correctement

Le script peut signaler une erreur telle que :

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

Dans ce cas, vous devez ajouter $(go env GOPATH)/bin à votre variable $PATH.

En cas d'autres erreurs, vous pouvez créer un problème GitHub.

3. Exécuter OTNS pour la première fois

Exécutez otns :

$ otns
>_ ← OTNS-CLI prompt

Une fois OTNS démarré, il accède à une console CLI (OTNS-CLI) et lance un navigateur Web pour la visualisation et la gestion du réseau (OTNS-Web) :

Fenêtre OTNS-Web au démarrage

Si vous ne voyez qu'une page blanche pour OTNS-Web, il est probable que WebGL ne soit pas activé dans votre navigateur. Pour savoir comment activer WebGL, consultez https://superuser.com/a/836833.

Dans les sections suivantes, vous allez apprendre à gérer les simulations OTNS à l'aide de OTNS-CLI et OTNS-Web.

4. Découvrir OTNS-CLI et OTNS-Web

OTNS-CLI

OTNS-CLI est l'interface de ligne de commande (CLI) permettant de gérer les simulations OTNS.

$ otns
>_ ← OTNS-CLI prompt

Vous pouvez saisir des commandes dans OTNS-CLI. Pour obtenir la liste complète des commandes, consultez la documentation de référence sur la CLI OTNS. Ne vous inquiétez pas, vous n'utiliserez que quelques-unes de ces commandes dans cet atelier de programmation.

Saisissez la commande help pour obtenir une présentation des commandes CLI. Cette liste est identique à la documentation de référence sur la CLI.

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

Pour obtenir de l'aide sur une commande spécifique, utilisez le nom de la commande, par exemple :

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

OTNS-Web

OTNS-Web est l'outil de visualisation et de gestion du réseau OTNS. Il fournit une représentation visuelle des nœuds, des messages et des liens du réseau Thread simulé. Notez les différents éléments de OTNS-Web :

Explication des éléments OTNS-Web

5. Ajouter des nœuds

Ajouter des nœuds via OTNS-CLI

Ajoutez un routeur Thread à la simulation :

> add router
1
Done

Un nœud doit s'afficher dans OTNS-Web. Le nœud commence en tant que routeur et devient un leader en quelques secondes :

Un nœud avec le rôle de leader

Pour faciliter le démarrage interactif des simulations, chaque nouveau nœud OpenThread est mis en service par défaut avec un ensemble standard de paramètres réseau.

Ajouter des nœuds via OTNS-CLI

Nous allons maintenant ajouter des nœuds de différents types.

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

Attendez quelques secondes que les nœuds fusionnent en une seule partition. Vous devriez voir les nœuds dans OTNS-Web :

Réseau Thread avec quatre nœuds

Dans OTNS-Web, vous pouvez également sélectionner l'un des nœuds pour afficher un panneau contenant plus d'informations à son sujet. Par exemple, dans la figure ci-dessous, le nœud 1 est sélectionné. L'entrée "Rôle" dans le panneau confirme qu'il s'agit d'un responsable.

Réseau Thread avec quatre nœuds, le nœud 1 est sélectionné

Ajouter des nœuds par OTNS-Web

Vous pouvez également ajouter des nœuds via OTNS-Web. Cliquez sur le bouton New Router de Action Bar. Un nœud devrait être créé à droite du nœud sélectionné. Le nouveau routeur doit rejoindre la partition Thread existante :

Un routeur est ajouté, pour un total de cinq nœuds.

Cliquez également sur les boutons "FED", "MED", "SSED" et "BR" de la barre d'action pour créer ces autres types de nœuds. Il devrait maintenant y avoir neuf nœuds au total. Si vous le souhaitez, faites glisser certains nœuds vers d'autres positions pour créer une topologie de réseau physique différente.

Plusieurs nouveaux nœuds ajoutés, soit un total de neuf nœuds

Vous avez créé un réseau Thread d'une partition contenant de nombreux nœuds. Dans la section suivante, nous allons ajuster la vitesse de simulation pour que la simulation s'exécute plus rapidement.

6. Ajuster la vitesse

La simulation devrait actuellement s'exécuter à la vitesse 1X, ce qui signifie que le temps de simulation écoulé jusqu'à présent est le même que le temps réel écoulé depuis la création du premier nœud.

Ajuster la vitesse via OTNS-CLI

Vous pouvez ajuster la vitesse de simulation via OTNS-CLI.

Définir la vitesse de simulation sur 100X

> speed 100
Done

Vous devriez voir les nœuds envoyer des messages beaucoup plus fréquemment qu'avant.

Définir la vitesse de simulation sur MAX

> speed max
Done

OTNS s'efforce de simuler le plus rapidement possible. Vous devriez donc voir les nœuds envoyer un grand nombre de messages.

Mise en pause de la simulation

> speed 0
Done

Si vous définissez la vitesse de simulation sur 0, la simulation est mise en pause.

Rétablir la simulation à vitesse normale

> speed 1
Done

Si vous définissez une vitesse de simulation supérieure à 0, la simulation reprend.

Ajuster la vitesse via OTNS-Web

Boutons de contrôle de la vitesse

Recherchez les boutons de contrôle de la vitesse Boutons de contrôle de la vitesse sur la Action Bar. Les boutons affichent la vitesse de simulation actuelle et peuvent être utilisés pour ajuster la vitesse de simulation et mettre en pause/reprendre la simulation.

Accélérer la simulation

Vous pouvez accélérer la simulation en cliquant sur le bouton Bouton "Augmenter la vitesse" jusqu'à ce que la vitesse atteigne MAX : Indicateur de vitesse de simulation MAX.

Ralentir la simulation

Vous pouvez ralentir la simulation en cliquant sur le bouton Bouton de réduction de la vitesse.

Mise en pause de la simulation

Cliquez sur le bouton Bouton de pause pour mettre en pause la simulation en cours. Le bouton devient Bouton de lecture.

Reprendre la simulation

Cliquez sur le bouton Bouton de lecture pour reprendre la simulation lorsqu'elle est en pause. Le bouton sera de nouveau défini sur Bouton de pause.

Définir la vitesse de simulation sur 10X

Pour gagner du temps, utilisez

OTNS-CLI pour ajuster la vitesse de simulation à

10X : nous pouvons ainsi observer beaucoup plus rapidement les changements de topologie dans le réseau.

> speed 10
Done

7. Activer/Désactiver la radio

La simulation doit maintenant contenir au moins deux routeurs (forme hexagonale), éventuellement un routeur de bordure (forme carrée) et de nombreux enfants, et s'exécuter à une vitesse de 10x.

Repérez le routeur principal actuel (bordure rouge) parmi les deux routeurs, puis cliquez dessus une fois pour le sélectionner :

Réseau Thread avec le nœud principal 1 sélectionné

Éteindre le signal radio

Cliquez sur le bouton Bouton "Radio désactivée" de la barre d'action pour désactiver la radio du nœud principal. Le responsable ne pourra pas envoyer ni recevoir de messages si la radio est éteinte.

Attendez environ 12 secondes (120 secondes en temps de simulation) pour que l'autre routeur ou routeur de bordure devienne le nouveau leader :

Une nouvelle partition est formée avec le nœud 9 comme nouveau leader.

Le réseau Thread se remet automatiquement d'une défaillance du leader en formant une nouvelle partition avec un nouveau leader. La nouvelle partition a également une nouvelle couleur.

Allumer le signal radio

Sélectionnez le responsable dont la radio a été désactivée. Cliquez sur le bouton Bouton "Radio activée" sur Action Bar pour rétablir la connectivité radio :

Le nœud 1 rejoint la partition une fois que sa radio est de nouveau activée.

Le Leader devrait se reconnecter au réseau une fois la connectivité radio rétablie.

8. Déplacer des nœuds

OTNS permet aux utilisateurs de déplacer facilement des nœuds à l'aide de OTNS-CLI ou OTNS-Web.

Déplacer le nœud via OTNS-CLI

Déplacez le nœud Border Router 9 vers un nouvel emplacement :

> move 9 50 50
Done

Déplacer un nœud via OTNS-Web

Déplacez le nœud 5 tout en bas à droite en le faisant glisser. Étant donné que le nœud 5 n'est plus à portée radio des autres routeurs, il forme sa propre partition avec un nouvel ID de partition. Pour vérifier les ID de partition, cliquez sur les nœuds dans le panneau d'informations sur les nœuds.

Le nœud 5 est déplacé des autres nœuds et forme une nouvelle partition.

Notez qu'une seule ligne verte est toujours tracée entre le nœud 5 et le nœud 9. Cela est souvent dû à des informations obsolètes sur un enfant, qui sont toujours conservées dans la table enfant d'un ancien parent. Il peut également s'agir d'informations obsolètes sur l'ancienne liaison routeur à routeur entre le nœud 9 et le nœud 5. (Ou peut-être même un bug d'affichage dans ce cas.) Les informations obsolètes sont ensuite nettoyées sur les nœuds après le délai d'inactivité approprié.

9. Supprimer des nœuds

Supprimer des nœuds via OTNS-CLI

Supprimez le nœud 5 :

> del 5
Done

Le nœud 5 devrait disparaître de la simulation :

Le nœud 5 est supprimé de la simulation.

Supprimer des nœuds via OTNS-Web

Sélectionnez le nœud de routeur de bordure 9, puis cliquez sur le bouton Bouton "Supprimer" dans Action Bar pour supprimer le nœud 9 :

Le nœud 9 du routeur de bordure est supprimé

Node 1 doit devenir le leader d'une nouvelle partition, et tous les nœuds restants seront associés en tant qu'enfants au nœud 1.

10. Contexte de nœud OTNS-CLI

OTNS-CLI fournit un mode de contexte de nœud pour une interaction facile avec les nœuds afin d'aider les développeurs à diagnostiquer l'état d'un nœud. Les actions de nœud peuvent également être lancées à partir de ce mode.

Accéder au mode contexte de nœud

Saisissez le contexte du nœud 1 :

> node 1
Done
node 1>

L'invite CLI est passée à node 1> , ce qui indique le contexte du nœud actuel. Vous pouvez saisir des commandes OpenThread CLI à exécuter sur le nœud comme si vous interagissiez directement avec lui.

Exécuter des commandes dans le contexte d'un nœud

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

Passer à un autre contexte de nœud

node 1> node 2
Done
node 2> 

Contexte du nœud de sortie

node 1> exit
Done
>

La commande node 0 est une autre façon de quitter le contexte de nœud.

11. Afficher les journaux de nœuds et les captures de paquets

Journaux de nœuds OpenThread

Par défaut, OTNS génère des fichiers journaux détaillés pour tous les nœuds OpenThread simulés. Vous pouvez les consulter dans le répertoire ./tmp. Le nom du fichier est 0_.log. Voici un extrait d'un fichier journal :

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

Le temps de simulation absolu en microsecondes est indiqué à gauche. Le code temporel hh:mm:ss indique le code temporel du journal du nœud OpenThread, qui peut être différent du temps de simulation absolu.

Captures de paquets Wireshark

Par défaut, toutes les trames IEEE 802.15.4 transmises sont capturées dans le fichier PCAP current.pcap. Wireshark peut lire ce fichier pendant ou après la simulation. En raison du chiffrement de la couche liaison de Thread, une action de configuration unique dans Wireshark est nécessaire pour définir correctement la clé de déchiffrement pour OTNS. Par défaut, une clé réseau connue est utilisée pour faciliter le déchiffrement des trames par Wireshark.

Consultez la capture d'écran ci-dessous pour voir un exemple d'inspection de paquets OpenThread dans Wireshark.

Capture d'écran de l'analyse de paquets OpenThread dans Wireshark

Pour configurer la clé de déchiffrement, sélectionnez Édition > Préférences dans le menu. Dans la fenêtre des préférences, sélectionnez Protocols > IEEE 802.15.4. Cliquez sur le bouton Modifier… à côté de "Clés de déchiffrement". Cliquez sur + pour créer une entrée, puis saisissez la clé 00112233445566778899aabbccddeeff (32 caractères) et sélectionnez "Hachage du thread" dans le champ "Hachage de la clé". L'index de la clé de déchiffrement peut être défini sur 0. Cliquez ensuite sur OK, puis de nouveau sur OK. Le fichier PCAP OTNS devrait maintenant être correctement déchiffré lors du chargement.

Les codes temporels affichés dans la colonne "Heure" (en secondes) correspondent aux valeurs temporelles absolues de la simulation affichées dans les journaux des nœuds OpenThread. Il est ainsi plus facile de corréler les messages du journal avec les trames radio transmises ou reçues. Toutefois, les valeurs ne sont généralement pas identiques à la microseconde près : le matériel radio IEEE 802.15.4 simulé peut ajouter un délai supplémentaire après qu'une trame radio a été demandée à être envoyée par la pile OpenThread.

12. Félicitations

Félicitations, vous venez d'exécuter votre première simulation OTNS !

Vous avez appris à installer OTNS et ses dépendances. Vous avez lancé une simulation OTNS avec des nœuds simulés OpenThread. Vous avez appris à manipuler la simulation de différentes manières à l'aide de OTNS-CLI et OTNS-Web.

Vous savez maintenant ce qu'est OTNS et comment l'utiliser pour simuler des réseaux OpenThread.

Étape suivante

Découvrez quelques-uns des ateliers de programmation...

Documents de référence