---- 0-TH SEC: ----
<--------------------------| | | |<-------------------CUBIC
| | 500ms | |
CUBIC--------------------->| | ^^^^^5ms | |------------------------>
| | 10ms| | | |
| |---120Mbps,20ms--| |
| | | |
| | 15-TH SEC: | |
VEGAS---120Mbps,2000pkts-->| | | |--120Mbps,5ms,3000pkts-->
| | | |
VEGAS---120Mbps,2000pkts-->| | | |--120Mbps,5ms,3000pkts-->
---- 30 SECS ----
CoCo-Beholder ist ein benutzerfreundlicher virtueller Netzwerkemulator, der die beliebte Hanteltopologie jeder Größe bietet. Jede Verbindung der Topologie kann über eine individuelle Rate, Verzögerung und Warteschlangengröße verfügen. Die zentrale Verbindung kann auch eine variable Verzögerung mit optionalem Jitter haben. Flüsse unterschiedlicher Schemata können in der Topologie für eine angegebene Laufzeit von Sekunden zusammen ausgeführt werden. Für jeden Fluss können seine Richtung und die Startsekunde der Laufzeit gewählt werden.
Jeder Fluss hat einen Host in der linken Hälfte und einen Host in der rechten Hälfte der Topologie und die Hosts tauschen den Datenverkehr eines Schemas aus, wobei ein Host der Sender und einer der Empfänger ist. Es gibt den linken Router, der alle Hosts in der linken Hälfte der Topologie miteinander verbindet, und den rechten Router, der alle Hosts in der rechten Hälfte der Topologie miteinander verbindet. Alle Flüsse teilen sich die gemeinsame zentrale Verbindung zwischen den beiden Routern.
Testen
Analyse
Erstellung von Diagrammen und Statistiken
Installation
Fehlerbehebung bei einem Schema
Hinzufügen eines neuen Schemas
Python-Unterstützung
Bibliotheken von Drittanbietern
Urheberschaft
Kontakt
Dieser Befehl gibt den Pfad zur Sammlung an, die die zu testenden Schemata enthält, und führt den Test 30 Sekunden lang aus, wobei die zentrale Verbindung eine Rate von 120 Mbit/s und eine variable Verzögerung aufweist (Basisverzögerung 20 ms, Delta 500 ms, Schritt 10 ms, Jitter 5). MS):
./run.py -p ~ /pantheon 20ms 0.5s 10ms 5ms -t 30 -r 120 -s 12345
Wenn dies die erste Ausführung des Skripts ist, wird die unten gezeigte Standardlayoutdatei layout.yml
generiert und verwendet. Der resultierende Testaufbau ist in der Zeichnung der Hanteltopologie oben auf dieser Seite dargestellt. Die Layoutdatei kann bearbeitet werden, um viel komplexere Testaufbauten mit mehr Abläufen zu erhalten, die zu verschiedenen Schemata gehören und über unterschiedliche Netzwerkeinstellungen verfügen.
# Delays/rates are optional: if lacking or null, they are set to 0us/0.0
# and for netem, to set delay/rate to zero is same as to leave it unset.
# Sizes of queues are optional: if lacking or null, they are set to 1000.
- direction : <-
flows : 1
left-delay : null
left-queues : null
left-rate : null
right-delay : null
right-queues : null
right-rate : null
scheme : cubic
start : 0
- direction : ->
flows : 2
left-delay : 0us
left-queues : 2000
left-rate : 120.0
right-delay : 5ms
right-queues : 3000
right-rate : 120
scheme : vegas
start : 15
- direction : ->
flows : 1
scheme : cubic
start : 0
Rate, Verzögerung und Warteschlangengröße werden immer an beiden Schnittstellen an den Enden jeder Verbindung in der Topologie mithilfe tc
qdisc NetEm Link-Emulators installiert. Dies bedeutet insbesondere, dass die RTT einer Verbindung das Doppelte der (einseitigen) Verzögerung beträgt. Nur der zentrale Link darf an seinen Enden zwei unterschiedliche Warteschlangengrößen der Schnittstellen haben – siehe Argumente -q1
, -q2
, -q
in der Hilfemeldung des Skripts. Standardmäßig bestehen beide Warteschlangen aus 1000 Paketen.
Die variable Verzögerung am zentralen Link wird durch vier Positionsargumente definiert: Basisverzögerung, Delta, Schritt und Jitter, wobei der Jitter übersprungen werden kann. Bei jeder Delta-Zeit wird die Verzögerung schrittweise erhöht oder verringert, abhängig von einem Pseudozufallsgenerator, dessen Startwert mit dem Argument -s
angegeben werden kann oder dem die aktuelle UNIX-Zeit zugewiesen wird. Um eine konstante Verzögerung am zentralen Link zu erhalten, wählen Sie Delta >= Laufzeit -t
.
In ein ausgewähltes Ausgabeverzeichnis wird die Datei metadata.json
geschrieben, die alle Parameter des Tests enthält, einschließlich des Generator-Seeds. Die Datei kann in Zukunft an CoCo-Beholder weitergeleitet werden, um den Test vollständig zu reproduzieren. Außerdem werden während des Tests PCAP-Dump-Dateien auf allen Hosts der Hantel-Topologie mit tcpdump
im Ausgabeverzeichnis aufgezeichnet. Für das Beispiel in der Zeichnung wurden also acht PCAP-Dump-Dateien aufgezeichnet.
Hinweis Nr. 1: Die maximale Verzögerung für jede Verbindung – seitlich und zentral (Jitter wird nicht gezählt) – kann mit der Option -m
angegeben werden. Um eine Rechteckverzögerung am zentralen Link zu erhalten, stellen Sie die maximale Verzögerung auf die Summe aus Basisverzögerung und Schritt ein.
Hinweis Nr. 2: Das Testskript ruft setup_after_reboot
auf dem Pantheon-Wrapper jedes Schemas in der Layoutdatei auf, bevor die Abläufe der Schemata gestartet werden, sodass der Benutzer die Schemata nicht nach jedem Neustart manuell einrichten muss.
Das Analyseskript akzeptiert nur zwei Argumente: den Eingabeordner und den Ausgabeordner – standardmäßig dumps
und graphs/data
.
Zunächst kopiert das Skript einfach die Metadatendatei aus dem Eingabeordner in den Ausgabeordner. Anschließend verarbeitet das Skript ein Paar PCAP-Dumps <flow's starting #>-<scheme>-<sender/receiver>.pcap
jedes Flows und extrahiert Informationen zu den Paketen des Flows in die individuelle JSON-Datenprotokolldatei des Flows. Beispielsweise wird für zwei Dumps mit ca. 12 GB eine Datenprotokolldatei mit ca. 300 MB erstellt.
Die Teilausgabe des Analyseskripts für das Beispiel in der Zeichnung:
./analyze.py
cubic scheme, flow 1:
sender dump: 100.0% in 5.18s
Total: 222667 pkts/224631734 bytes, from sender: 144906 pkts/219351284 bytes
receiver dump: 100.0% in 5.37s
Total: 222245 pkts/223376026 bytes, from sender: 144052 pkts/218058328 bytes
♥ Union of data from sender recorded on both sides: 144906 pkts/219351284 bytes
♦ Subset of ♥ which was not recorded at sender : 0 pkts/0 bytes
♣ Subset of ♥ which was not recorded at receiver : 854 pkts/1292956 bytes
♠ Loss (ratio of ♣ bytes to ♥ bytes) : 0.589%
Saving the data of the flow to the file...
==========================================
# and so on for the three more flows...
Für die zukünftige Erstellung von Diagrammen und Statistiken werden die PCAP-Dumps nicht mehr benötigt. Die Analyse der PCAP-Dumps wird nur einmal durchgeführt, und dann kann das Plotskript so oft wie nötig über die Datenprotokolldateien ausgeführt werden, um schnell verschiedene Plots zu erstellen.
Das Plotskript plot.py
liest Datenprotokolldateien der Flüsse und generiert Diagramme und Statistiken im Ausgabeordner (standardmäßig graphs
). Es können verschiedene Arten von Diagrammen und Statistiken erstellt werden:
-f, --per-flow Graphs and stats are generated per flow, i.e. each
graph has a separate curve per flow
-t, --total Total graphs and stats are generated for all flows
altogether, i.e. each graph has only one curve
-s "FIELD1 FIELD2...", --per-subset "FIELD1 FIELD2..."
Graphs and stats are generated per subset, i.e. each
graph has one curve per subset. Flows are in one
subset if they have the same values of the chosen
layout field(s). E.g. for -s "scheme direction", each
graph will have one curve per subset of flows having
both the same scheme name and direction. Currently
allowed layout fields: ['scheme', 'direction'].
Für einen ausgewählten Typ werden drei Liniendiagramme und ein Streudiagramm generiert:
Oben kann man beispielsweise das Einweg-Verzögerungsdiagramm pro Fluss und Paket für den Aufbau in der Zeichnung sehen.
Durchschnittsdiagramme werden pro Aggregationszeitintervall gemittelt: jede positive Gleitkommazahl, die mit dem Argument -i
angegeben wird, oder standardmäßig 0,5 Sekunden.
Das Indexdiagramm von Average Jain enthält immer eine Kurve, die über die Kurven berechnet wird, die im entsprechenden Diagramm des durchschnittlichen Durchsatzes vorhanden sind.
Die Argumente -c
und -j
ermöglichen eine flexible Änderung der Kurvenfarben in Diagrammen.
Für einen ausgewählten Typ wird die Statistikdatei generiert. Es ist unabhängig vom gewählten Aggregationsintervall und enthält:
Die gesamte durchschnittliche Einwegverzögerung und die gesamte durchschnittliche Einwegverzögerung pro Paket einer Kurve sind die gleichen Werte, die auf unterschiedliche Weise berechnet wurden.
Der Installationsprozess ist wie folgt:
Installieren Sie die Pantheon-Sammlung von Überlastungskontrollschemata und fügen Sie der Sammlung bei Bedarf lokal weitere Schemata hinzu
Installieren Sie den CoCo-Beholder-Emulator mithilfe seines Installationsskripts
Erledigt. Testen Sie die Schemata in der Sammlung mit CoCo-Beholder.
Die Installation von CoCo-Beholder selbst ist trivial und das Installationsskript install.sh
ist super einfach und kurz. Die Installation der Pantheon-Sammlung von Schemata verursacht jedoch oft viele Probleme. Außerdem haben einige Linux-Distributionen einfach Fehler. Bitte beachten Sie daher die detaillierten Anweisungen zur Installation unter Ubuntu 16.04, Ubuntu 18.04 und Debian 10.
Die folgenden Anweisungen wurden auf der VM mit einer Neuinstallation von Ubuntu 16.04.6-desktop-amd64 (November 2019) getestet.
Als allgemeiner Hinweis: Wenn Sie das BBR-Schema (TCP BBRv1.0) benötigen, stellen Sie sicher, dass Sie einen Linux-Kernel >=4.9 verwenden.
Neue Versionen von 16.04 LTS (16.04.5 und höher) werden mit dem Linux-Kernel 4.15 geliefert. CoCo-Beholder verwendet tc qdisc NetEm-Verzögerungsjitter , der im Ubuntu-Kernel 4.15 unterbrochen ist. Die Lösung:
sudo apt-get install linux-image-4.13.0-39-generic linux-headers-4.13.0-39
linux-headers-4.13.0-39-generic linux-image-extra-4.13.0-39-generic
Kommentieren Sie in der Datei /etc/default/grub
die Zeile GRUB_HIDDEN_TIMEOUT=0
aus und führen Sie den Befehl sudo update-grub
aus. Dadurch können Sie das Grub-Menü nach dem Neustart sehen.
Starten Sie neu und wählen Sie im Grub-Menü „ Advanced options for Ubuntu
und dort Ubuntu, with Linux 4.13.0-39-generic
. Überprüfen Sie den laufenden Kernel mit dem Befehl uname -ar
.
Laden Sie das Pantheon-Git-Repository und die Git-Submodule der enthaltenen Schemata herunter:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
) überspringen. Sie müssen nur die Schemata mit den folgenden Befehlen installieren. Wenn der letzte Befehl einen Fehler wie Command "python setup.py egg_info" failed with error code 1...
anzeigt, führen Sie sudo pip install --upgrade pip
aus und wiederholen Sie den fehlgeschlagenen Befehl. sudo apt-get install autoconf # for verus
sudo apt-get install nodejs-legacy # for webrtc
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
Jetzt können Sie die Schemata testen.
Die folgenden Anweisungen wurden auf der VM mit einer Neuinstallation von Ubuntu 18.04.3-desktop-amd64 (November 2019) getestet.
Als allgemeiner Hinweis: Wenn Sie das BBR-Schema (TCP BBRv1.0) benötigen, stellen Sie sicher, dass Sie einen Linux-Kernel >=4.9 verwenden.
Der Ubuntu-Kernel 4.15 hat den Fehler. Mit Ubuntu >=18.04.3 erhalten Sie einen Kernel >=5.0, also fahren Sie bitte mit dem nächsten Schritt fort.
Laden Sie das Pantheon-Git-Repository und die Git-Submodule der enthaltenen Schemata herunter:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
) überspringen. Sie müssen nur die Schemata mit den folgenden Befehlen installieren. sudo apt-get install autoconf # for verus
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
Jetzt können Sie die Schemata testen.
Die folgenden Anweisungen wurden auf der VM mit einer Neuinstallation von Debian 10.1.0-amd64-netinst (November 2019) getestet.
Als allgemeiner Hinweis: Wenn Sie das BBR-Schema (TCP BBRv1.0) benötigen, stellen Sie sicher, dass Sie einen Linux-Kernel >=4.9 verwenden.
Der Ubuntu-Kernel 4.15 hat den Fehler. Es ist nicht klar, ob dieses Problem beim Debian-Kernel 4.15 auftritt. Wie auch immer, mit Debian >=10.1.0 erhalten Sie einen Kernel >=4.19, also fahren Sie bitte mit dem nächsten Schritt fort.
Laden Sie das Pantheon-Git-Repository und die Git-Submodule der enthaltenen Schemata herunter:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
) überspringen. Sie müssen nur die Schemata installieren. Installieren Sie zunächst die Abhängigkeiten der Schemata: sed -i ' s/chromium-browser/chromium/g ' src/wrappers/webrtc.py # for webrtc
sudo apt-get install python-pip && sudo pip install pyyaml # for setup.py
src/experiments/setup.py --install-deps (--all | --schemes " <cc1> <cc2> ... " )
Fügen Sie die Zeichenfolge export PATH=/usr/sbin:$PATH
zu Ihrer ~/.bashrc
Datei hinzu und führen Sie den Befehl source ~/.bashrc
aus. Dadurch wird das Dienstprogramm /usr/sbin/sysctl
aktiviert, das nicht nur während der Installation, sondern auch später erforderlich ist.
Um Verus zu erstellen, müssen Sie ein Downgrade Ihrer Alblib-Bibliothek durchführen. Fügen Sie also bitte deb <URL> stretch main
zu Ihrer /etc/apt/sources.list
hinzu und führen Sie Folgendes aus:
sudo apt-get update
sudo apt-get remove libalglib-dev # remove 3.14 version
sudo apt-get install -t stretch libalglib-dev # install 3.10 version
sudo apt-get install autoconf # for verus
myregex= ' s/milliseconds((.+))/milliseconds(int(1))/g '
sed -i $myregex third_party/verus/src/verus_client.cpp
sed -i $myregex third_party/verus/src/verus_server.cpp
sudo apt-get install pkg-config # for sprout
sudo apt-get install libtinfo5 # for quic
# During the setup, do not be afraid of CERTIFICATE_VERIFY_FAILED errors by quic
src/experiments/setup.py --setup (--all | --schemes " <cc1> <cc2> ... " )
cd coco-beholder && sudo ./install.sh
# matplotlib will give Python backports.functools_lru_cache error. To solve:
sudo pip install arrow==0.12.0
Jetzt können Sie die Schemata testen.
cd pantheon
src/wrappers/vegas.py setup_after_reboot # setup the scheme once after reboot
src/wrappers/vegas.py run_first # who is server: sender or receiver
# receiver
src/wrappers/vegas.py receiver 54321 # start server in one shell
src/wrappers/vegas.py sender 127.0.0.1 54321 # start client in another shell
sudo pkill -9 -f vegas # kill all the started processes
cd coco-beholder
myregex= ' s/((.+)).pid/(1, stdout=None, stderr=None).pid/g '
sed -i " $myregex " variable_delay/src/test/test.py
Wenn Sie ein Schema testen möchten, das nicht in der Pantheon-Sammlung vorhanden ist, können Sie es wie folgt lokal hinzufügen:
find /lib/modules/ ` (uname -r) ` /kernel -type f -name * cdg *
# /lib/modules/4.19.0-6-amd64/kernel/net/ipv4/tcp_cdg.ko
pantheon/src/config.yml
einen neuen cdg
Eintrag hinzu, der die Liste aller Schemata in der Sammlung enthält. Die Farbe, der Name und die Markierung können beliebig sein, da CoCo-Beholder sie nicht liest. cdg :
name : TCP CDG
color : red
marker : ' x '
cp pantheon/src/wrappers/vegas.py pantheon/src/wrappers/cdg.py
sed -i 's/vegas/cdg/g' pantheon/src/wrappers/cdg.py
Jetzt können Sie cdg wie gewohnt mit CoCo-Beholder testen, indem Sie cdg-Flows in der Layoutdatei angeben.
CoCo-Beholder funktioniert garantiert mit Python 2.7, 3.5, 3.6 und 3.7. Das Installationsskript install.sh
von CoCo-Beholder installiert standardmäßig Abhängigkeiten der Python 2-Bibliothek. Für Python 3 kommentieren Sie bitte die entsprechenden Zeilen im Installationsskript aus.
CoCo-Beholder nutzt die Mininet-Bibliothek: ihre API, die es ermöglicht, einen virtuellen Host als UNIX-Shell in einem separaten Netzwerk-Namespace zu erstellen, eine Veth-Pair-Verbindung zwischen einem Paar virtueller Hosts zu erstellen und Prozesse auf einem virtuellen Host zu starten. CoCo-Beholder verwendet keine Controller, Switch, Topology, TCLink oder andere übergeordnete Einheiten von Mininet. Um künftigen Kompatibilitätsproblemen vorzubeugen und die Installation von CoCo-Beholder zu vereinfachen, sind die benötigten Teile von Mininet 2.3.0d5 gemäß der Mininet-Lizenz als Bibliothek eines Drittanbieters im CoCo-Beholder-Repository enthalten.
Evgeniya Khasina implementierte das Programm im Rahmen der Masterarbeit „The CoCo-Beholder: Enabling Comprehensive Evaluation of Congestion Control Algorithms“ an der Universität des Saarlandes im Jahr 2019 unter der Betreuung von Professorin Anja Feldmann und Dr. Corinna Coupette am Institut für Internetarchitektur von Max-Planck Institut für Informatik.
Bei Fragen zum Programm können Sie mir, Evgeniya Khasina, an meine E-Mail-Adresse schreiben.