Vorbereitung
Mininet
Mininet
ist ein Tool, dass die Virtualisierungsmöglichkeiten des Linux-Kernels nutzt, um virtuelle Netzewerke aus verschiedenen Komponenten aufzubuauen, die zwar auf einem Host-System laufen, sich allerding genauso verhalten, als wären Sie über ein Netz miteinander verbunden. Was sich kompliziert und ressourcenintensiv anhört ist mit Hilfe von Mininet einfach und ressourcenschonend, so dass auch größere Netzwerke problemlos aufgebaut werden können. Vielleicht beschreibt es dieser Text von der Mininet-Webseite am besten:
Mininet creates a realistic virtual network, running real kernel, switch and application code, on a single machine (VM, cloud or native), in seconds, with a single command. Because you can easily interact with your network using the Mininet CLI (and API), customize it, share it with others, or deploy it on real hardware, Mininet is useful for development, teaching, and research.
Mininet ist aus Nutzersicht ein Kommandozeilentool, das nach dem Start eine eigene, neue Kommandozeile bereitstellt - die Mininet-CLI. Da Mininet priviligierte Befehle ausführt, muss Mininet mit Super-User-Rechten gestartet werden. Am einfachsten startet man Mininet so:
sudo mn
Wenn man diese Befehl ausgeführt hat, dann werden Statusnachrichten ausgegeben und relativ schnell erwartet einen die Mininet-CLI, die man am Prompt gut erkennt:
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1)
*** Configuring hosts
h1 h2
*** Starting controller
c0
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet>
Mininet teilt einem hier mit, was alles erstellt und angelegt wurde. Wir sehen z.B. zwei Hosts (h1, h2), einen Switch (s1) und Links, die die beiden Hosts mit dem Switch verbinden. Am Ende wartet die Mininet-CLI auf Eingaben. Bevor wir uns mit der CLI genauer beschäftigen fällt noch etwas auf. Der Controller. Diesen brauchen wir nicht, denn hier handelt es sich um einen OpenFlow-Controller, der einen OpenFlow-Switch steuern kann. Um es an dieser Stelle kurz zu machen, OpenFlow wird wenig in der Industrie eingesetzt und schwebt irgendwo zwischen Hype und Hoffnung als Technologie. Wir sind an Standardkomponenten interessiert, also einem einfachen Ethernet-Switch. Das müssen wir Mininet beim Start mitteilen. Dazu müssen wir Mininet zunächst beenden. In der Mininet-CLI einfach exit
eingeben und Mininet neu starten, und diesmal so:
sudo mn --switch lxbr
lxbr
steht dabei für Linux Bridge
, und bridge
ist ein anderer Begriff für switch
.
Damit sind wir wieder in der Mininet-CLI, erkennbar am Prompt (mininet>
). Mit der Mininet-CLI kann man das gesamte, gerade erzeugte Netz zentral steuern. D.h. heisst von hier aus kann man sich den Status des Netzes anzeigen lassen, Mininet-Befehle absetzten, oder, und das ist das wahrscheinlich wichtigste, man kann einfach Linux-Kommandos und Programme ausführen. Sprich, alles was auf dem Linux Host-System installiert ist, kann man auf den virtuellen Komponenten unseres Netzes ausführen, als wären es echte Komponenten, isoliert vom Host-System und isoliert von den anderen virtuellen Komponenten. Bevor wir dies tun aber noch ein Wort bezüglich des Hilfesystems in Mininet.
Mit:
help
kann man in der Mininet-CLI sich die von der Mininet-CLI bereitgestellten Befehle anzeigen lassen:
mininet> help
Documented commands (type help <topic>):
========================================
EOF gterm iperfudp nodes pingpair py switch
dpctl help link noecho pingpairfull quit time
dump intfs links pingall ports sh x
exit iperf net pingallfull px source xterm
You may also send a command to a node using:
<node> command {args}
For example:
mininet> h1 ifconfig
The interpreter automatically substitutes IP addresses
for node names when a node is the first arg, so commands
like
mininet> h2 ping h3
should work.
Some character-oriented interactive commands require
noecho:
mininet> noecho h2 vi foo.py
However, starting up an xterm/gterm is generally better:
mininet> xterm h2
Hier steht schon einiges an wichtiger Information. Die Tabelle gleich am Anfang der Hilfeseite zeigt die in der Mininet-CLI eingebauten Befehle. Wer mehr über einen dieser Befehle wissen möchte muss nur:
help <topic>
eingeben. D.h. wer mehr über den Befehl switch
wissen möchte muss kann bekommt mit diesem Befehl eine kurze Erklärung dazu:
mininet> help switch
Starts or stops a switch
Manchmal sind diese Hilfetexte ein wenig kurz geraten, denn der obige Hilfetext sagt nichts über die Benutzung des Befehls. Aber wenn man es einfach ausprobiert, dann komm typischerweise ein Hilfetext, der die Nutzung beschreibt.
mininet> switch
invalid number of args: switch <switch name>{start, stop}
Viele Befehle geben Statusinformationen über das virtuelle Netz und seine Knoten aus. Dazu gehören z.B. die Befehle links
, nodes
, ports
, net
, intfs
oder der Befehl, der eine Gesamtübersicht ausgibt dump
.
mininet> dump
<Host h1: h1-eth0:10.0.0.1 pid=2976>
<Host h2: h2-eth0:10.0.0.2 pid=2978>
<LinuxBridge s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None pid=2984>
<Controller c0: 127.0.0.1:6653 pid=2969>
Oben sieht man z.B. die Ausgabe von dump
. Man sieht es gibt zwei Endhosts namens h1
und h2
, einen Switch s1
dem man nun ansieht, dass es ein ganz einfacher Standard-Switch ist. Den Controller vernachlässigen wir für unsere Experimente. Man sieht hier auch die IP Adressen der Hosts, was oft hilfreich ist.
Eine weitere Klasse von Befehlen ermitteln die Erreichbarkeit zwischen den Komponenten des Netzes. So kann z.B. mit pingall
herausfinden, ob sich alle Hosts anpingen können. In dem kleinen Standardnetz von Mininet sieht das dann so aus:
mininet> pingall
*** Ping: testing ping reachability
h1 -> h2
h2 -> h1
*** Results: 0% dropped (2/2 received)
Hier erreicht jeder jeden. Stellen wir mal den Switch aus und probieren es erneut.
mininet> switch s1 stop
mininet> pingall
*** Ping: testing ping reachability
h1 -> X
h2 -> X
*** Results: 100% dropped (0/2 received)
Und schon erreichen sich die Hosts nicht mehr (es dauert ein wenig, bis das Ergebnis vorliegt, da Ping es einige Male versucht).
Wie schon erwähnt erlaubt es Mininet die Hosts (hier h1
und h2
) wie ganz normale (Linux-)Rechner zu verwenden. D.h. man könnte ganz einfach z.B. auf h1
das ping
-Kommando selbst ausführen, um die Erreichbarkeit zu testen. Dazu gibt es zwei Möglichkeiten. Die erste ist es direkt aus der Mininet-CLI den Befehl zu starten. Dazu schreibt man als erstes (!) den symbolischen Namen des Hosts auf dem das Kommando ausgeführt werden soll und dann das Kommando. Dazu kann man das Kommando so schreiben, wie man es auf der Kommandozeile des Hosts selbst tun würde, oder in der Mininet-CLI kann man auch als Parameter die symbolischen Namen verwenden (nicht vergessen den Switch wieder einzuschalten mit switch s1 start
):
h1 ping 10.0.0.2
oder
h1 ping h2
Die korrekte IP Adresse bekommt man z.B. mit dem eingebauten dump
Befehl. Bei einfachen Kommandos wie ping
funktionieren aber meist auch die symbolischen Namen.
Alternativ zur zentralen Steuerung durch die Mininet-CLI, kann man sich aber auch direkt eine Console auf den Komponenten öffnen mit xterm
oder gterm
:
xterm h1
Hier sollte sich ein neues Fenster mit einer Kommandozeile auf der gewünschten Komponente öffnen. gterm
ist dabei die schönere Konsole, aber nicht in jeder Linux-Distribution vorhanden. Hier, können jetzt beliebige Befehle eingegeben werden und Anwendungen gestartet werden, die alle auf diesem virtuellen Rechner laufen. Wichtig dabei ist aber, dass die symbolischen Namen der Mininet-CLI nicht funktionieren, d.h. in dieser Konsole ist h1
oder h2
nicht bekannt und man muss die IP Adressen benutzen (also z.B. ping 10.0.0.2
in der Konsole von h1
).
- Positive
- Auch wichtig zu wissen ist, dass das Netz von Mininet in sich geschlossen ist. D.h. es gibt keinen Zugang zum Internet.
Manchmal stürzt Mininet ab, oder es fängt an sich seltsam zu verhalten. Dann sollte man Mininet neu starten, aber bevor Mininet in solchen Situationen neu startet sollte man unbedingt die möglichen Überbleibsel der virtuellen Umgebung aufräumen. Das macht man so:
sudo mn -c
Obiges macht man natülich nicht in der Mininet-CLI, sondern nachdem man Mininet verlassen hat/gecrashed ist und bevor man es neu startet.
Apropos starten. Wenn man Mininet startet, dann kann man mit einigen Kommandozeilenschaltern das Verhalten von Mininet, bzw. das Verhalten und die Struktur der Netzwerktopologie steuern, ohne, dass man hier skripten müssten, was auch möglich wäre. Hier die vielleicht gängigsten Schalter beim Start von Mininet.
Zuächste kann man die Topologie, d.h. wie die einzelnen Komponenten miteinander verbunden sind, steuern. Mininet kennt ein paar einfache, vorgefertigte Topologien, die man noch parametrisieren kann. Hier ein Beispiel:
sudo mn --switch lxbr --topo single,3
Hier wird eine Topologie erzeugt mit einem einzigen Switch und drei Hosts sind mit diesem verbunden. Die Anzahl der Hosts kann man beliebig einstellen. Wichtig ist, dass nach --topo
nur ein Argument stehen darf, daher ist single,3
ein String ohne Leerzeichen. Weitere mögliche Topologien sind linear
|minimal
|reversed
|single
|torus
|tree
, wobei minimal
die Standardtopologie mit dem Switch und den beiden Hosts ist, die wir schon kennengelernt haben.
- Positive
- Man kann jetzt gerne mit diesen Topologien experimentieren und mit den Befehlen von vorhin rekonstruieren, wie diese Topologien aufgebaut sind.
Die Verbindung der Komponenten untereinander ist nur ein Aspekt des Netzwerks, dass sich einstellen lässt. Die Eigenschaften der Links zwischen der Komponenten, aber auch die Tiefe der Puffer der Switches kann eingestellt werden, und zwar mit dem --link
Schalter (auch hier darauf achten, dass alles hinter dem --link
Schalter ein String ohne Leerzeichen ist):
sudo mn --switch lxbr --topo single,3 --link tc,bw=10,delay=10ms,loss=1,max_queue_size=200
Nicht alle Parameter müssen benutzt werden, aber der Vollständigkeit halber sind hier die gängigsten aufgezeigt. Auch die Reihenfolge ist egal. Dabei bedeuten die Parameter folgendes:
bw
(bandwidth) : Bandbreite der Links (default in Mbit/s)delay
: der One-Way-Delay des Links, d.h. die Verzögerung bei der Übertragung über den Linkloss
: Paketverlustwahrscheinlichkeit in Prozentmax_queue_size
: Die Anzahl an Paketen, die in einer Warteschlange gespeichert werden können
Soviel zu Mininet.
iperf
iperf
ist, wie schon erwähnt, ein Kommandozeilenwerkzeug, um die verfügbare Bandbreite zu ermitteln, bzw. um einfach Verkehr zu erzeugen. Die man-page sagt es wohl wieder am besten:
iperf is a tool for performing network throughput measurements. It can test either TCP or UDP throughput. To perform an iperf test the user must establish both a server (to discard traffic) and a client (to generate traffic).
Da diese Operationen wenig komplex sind, ist es kaum verwunderlich, dass iperf selbst wenig komplex in der Bedienung ist. Man braucht auf der einen Seite einen iperf-Server und auf der anderen einen iperf-Client. Der Client erzeugt die Pakete und der Server verwirft diese einfach. Beide erzeugen Statistiken, die nach jedem Test ausgegeben werden.
Beim Start muss man den Client und der Server natürlich richtig konfigurieren. Da iperf sowohl TCP als auch UDP unterstützt und entweder als Client oder als Server fungiert gibt es zunächst diese vier Grundkonfigurationen:
iperf -s
: startet einen TCP iperf-Serveriperf -c <server IP>
: startet einen TCP iperf-Clientiperf -u -s
: startet einen UDP iperf-Serveriperf -u -c <server IP>
: startet einen UDP iperf-Client
Dazu können sich noch ein paar andere Schalter gesellen. Einer den wir später noch brauchen werden ist -P
nach dem die Zahl der Threads folgt, die den Test durchführen sollen. Bei TCP erzeugt jeder Thread eine eigene TCP-Verbindung. Also mit iperf -c 10.0.0.1 -P 2
wird ein TCP iperf-Client erzeugt gestartet, der zwei Threads nutzt und damit zwei TCP-Verbindungen. Der Server als Gegenstück läuft dabei auf der 10.0.0.1. Die länge der Datenübertragung kann man mit -t
steuern. -t
erwartet die Messdauer in Sekunden. Ein weiterer Schalter wird beim UDP Client benötigt und zwar -b
. Nach -b
kommt die Geschwindigkeit mit der der UDP Client senden soll. Mit iperf -u -c 10.0.0.1 -t 30 -b 5M
wird ein UDP Client gestartet, der 30 Sekunden lang mit 5 Mbit/s sendet.
Soviel zu iperf. Jetzt kann es losgehen.
Viel Erfolg!