---- 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 es un emulador de red virtual amigable para los humanos que proporciona la popular topología con mancuernas de cualquier tamaño. Cada enlace de la topología puede tener una velocidad, un retraso y un tamaño de cola individuales. El enlace central también puede tener un retraso variable con fluctuación opcional. Los flujos de diferentes esquemas pueden ejecutarse juntos en la topología durante un tiempo de ejecución específico de segundos. Para cada flujo se puede elegir su dirección y el segundo de inicio del tiempo de ejecución.
Cada flujo tiene un host en la mitad izquierda y un host en la mitad derecha de la topología y los hosts intercambian el tráfico de un esquema siendo un host el remitente y el otro el receptor. Está el enrutador izquierdo que interconecta todos los hosts en la mitad izquierda y el enrutador derecho que interconecta todos los hosts en la mitad derecha de la topología. Todos los flujos comparten el enlace central común entre los dos enrutadores.
Pruebas
Análisis
Generación de gráficos y estadísticas
Instalación
Solución de problemas de un esquema
Agregar un nuevo esquema
Soporte de Python
Bibliotecas de terceros
Paternidad literaria
Contacto
Este comando especifica la ruta a la colección que contiene los esquemas a probar y ejecuta la prueba durante 30 segundos, con el enlace central con una velocidad de 120 Mbps y un retraso variable (el retraso base es de 20 ms, el delta es de 500 ms, el paso es de 10 ms, el jitter es de 5 ms). EM):
./run.py -p ~ /pantheon 20ms 0.5s 10ms 5ms -t 30 -r 120 -s 12345
Si esta es la primera ejecución del script, se genera y utiliza el archivo de diseño predeterminado layout.yml
, que se muestra a continuación. La configuración de prueba resultante está presente en el dibujo de la topología con mancuernas en la parte superior de esta página. El archivo de diseño se puede editar para obtener configuraciones de prueba mucho más complejas con más flujos pertenecientes a varios esquemas y con diversas configuraciones de red.
# 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
La velocidad, el retraso y el tamaño de la cola siempre se instalan en ambas interfaces en los extremos de cada enlace en la topología utilizando el emulador de enlaces tc
qdisc NetEm. En particular, esto significa que el RTT de un enlace es el doble del retraso (unidireccional). Solo el enlace central puede tener dos tamaños de cola diferentes de las interfaces en sus extremos; consulte los argumentos -q1
, -q2
, -q
en el mensaje de ayuda del script. De forma predeterminada, ambas colas son de 1000 paquetes.
El retardo variable en el enlace central se define mediante cuatro argumentos posicionales: retardo base, delta, paso y fluctuación, donde se puede omitir la fluctuación. Cada tiempo delta, el retraso aumenta o disminuye paso a paso dependiendo de un generador pseudoaleatorio, cuya semilla se puede especificar con el argumento -s
o se le asigna el tiempo UNIX actual. Para tener un retraso constante en el enlace central, elija delta >= the runtime -t
.
En un directorio de salida elegido, se escribe el archivo metadata.json
que contiene todos los parámetros de la prueba, incluida la semilla del generador. Es posible que el archivo se envíe a CoCo-Beholder en el futuro para reproducir completamente la prueba. Además, durante las pruebas, los archivos de volcado de PCAP se registran en todos los hosts de la topología de pesas en el directorio de salida mediante tcpdump
. Entonces, para el ejemplo del dibujo, se registraron ocho archivos de volcado PCAP.
Nota #1: El retardo máximo para cada enlace (lateral y central (sin contar la fluctuación)) se puede especificar con la opción -m
. Para tener un retraso de onda cuadrada en el enlace central, establezca el retraso máximo en la suma del retraso base y el paso.
Nota #2: El script de prueba llama setup_after_reboot
en el contenedor Pantheon de cada esquema en el archivo de diseño antes de iniciar cualquier flujo de los esquemas, por lo que el usuario no tiene que configurar los esquemas manualmente después de cada reinicio.
El script de análisis solo acepta dos argumentos: la carpeta de entrada y la carpeta de salida ( dumps
y graphs/data
de forma predeterminada).
Primero, el script simplemente copia el archivo de metadatos de la carpeta de entrada a la carpeta de salida. Luego, el script procesa un par de volcados PCAP <flow's starting #>-<scheme>-<sender/receiver>.pcap
de cada flujo y extrae información sobre los paquetes del flujo en el archivo de registro de datos json individual del flujo. Por ejemplo, para dos volcados de ~12 GB, se genera un archivo de registro de datos de ~300 MB.
La salida parcial del script de análisis para el ejemplo del dibujo:
./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...
Para la próxima generación de gráficos y estadísticas, los volcados de PCAP ya no son necesarios. El análisis de los volcados de PCAP se realiza sólo una vez y luego el script de trazado se puede ejecutar tantas veces como sea necesario sobre los archivos de registro de datos para producir varios trazados rápidamente.
El script de trazado plot.py
lee archivos de registro de datos de los flujos y genera gráficos y estadísticas en la carpeta de salida ( graphs
de forma predeterminada). Se pueden generar diferentes tipos de gráficos y estadísticas:
-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'].
Para un tipo seleccionado, se generan tres gráficos de líneas y un gráfico de dispersión:
Por ejemplo, arriba, se puede ver el gráfico de retardo unidireccional por flujo por paquete para la configuración en el dibujo.
Los gráficos promedio se promedian por un intervalo de tiempo de agregación: cualquier número flotante positivo se suministra con el argumento -i
o 0,5 segundos de forma predeterminada.
El gráfico del índice de Jain promedio siempre contiene una curva que se calcula sobre las curvas presentes en el gráfico de rendimiento promedio correspondiente.
Los argumentos -c
y -j
permiten cambiar los colores de las curvas en los gráficos de manera flexible.
Para un tipo seleccionado, se genera el archivo de estadísticas. No depende del intervalo de agregación elegido y contiene:
El retardo unidireccional promedio general y el retardo unidireccional promedio general por paquete de una curva son los mismos valores calculados de diferentes maneras.
El proceso de instalación es el siguiente:
Instalar la colección Pantheon de esquemas de control de congestión y, si es necesario, agregar más esquemas a la colección localmente
Instale el emulador CoCo-Beholder usando su script de instalación
Hecho. Pruebe los esquemas de la colección utilizando CoCo-Beholder.
La instalación de CoCo-Beholder en sí es trivial y su script de instalación install.sh
es súper fácil y breve. Sin embargo, la instalación de la colección de esquemas Pantheon a menudo causa muchos problemas. Además, algunas distribuciones de Linux simplemente tienen errores. Por lo tanto, consulte las instrucciones detalladas para la instalación en Ubuntu 16.04, Ubuntu 18.04 y Debian 10.
Las instrucciones a continuación se probaron en la máquina virtual con una instalación nueva de Ubuntu 16.04.6-desktop-amd64 (noviembre de 2019).
Como nota general: si necesita el esquema bbr (TCP BBRv1.0), asegúrese de utilizar el kernel de Linux >=4.9.
Las nuevas versiones de 16.04 LTS (16.04.5 y superiores) vienen con el kernel de Linux 4.15. CoCo-Beholder utiliza la fluctuación de retardo tc qdisc NetEm que no funciona en el kernel de Ubuntu 4.15. La solución:
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
En el archivo /etc/default/grub
, comente la línea GRUB_HIDDEN_TIMEOUT=0
y ejecute el comando sudo update-grub
. Esto le permitirá ver el menú de Grub después del reinicio.
Reinicie y en el menú Grub, elija Advanced options for Ubuntu
y allí Ubuntu, with Linux 4.13.0-39-generic
. Verifique el kernel en ejecución con el comando uname -ar
.
Descargue el repositorio git de Pantheon y los submódulos git de los esquemas incluidos:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Necesita instalar solo los esquemas usando los siguientes comandos. Si el último comando le da un error como Command "python setup.py egg_info" failed with error code 1...
, ejecute sudo pip install --upgrade pip
y repita el comando fallido. 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
Ahora está listo para probar los esquemas.
Las instrucciones a continuación se probaron en la máquina virtual con una instalación nueva de Ubuntu 18.04.3-desktop-amd64 (noviembre de 2019).
Como nota general: si necesita el esquema bbr (TCP BBRv1.0), asegúrese de utilizar el kernel de Linux >=4.9.
El kernel de Ubuntu 4.15 tiene el error. Con Ubuntu >=18.04.3, obtienes el kernel >=5.0, así que continúa con el siguiente paso.
Descargue el repositorio git de Pantheon y los submódulos git de los esquemas incluidos:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Necesita instalar solo los esquemas usando los siguientes comandos. 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
Ahora está listo para probar los esquemas.
Las instrucciones a continuación se probaron en la máquina virtual con una instalación nueva de Debian 10.1.0-amd64-netinst (noviembre de 2019).
Como nota general: si necesita el esquema bbr (TCP BBRv1.0), asegúrese de utilizar el kernel de Linux >=4.9.
El kernel de Ubuntu 4.15 tiene el error. No está claro si el kernel 4.15 de Debian tiene este problema. De todos modos, con Debian >=10.1.0, obtienes un kernel >=4.19, así que continúa con el siguiente paso.
Descargue el repositorio git de Pantheon y los submódulos git de los esquemas incluidos:
git clone https://github.com/StanfordSNR/pantheon.git && cd pantheon
git submodule update --init --recursive
rm -r src/wrappers/patches
tools/install_deps.sh
). Necesitas instalar sólo los esquemas. Primero, instale las dependencias de los esquemas: 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> ... " )
Agregue la cadena export PATH=/usr/sbin:$PATH
a su archivo ~/.bashrc
y ejecute el comando source ~/.bashrc
. Esto habilitará la utilidad /usr/sbin/sysctl
, que es necesaria no sólo durante la instalación sino también más adelante.
Para construir Verus, necesitas degradar tu biblioteca alglib. Entonces, por favor, agregue la línea deb <URL> stretch main
a su /etc/apt/sources.list
y ejecute:
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
Ahora está listo para probar los esquemas.
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 desea probar un esquema que no está presente en la colección Pantheon, puede agregarlo localmente de la siguiente manera:
find /lib/modules/ ` (uname -r) ` /kernel -type f -name * cdg *
# /lib/modules/4.19.0-6-amd64/kernel/net/ipv4/tcp_cdg.ko
cdg
al archivo pantheon/src/config.yml
que mantiene la lista de todos los esquemas de la colección. El color, el nombre y el marcador pueden ser cualquiera porque CoCo-Beholder no los lee. 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
Ahora puede probar cdg con CoCo-Beholder como de costumbre especificando los flujos de cdg en el archivo de diseño.
Se garantiza que CoCo-Beholder funcionará con Python 2.7, 3.5, 3.6 y 3.7. El script de instalación install.sh
de CoCo-Beholder instala las dependencias de la biblioteca Python 2 de forma predeterminada. Para Python 3, comente las líneas correspondientes en el script de instalación.
CoCo-Beholder utiliza la biblioteca Mininet: su API que permite crear un host virtual como un shell UNIX en un espacio de nombres de red separado, crear un enlace de cinco pares entre un par de hosts virtuales e iniciar procesos en un host virtual. CoCo-Beholder no utiliza Controlador, Switch, Topología, TCLink u otras entidades de nivel superior de Mininet. Para evitar futuros problemas de compatibilidad y facilitar la instalación de CoCo-Beholder, las partes necesarias de Mininet 2.3.0d5 se incluyen en el repositorio de CoCo-Beholder como una biblioteca de terceros según la licencia de Mininet.
Evgeniya Khasina implementó el programa en el marco de la tesis de maestría "The CoCo-Beholder: Enabling Comprehensive Assessment of Congestion Control Algorithms" en la Universidad de Sarre en 2019 bajo la supervisión de la profesora Anja Feldmann y la Dra. Corinna Coupette en el Departamento de Arquitectura de Internet de Max Planck. Instituto de Informática.
Si tiene alguna pregunta sobre el programa, puede escribirme a mí, Evgeniya Khasina, a mi dirección de correo electrónico.