gnrc_networking – Kommunikation über IPv6

Die komplette Kommunikation der Nodes (Sensorknoten) untereinander und die Kommunikation der Todes mit dem Gateway erfolgen über IPv6-Adressen. Im ersten Beispielprogramm "hello world" wurde noch keine Netzwerkfunktionalität implementiert. Dies wollen wir nun im zweiten Beispielprogramm "gnrc_network" ändern. Das Beispielprogramm bringt eine IPv6-Unterstützung und erlaubt somit die Kommunikation mit anderen Knoten.  

Was ist IPv6

Jeder der sich mit Computer beschäftigt wird früher oder später den Begriff "IP-Adresse" aufschnappen. Damit ist die eindeutige Adresse eines Computers bzw. eines im Netzwerk befindlichen Gerätes gemeint. Im privaten heimischen Netzwerk setzt man dabei überwiegend auf IPv4-Adressen. Diese bestehen aus vier dreistelligen Zahlen, welche jeweils durch einen Punkt getrennt sind. Der Bereich der Zahlen geht dabei von 0-255. Ein Beispiel IPv4-Adresse sieht wie folgt aus:

192.168.2.1

In einem Netzwerk bekommt jeder Teilnehmer seine eigene einmalige IP-Adresse. Somit ist jeder Teilnehmer eindeutig adressierbar. Es gibt jedoch ein paar Einschränkungen bzw. Richtlinien. Nicht jede Adresse von 0.0.0.0 bis 255.255.255.255 kann verwendet werden. Für den privaten gebrauch wurden drei Bereiche festgelegt. Mehr Infos darüber findet ihr auf Wikipedia

Aufgrund der möglichen IP-Adressen ist deren Anzahl begrenzt. Durch die immer weitere Verbreitung von smarten Geräten, werden immer mehr IP-Adressen benötigt. Es gibt nur ca. 4,3 Milliarden IPv4-Adressen. Durch die Einführung von IPv6-Adressen sollte diese Zahl erhöht werden.

Dies erreichte man durch den Einsatz einer längeren Adresse mit dem zusätzlichen Verwenden von HEX-Zahlen. Eine IPv6-Adresse besteht aus 8 Feldern mit je vier Stellen. Je Stelle sind die Zahlen von 0-f möglich. Dies ermöglicht 340 Sextillionen Adressen.

0000.0000.0000.0000.0000.0000.0000.0000 bis ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

Wer mehr Infos zu IPv6-Adressen lesen möchte. Dem empfehle ich die Seite vom Elektro-Kompendium

Das gnrc_networking Beispiel

Riot bietet ein Beispiel-Programm an, mit dem dem Sensorknoten eine Netzwerkunterstützung gegeben wird. Das "gnrc_networking"-Beispielprogramm. Es befindet sich im Ordner "example" im Unterordner "gnrc_networking".

Das Makefile

Schauen wir uns zunächst das Makefile an. Wer bereits das hello-world-Programm ausgeführt hat, wird bereits wissen, dass hier die diversen Anweisungen für den Compiler stehen. Des Weiteren wird im Makefile auch festgelegt, welche Zusatzmodule eingebunden werden sollen. Diese Zusatzmodule sind zum Beispiel die Treiber für diverse Sensoren. Aber auch die Module für die Netzwerkunterstützung. 

Am Anfang des Makefiles stehen wieder die allgemeinen Angaben, wie der Name des Programms und das verwendete Board. In diesem Fall nutzen wir wieder das native-Board. Also das simulierte Board, für welches wir keine echte Hardware benötigen. Für die allgemeine Verständnis von Riot OS und der Aufbau des Sensornetzwerkes ist dies ideal. Des Weiteren steht am oberen Teil des Makefiles der Pfad zu Riot und welches Board aufgrund von unzureichenden Speicher nicht verwendet werden können. 

Im mittleren Teil stehen nun die zu verwendeten Module.

Im Gegensatz zum hello-world-Programm werden nun einige Zusatzmodule geladen. Im folgende werde ich versuche euch diese etwas zu erklären.

Zusatzmodul

Beschreibung

gnrc_netdev_default

Fügt die API für einen low-driver Netzwerk-Treiber hinzu. Mehr Infos hier.

auto_init_gnrc_netif

Aktiviert die Auto-Einrichtung des Netzwerktreibers.

gnrc_ipv6_router_default

IPv6-Unterstützung aktivieren. Mehr Infos.

gnrc_udp

UDP-Unterstützung. Mehr Infos.

gnrc_rpl

gnrc_init_gnrc_rpl

Aktiviert das Routing-Protokoll RPL. Aktuell noch uninteressant. Später mehr dazu.

gnrc_pktdump

Netzwerkmodul zum Empfangen und Senden von Dump-Paketen.

shell

shell_commands

Aktiviert die Shell und fügt diverse Shell-Kommandos hinzu.

ps

Erlaubt das Auslesen der aktiven Prozesse über die Shell

netstats_xxxx

Aktivert diverse Statistiken über die Netzwerkkommunikation.

Wie man erkennt, beziehen sich die "gnrc_xxx" Module auf die Netzwerkfähigkeit. Gnrc steht für "generic network stack" und beschreibt den Netzwerkstack. Mehr Infos dazu findet ihr hier.

main.c

Das main-File ist relativ unspektakulär. Die Einrichtung der Netzwerkfähigkeit erfolgte komplett durch das Laden der Module im Makefile.  

Im Main-File werden nun die benötigten Header-Files eingebunden und die Shell-Befehle definiert. Mehr zur Shell auf meinem Blog-Beitrag.

Programm kompilieren

Zum kompilieren starten wir wieder unsere Virtuell Maschine. Habt ihr noch keine eingerichtet, liest am besten meinen Blog-Beitrag dazu. Des Weiteren solltet ihr bereits Riot OS heruntergeladen und eingerichtet haben.

Zum Kompilieren wechseln wir in den Ordner des Beispielprogramms. Den Pfad entsprechend anpassen. 

cd .../Riot/examples/gnrc_networking

Info: Solltet ihr noch nicht die Pakete "7z" oder "unzip" installiert haben, sollte dies nun nach geholt werden. 

sudo apt-get install unzip

Anschließend kann das Kompilieren begonnen werden.

sudo make clean all

Netzwerkschnittstelle mit tuntap erstellen

Nach dem Kompilieren wurde das benötigte elf-File erstellt und die benötigte virtuelle Netzwerkschnittstelle kann erstellt werden. Dazu wird ein sogenanntes Tap-Device erstellt. Dieses dient als Schnittstelle zwischen dem Host-System, also der virtuellen Maschine und dem Sensornetzwerk. In diesem Fall der virtuelle Knoten "native".

sudo ip tuntap add tap0 mode tap user ${USER}

 Nach dem Erstellen der Netzwerkschnittstelle kann diese nun gestartet werden. 

sudo ip link set tap0 up

Programm ausführen

Nun kann der virtuelle Knoten mit der Netzwerkschnittstelle verbunden werden und man kann sich mit der Shell des Knotens verbinden.

sudo PORT=tap0 make term

Nun kann mit "ifconfig" überprüft werden, on dem Knoten eine IPv6-Adresse zugewiesen wurde.

In diesem Fall wurde dem Knoten die IP-Adresse "fe80::54fd:3dff:fe9d:e978" zugewiesen. Wer nun aufgepasst hat wird sich wundern, dass diese IP-Adresse nur fünf Adressfelder hat. Obwohl eine IPv6-Adresse aus acht Felder besteht. Wer jedoch genau hinsieht, der sieht die beiden Doppelpunkte. Diese stehen sozusagen für 0000 und erlauben somit eine kürzere Schreibweise von IPv6-Adressen mit Feldern voller Nullen. Ausgeschrieben lautet die Adresse vom Knoten also fe80:0000:0000:0000:54fd:3dff:fe9d:e978.

UDP - IPv6-Verbindung testen

Mit einem UDP-Paket kann nun die Verbindung getestet werden. Dazu wird von der virtuellen Maschine aus ein UDP-Paket zum Knoten und umgekehrt gesendet. Für einen praktischen Workflow empfehle ich euch den Einsatz vom Fenstermanager "tumx". Dieser erlaubt das öffnen mehrere Terminal-Fenster. Mehr zu "tumx" könnt ihr auf meinem Blog-Beitrag nachlesen.

In einem Terminal-Fenster wird nun der virtuelle Knoten gestartet.

sudo PORT=tap0 make term

Mit "ifconfig" kann nun die IP-Adresse ausgelesen werden. Diese solltet ihr euch notieren. Des Weiteren muss nun auf dem Knoten der UDP-Server gestartet werden.

udp server start 8808

In einem zweiten Fenster kann nun ein UDP-Paket an den Knoten gesendet werden. Zunächst wird überprüft ob auch auf der virtuellen Maschine das tap0-Interface bereit steht und der virtuellen Maschine eine IPv6-Adresse zugewiesen wurden. Dies könnt ihr ebenfalls mit dem Befehl "ifconfig" überprüfen. 

In diesem Fall hat die virtuelle Maschine die IPv6-Adresse "fe80::54fd:3dff:fe9d:e977" zugewiesen bekommen. Diese wird später benötigt um ein UDP-Paket vom Knoten an die virtuelle Maschine zu senden.

Nun kann jedoch zunächst ein UDP-Paket an den Sensorknoten gesendet werden:

nc -6uv fe80::54fd:3dff:fe9d:e978%tap0 8808

Wichtig ist die Option -6uv. Die "6" legt fest, dass eine IPv6-Verbindung verwendet werden soll. Das "u" steht für UDP und das "v" erhöht die Info-Ausgabe. Auf der Seite der virtuellen Maschine sieht man nun, dass die Verbindung erfolgreich war.

Auf dem virtuellen Knoten sieht man hingegen etwas mehr.

Wer möchte kann nun noch die andere Richtung ausprobieren. Dazu wird zunächst auf der virtuellen Maschine ein UDP-Server gestartet.

nc -6ul 8808

Auf dem virtuellen Knoten kann nun ein UDP-Paket an die virtuelle Maschine gesendet werden. Dazu verwenden wir die IPv6-Adresse der virtuellen Maschine.

udp send fe80::54fd:3dff:fe9d:e977 8808 Testnachricht

Auf der virtuellen Maschine kann man nun die empfangene Nachricht lesen.

Wir ihr sieht, klappt die Verbindung über die IPv6-Adresse zwischen Knoten und virtueller Maschine problemlos. Im späteren Sensornetzwerk läuft die komplette Kommunikation über die IPv6-Adresse der entsprechenden Knoten. Wer mehr über das Beispielprogramm "gnrc_networking" lesen möchte, kann dies auf der Github-Seite von Riot OS nachlesen.

Hinterlasse einen Kommentar

avatar
Fotos und Bilder
 
 
 
sonstiges Dateiformat
 
 
 
  Subscribe  
Benachrichtige mich zu: