---- 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 est un émulateur de réseau virtuel convivial offrant la topologie d'haltères populaire de toute taille. Chaque lien de la topologie peut avoir un débit, un délai et une taille de file d'attente individuels. La liaison centrale peut également avoir un retard variable avec une gigue optionnelle. Des flux de différents schémas peuvent s'exécuter ensemble dans la topologie pendant une durée d'exécution spécifiée de quelques secondes. Pour chaque flux, sa direction et la seconde de départ du temps d'exécution peuvent être choisies.
Chaque flux a un hôte dans la moitié gauche et un hôte dans la moitié droite de la topologie et les hôtes échangent le trafic d'un schéma, un hôte étant l'expéditeur et un autre le récepteur. Il y a le routeur de gauche qui interconnecte tous les hôtes de la moitié gauche et le routeur de droite qui interconnecte tous les hôtes de la moitié droite de la topologie. Tous les flux partagent le lien central commun entre les deux routeurs.
Essai
Analyse
Génération de tracés et de statistiques
Installation
Dépannage d'un schéma
Ajouter un nouveau schéma
Prise en charge de Python
Bibliothèques tierces
Paternité
Contact
Cette commande spécifie le chemin d'accès à la collection contenant les schémas à tester et exécute le test pendant 30 secondes, avec la liaison centrale ayant un débit de 120 Mbps et un délai variable (le délai de base 20 ms, delta 500 ms, pas de 10 ms, gigue 5 MS):
./run.py -p ~ /pantheon 20ms 0.5s 10ms 5ms -t 30 -r 120 -s 12345
S'il s'agit de la première exécution du script, le fichier de mise en page par défaut layout.yml
, illustré ci-dessous, est généré et utilisé. La configuration de test résultante est présente dans le dessin de la topologie de l'haltère en haut de cette page. Le fichier de mise en page peut être modifié pour obtenir des configurations de test beaucoup plus complexes avec davantage de flux appartenant à différents schémas et ayant divers paramètres réseau.
# 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
Le débit, le délai et la taille de la file d'attente sont toujours installés au niveau des deux interfaces aux extrémités de chaque lien dans la topologie à l'aide de l'émulateur de lien tc
qdisc NetEm. En particulier, cela signifie que le RTT d'une liaison est deux fois supérieur au délai (unidirectionnel). Seul le lien central peut avoir deux tailles de file d'attente différentes des interfaces à ses extrémités – voir les arguments -q1
, -q2
, -q
dans le message d'aide du script. Par défaut, les deux files d'attente sont de 1 000 paquets.
Le délai variable au niveau de la liaison centrale est défini par quatre arguments de position : le délai de base, le delta, le pas et la gigue, où la gigue peut être ignorée. À chaque temps delta, le délai est augmenté ou diminué pas à pas en fonction d'un générateur pseudo-aléatoire, dont la graine peut être spécifiée avec l'argument -s
ou se voit attribuer l'heure UNIX actuelle. Pour avoir un délai constant au niveau du lien central, choisissez le delta >= le runtime -t
.
Dans un répertoire de sortie choisi, le fichier metadata.json
est écrit contenant tous les paramètres du test, y compris la graine du générateur. Le fichier pourra être transmis à CoCo-Beholder à l'avenir pour reproduire entièrement le test. De plus, pendant les tests, les fichiers de vidage PCAP sont enregistrés sur tous les hôtes de la topologie haltère dans le répertoire de sortie à l'aide tcpdump
. Ainsi, pour l'exemple du dessin, huit fichiers de vidage PCAP ont été enregistrés.
Remarque n°1 : Le délai maximum pour chaque liaison – latérale et centrale (gigue non comptée) – peut être spécifié avec l'option -m
. Pour avoir un retard d'onde carrée au niveau de la liaison centrale, définissez le retard maximum sur la somme du retard de base et du pas.
Remarque n°2 : le script de test appelle setup_after_reboot
sur le wrapper Pantheon de chaque schéma dans le fichier de mise en page avant de lancer tout flux des schémas, afin que l'utilisateur n'ait pas à configurer manuellement les schémas après chaque redémarrage.
Le script d'analyse n'accepte que deux arguments : le dossier d'entrée et le dossier de sortie – dumps
et graphs/data
par défaut.
Tout d’abord, le script copie simplement le fichier de métadonnées du dossier d’entrée vers le dossier de sortie. Ensuite, le script traite une paire de vidages PCAP <flow's starting #>-<scheme>-<sender/receiver>.pcap
de chaque flux et extrait des informations sur les paquets du flux dans le fichier journal de données JSON individuel du flux. Par exemple, pour deux sauvegardes d'environ 12 Go, un fichier journal de données d'environ 300 Mo est produit.
Résultat partiel du script d'analyse pour l'exemple du dessin :
./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...
Pour les prochaines générations de graphiques et de statistiques, les dumps PCAP ne sont plus nécessaires. L'analyse des vidages PCAP n'est effectuée qu'une seule fois, puis le script de traçage peut être exécuté autant de fois que nécessaire sur les fichiers journaux de données pour produire rapidement divers tracés.
Le script de traçage plot.py
lit les fichiers journaux de données des flux et génère des tracés et des statistiques dans le dossier de sortie ( graphs
par défaut). Différents types de tracés et de statistiques peuvent être générés :
-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'].
Pour un type sélectionné, trois tracés linéaires et un nuage de points sont générés :
Par exemple, ci-dessus, on peut voir le tracé du délai unidirectionnel par flux et par paquet pour la configuration dans le dessin.
Les tracés moyens sont calculés en fonction d'un intervalle de temps d'agrégation : tout nombre flottant positif fourni avec l'argument -i
ou 0,5 seconde par défaut.
Le tracé d'index de Jain moyen contient toujours une courbe qui est calculée sur les courbes présentes dans le tracé de débit moyen correspondant.
Les arguments -c
et -j
permettent de changer les couleurs des courbes dans les tracés de manière flexible.
Pour un type sélectionné, le fichier de statistiques est généré. Il ne dépend pas de l'intervalle d'agrégation choisi et contient :
Le délai unidirectionnel moyen global et le délai unidirectionnel moyen global par paquet d'une courbe sont les mêmes valeurs calculées de différentes manières.
Le processus d'installation est le suivant :
Installez la collection Pantheon de systèmes de contrôle de la congestion et, si nécessaire, ajoutez d'autres systèmes à la collection localement.
Installez l'émulateur CoCo-Beholder à l'aide de son script d'installation
Fait. Testez les schémas de la collection à l'aide de CoCo-Beholder.
L'installation de CoCo-Beholder elle-même est triviale, et son script d'installation install.sh
est super simple et court. Cependant, l’installation de la collection de schémas Pantheon pose souvent de nombreux problèmes. De plus, certaines distributions Linux ont simplement des bugs. Veuillez donc consulter les instructions détaillées pour l'installation sur Ubuntu 16.04, Ubuntu 18.04 et Debian 10.
Les instructions ci-dessous ont été testées sur la machine virtuelle avec une nouvelle installation d'Ubuntu 16.04.6-desktop-amd64 (novembre 2019).
De manière générale : si vous avez besoin du schéma bbr (TCP BBRv1.0), assurez-vous d'utiliser le noyau Linux >=4.9.
Les nouvelles versions de 16.04 LTS (16.04.5 et supérieures) sont livrées avec le noyau Linux 4.15. CoCo-Beholder utilise la gigue de retard tc qdisc NetEm qui est interrompue sur le noyau Ubuntu 4.15. La solution :
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
Dans le fichier /etc/default/grub
, commentez la ligne GRUB_HIDDEN_TIMEOUT=0
et exécutez la commande sudo update-grub
. Cela vous permettra de voir le menu Grub après le redémarrage.
Redémarrez et dans le menu Grub, choisissez Advanced options for Ubuntu
et là Ubuntu, with Linux 4.13.0-39-generic
. Vérifiez le noyau en cours d'exécution avec la commande uname -ar
.
Téléchargez le référentiel git Pantheon et les sous-modules git des schémas inclus :
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Vous devez installer uniquement les schémas à l'aide des commandes ci-dessous. Si la dernière commande vous donne une erreur telle que Command "python setup.py egg_info" failed with error code 1...
, puis exécutez sudo pip install --upgrade pip
et répétez la commande ayant échoué. 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
Vous êtes maintenant prêt à tester les schémas.
Les instructions ci-dessous ont été testées sur la machine virtuelle avec une nouvelle installation d'Ubuntu 18.04.3-desktop-amd64 (novembre 2019).
De manière générale : si vous avez besoin du schéma bbr (TCP BBRv1.0), assurez-vous d'utiliser le noyau Linux >=4.9.
Le noyau Ubuntu 4.15 a le bug. Avec Ubuntu >=18.04.3, vous obtenez un noyau >=5.0, alors veuillez passer à l'étape suivante.
Téléchargez le référentiel git Pantheon et les sous-modules git des schémas inclus :
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Vous devez installer uniquement les schémas à l'aide des commandes ci-dessous. 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
Vous êtes maintenant prêt à tester les schémas.
Les instructions ci-dessous ont été testées sur la VM avec une nouvelle installation de Debian 10.1.0-amd64-netinst (novembre 2019).
De manière générale : si vous avez besoin du schéma bbr (TCP BBRv1.0), assurez-vous d'utiliser le noyau Linux >=4.9.
Le noyau Ubuntu 4.15 a le bug. Il n'est pas clair si le noyau Debian 4.15 présente ce problème. Quoi qu'il en soit, avec Debian >=10.1.0, vous obtenez un noyau >=4.19 alors, s'il vous plaît, passez à l'étape suivante.
Téléchargez le référentiel git Pantheon et les sous-modules git des schémas inclus :
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Vous devez installer uniquement les schémas. Tout d'abord, installez les dépendances des schémas : 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> ... " )
Ajoutez la chaîne export PATH=/usr/sbin:$PATH
à votre fichier ~/.bashrc
et exécutez la commande source ~/.bashrc
. Cela activera l'utilitaire /usr/sbin/sysctl
, qui est nécessaire non seulement pendant l'installation mais aussi plus tard.
Pour construire Verus, vous devez rétrograder votre bibliothèque alglib. Alors, s'il vous plaît, ajoutez la ligne deb <URL> stretch main
à votre /etc/apt/sources.list
et exécutez :
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
Vous êtes maintenant prêt à tester les schémas.
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
Si vous souhaitez tester un schéma qui n'est pas présent dans la collection Panthéon, vous pouvez l'ajouter localement comme suit :
find /lib/modules/ ` (uname -r) ` /kernel -type f -name * cdg *
# /lib/modules/4.19.0-6-amd64/kernel/net/ipv4/tcp_cdg.ko
cdg
au fichier pantheon/src/config.yml
qui conserve la liste de tous les schémas de la collection. La couleur, le nom et le marqueur peuvent être n'importe lesquels car CoCo-Beholder ne les lit pas. 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
Vous pouvez maintenant tester cdg avec CoCo-Beholder comme d'habitude en spécifiant les flux cdg dans le fichier de mise en page.
CoCo-Beholder est assuré de fonctionner avec Python 2.7, 3.5, 3.6 et 3.7. Le script d'installation de CoCo-Beholder install.sh
installe les dépendances de la bibliothèque Python 2 par défaut. Pour Python 3, veuillez commenter les lignes correspondantes dans le script d'installation.
CoCo-Beholder utilise la bibliothèque Mininet : son API qui permet de créer un hôte virtuel en tant que shell UNIX dans un espace de noms réseau distinct, de créer un lien de paire veth entre une paire d'hôtes virtuels et de lancer des processus sur un hôte virtuel. CoCo-Beholder n'utilise pas de contrôleur, de commutateur, de topologie, de TCLink ou d'autres entités de niveau supérieur de Mininet. Pour éviter tout problème de compatibilité futur et faciliter l'installation de CoCo-Beholder, les parties nécessaires de Mininet 2.3.0d5 sont incluses dans le référentiel CoCo-Beholder en tant que bibliothèque tierce selon la licence Mininet.
Evgeniya Khasina a mis en œuvre le programme dans le cadre du mémoire de maîtrise « The CoCo-Beholder : Enabling Comprehensive Evaluation of Congestion Control Algorithms » à l'Université de la Sarre en 2019 sous la direction du professeur Anja Feldmann et du Dr Corinna Coupette du département d'architecture Internet de Max Planck. Institut d'informatique.
Pour toute question sur le programme, vous pouvez m'écrire, Evgeniya Khasina, à mon adresse E-mail.