- Für die Ausführung von Mininet werden Admin-Rechte benötigt. Wenn Sie also eines der gegebenen Python Skripte ausführen wollen, wird dies wegen dem Fehlen von
sudo
fehlschlagen. Entweder Sie kopieren den Befehl und fügen davorsudo
hinzu oder Sie führen das Skript/versuch4/scripts/runTopo.sh
in dem eben genannten Unterordner mit./runTopo.sh <Skriptindex>
aus. Der Platzhalter Skriptindex repräsentiert dabei einen Eingabeparameter, mit dem Sie angeben können, welches der drei verfügbaren Mininet-Skripte ausgeführt werden soll (1
,2
oder3
).
In dieser Aufgabe werden wir die Leistung von verschiedenen Transportprotokollen untersuchen und dabei Stationen betrachten, die auch in realen Netzen vorkommen können. Dazu werden wir die nachfolgend beschriebenen Werkzeuge und virtuellen Netztopologien verwenden.
Das Programm iperf3
ermöglicht das Erzeugen von TCP- und UDP-Datenströmen zwischen zwei Rechnern. iperf3
ist eine Client-Server-Anwendung. Der Server wartet auf eingehende iperf3
-Verbindungen. Er kann mit dem Kommando
iperf3 -s
gestartet werden.
Wenn der Rechner, auf dem der Server laufen soll, wie im betrachteten Fall mehrere Netzschnittstellen besitzt, kann der Server mit
iperf3 -s -B <IP-Adresse>
gezielt an die Schnittstellen mit der angegebenen IP-Adresse gebunden werden. Bitte geben die IP-Adresse immer mit an und verwenden Sie NICHT die Adressen aus dem Subnetz 10.0.0.0/24
, denn dieses Subnetz ist nur zum Aufbau der SSH-Verbindung gedacht und hat im Gegensatz zu den anderen Netzen kein Limit für die Datenrate.
Einen Client, der einen TCP-Datenstrom erzeugt, kann man mit
iperf3 -c <IP-Adresse des Servers> -Z -t <Dauer der Übertragung>
starten. -Z
bedeutet dabei "Zero copy", was die Leistung des Clients erhöht.
Einen Client, der einen UDP-Datenstrom erzeugt, kann man mit
iperf3 -c <IP-Adresse des Servers> -Z -t <Dauer der Übertragung> -u -b <datenratenlimit>
erzeugen. Das Datenratenlimit ist standardmäßig auf 10 Mbit/s begrenzt und kann z.B. mit -b 1M
auf 1 Mbit/s gesetzt werden.
Das Werkzeug cpunetlog
kann die aktuelle CPU-Auslastung und den aktuellen Netzdurchsatz eines Rechners anzeigen. Die CPU-Auslastung ist für diesen Versuch nicht relevant, daher werden wir auf den Durchsatz fokussieren. cpunetlog
kann einfach mit dem Kommando
cpunetlog
gestartet werden. Abbildung 1 zeigt eine typische Ausgabe von cpunetlog
auf einem Rechner mit drei Netzschnittstellen sv1-eth0
, sv1-eth1
und sv1-eth2
. Das Programm kann durch Drücken der Taste q
beendet werden.
Abbildung 1: Ausgabe von cpunetlog
Außerdem erlaubt cpunetlog
das Aufzeichnen des zeitlichen Verlaufs von CPU-Auslastung und Netzdurchsatz zur späteren Auswertung. Diese kann mit
cpunetlog -l
# bzw. in unserem Fall mit
cpunetlog -l --nics <Liste der Schnittstellen>
gestartet werden, wenn der Netzdurchsatz der in der Liste angegebenen Schnittstellen aufgezeichnet werden soll (vgl. Tabelle 1). Im Fenster sollte dann oben rechts in der Ecke Logging: enabled
stehen. Die Log-Dateien werden nach /tmp/cpunetlog
geschrieben und können mit dem Kommando
%run /CPUnetPLOT/cnl_plot.py -nsc 0.0011 /tmp/cpunetlog/<Log-Datei>
im Jupyter-Notebook plotting.ipynb
grafisch dargestellt werden. -nsc 0.0011
setzt das Maximum der Datenrate auf der Y-Achse auf 1,1 Mbit/s. Abbildung 2 zeigt eine beispielhafte Ausgabe. Legen Sie bitte für jede Messung, die Sie machen eine eigene Zelle Code in Ihrem Jupyter-Notebook an und speichern die Ausgabe dieser Zelle für Ihre Abgabe.
Abbildung 2: Ausgabe von cnl_plot.py
Für eine Aufzeichnung lassen sich Durchschnittswerte mit dem Kommando
%run /CPUnetPLOT/summary.py /tmp/cpunetlog/<Log-Datei>
in Ihrem Jupyter Notebook berechnen. Bitte legen Sie für jede Messung eine eigene Zelle Code in Ihrem Jupyter-Notebook an und speichern das Ergebnis darin ab, sodass Sie diese in Ihrer Abgabe präsentieren können.
Für den Versuch haben wir Ihnen in den Skripten unter ~/kn1lab/versuch4/scripts
eine Mininet-Topologie vorgegeben, die in Abbildung 3 dargestellt ist. Die Namen der Schnittstellen aller Hosts kann Tabelle 1 entnommen werden.
Abbildung 3: Verwendete Mininet-Topologie
Server (sv1 ) |
Client-1 (c1 ) |
Client-2 (c2 ) |
---|---|---|
sv1-eth0 (SSH) | c1-eth0 (SSH) | c2-eth0 (SSH) |
sv1-eth1 (10.11.0.3) | c1-eth1 (10.11.0.1) | c2-eth1 (10.12.0.2) |
sv1-eth2 (10.12.0.3) | ||
--nics sv1-eth1 sv1-eth2 |
--nics c1-eth1 |
--nics c2-eth1 |
Tabelle 1: Schnittstellen der Hosts in der Mininet-Topologie inkl. Parameter für cpunetlog
Die Leistungsmessung zwischen den Rechnern c1
, c2
und sv1
wird über die schwarz dargestellten Netzverbindungen und die Switches S1
und S2
erfolgen. Die rot dargestellten Netzverbindungen und der Switch S3
werden lediglich zur Steuerung der Experimente verwendet. Das Mininet-Netz kann beispielsweise mit
./runTopo.sh 1
gestartet werden.
Um iperf3
oder cpunetlog
auf einem der Rechner c1
, c2
oder sv1
zu starten, ist das Mininet-CLI nicht ausreichend. Stattdessen müssen Sie sich, während das Mininet-Skript läuft, über ein weiteres Terminal mithilfe von
ssh <Rechnername>
mit dem gewünschten Rechner verbinden.
- Das Python Script einer Mininet-Topologie kann mit dem Befehl quit beendet werden.
- Alle SSH-Sessions auf Clients und Server einer Mininet-Topolgie sollten getrennt werden bevor diese geschlossen wird. Anderenfalls kann sich die VM aufhängen und sie muss neu gestartet werden!
- Je iperf-Instanz wird ein eigenes Terminal benötigt.
- Damit
cnl_plot.py
korrekt funktioniert, müssen der virtuelle Maschine mindestens zwei virtuelle Prozessoren zugeordnet werden. Die besten Ergebnisse haben wir in der Regel erzielt, wenn es genau zwei Prozessoren sind. Bei mehr Prozessoren werden die gemessenen Kurven nicht mehr so eindeutig.
Verwenden Sie für diese Aufgabe die Mininet-Topologie mininet_1.py
.
iperf3 -c <IP-Addresse des Servers> -Z
-
Generieren Sie mit Hilfe von
iperf3
einen TCP-Datenstrom zwischen Clientc1
und Serversv1
. Dabei soll deriperf3
-Client aufc1
und deriperf3
-Server aufsv1
laufen. Ob Sie die IP-Adresse10.11.0.3
oder10.12.0.3
verwenden, ist Ihnen überlassen.iperf3
gibt das StaukontrollfensterCWND
des TCP-Datenstroms aus. Wie verhält sich dieses und wie hoch ist es, nachdem der Strom eine Weile gelaufen ist? Kopieren Sie die Ausgabe des Befehls am Besten in einer Markdown Zelle Ihres Jupyter-Notebooks. -
Zeichen Sie diesen Datenstrom nun auf dem Server
sv1
mit Hilfe voncpunetlog
für 1 Minute auf und stellen Sie das Ergebnis grafisch dar. Dazu müssen Sie über ein anderes Terminal eine weitere SSH-Verbindung zusv1
aufbauen. Achten Sie darauf, nur die Daten der relevanten Netzwerkschnittstelle aufzuzeichnen, sowie die Plots entsprechend zu skalieren und die Ergebnisse in Ihrem Jupyter-Notebook festzuhalten. -
Bestimmen Sie mit
summary.py
die durchschnittliche Auslastung der Netzschnittstelle (receive
) und dokumentieren Sie dieses Ergebniss ebenfalls in Ihrem Jupyter-Notebook.
Verwenden Sie für diese Aufgabe ebenfalls die Mininet-Topologie mininet_1.py
. Wir wollen nun untersuchen, ob sich zwei TCP-Datenströme die verfügbare Datenrate fair teilen. Dazu benötigen wir zwei Datenströme, jeweils einen von Client c1
bzw. Client c2
zu Server sv1
. Zu beachten sind die zwei Netzschnittstellen des Servers sv1
; jede befindet sich in einem anderen Subnetz. Um die zwei Datenströme mit cpunetlog
unterscheiden zu können, ist es notwendig, dass die TCP-Ströme jeweils an einem eigenen iperf3
-Server je Schnittstelle ankommen. Anderenfalls kann nicht zentral auf dem Server gemessen werden, welcher Datenstrom welchen Durchsatz erreicht.
-
Erstellen Sie die notwendigen Datenströme mit
iperf3
, zeichnen Sie diese auf den Server mitcpunetlog
für 1 Minute auf und stellen Sie das Ergebnis grafisch dar. -
Wie war diesmal die durchschnittliche Auslastung der Netzverbindung, war diese besser oder schlechter als für einen einzelnen Strom?
-
War die Aufteilung der Datenrate fair?
-
Wiederholen Sie das Experiment, indem sie nun einen TCP-Strom gegen einen UDP-Strom testen. Was ist das Ergebnis?
In dieser Aufgabe simulieren wir eine schlechte Verbindung vom Client zum Server, indem wir den Paketverlust auf der Leitung zwischen den zwei Switches von 0% auf 5% erhöhen. Verwenden Sie für diese Aufgabe die Mininet-Topologie mininet_2.py
.
-
Erstellen Sie einen TCP-Datenstrom vom Client
c1
zum Serversv1
und zeichnen Sie diesen auf dem Server für 1 Minute auf. Wenn Sie den WertCWND
, deniperf3
ausgibt, beobachten und mit dem aus Aufgabe 1.1 vergleichen, was fällt Ihnen auf? Warum ist dies so? Kopieren Sie die Ausgabe dieses Befehls am Besten ebenfalls in einer Markdown Zelle Ihres Jupyter-Notebooks. -
Stellen Sie das Ergebnis grafisch dar und vergleichen Sie es mit dem aus Aufgabe 1.2, achten Sie vor allem auf den durchschnittlichen Durchsatz. Weichen die Ergebnisse signifikant ab? Wenn ja, warum könnte dies so sein?
Verwenden Sie für diese Aufgabe die Mininet-Topologie mininet_3.py
, in dem der Paketverlust auf der Leitung zwischen den zwei Switches auf 10% erhöht wurde.
- Erstellen Sie einen UDP-Datenstrom vom Client
c1
zum Serversv1
. Messen Sie nun sowohl die gesendeten Daten auf Client-Seite als auch empfangenen Daten auf Server-Seite jeweils mitcpunetlog
. Was fällt Ihnen bezüglich der Datenrate auf, wenn Sie den Durchsatz beider Aufzeichnungen vergleichen? Was ist der Grund für dieses Verhalten?