Simular paquetes retrasados ​​y descartados en Linux

Me gustaría simular el retraso y la pérdida de paquetes para UDP y TCP en Linux para medir el rendimiento de una aplicación. ¿Hay una manera simple de hacer esto?

netem aprovecha la funcionalidad ya incorporada en Linux y las utilidades del espacio de usuario para simular redes. A esto es realmente a lo que se refiere la respuesta de Marcos, con un nombre diferente.

Los ejemplos en su página de inicio ya muestran cómo puede lograr lo que ha pedido:

Ejemplos

Emular retrasos de red de área extensa

Este es el ejemplo más simple, solo agrega una cantidad fija de retraso a todos los paquetes que salen de la Ethernet local.

 # tc qdisc add dev eth0 root netem delay 100ms 

Ahora, una simple prueba de ping para alojar en la red local debería mostrar un aumento de 100 milisegundos. El retraso está limitado por la resolución del reloj del kernel (Hz). En la mayoría de los sistemas 2.4, el reloj del sistema funciona a 100 Hz, lo que permite retrasos en incrementos de 10 ms. En 2.6, el valor es un parámetro de configuración de 1000 a 100 Hz.

Los ejemplos posteriores simplemente cambian los parámetros sin volver a cargar el qdisc

Las redes reales de área amplia muestran variabilidad, por lo que es posible agregar variaciones aleatorias.

 # tc qdisc change dev eth0 root netem delay 100ms 10ms 

Esto provoca que la demora agregada sea de 100 ± 10 ms. La variación de retardo de red no es puramente aleatoria, por lo tanto, para emular también existe un valor de correlación.

 # tc qdisc change dev eth0 root netem delay 100ms 10ms 25% 

Esto provoca que la demora añadida sea de 100 ± 10 ms con el siguiente elemento aleatorio que depende del 25% del último. Esta no es una verdadera correlación estadística, sino una aproximación.

Distribución diferida

Normalmente, el retraso en una red no es uniforme. Es más común usar algo así como una distribución normal para describir la variación en la demora. La disciplina netem puede tomar una tabla para especificar una distribución no uniforme.

 # tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal 

Las tablas reales (normal, pareto, paretonormal) se generan como parte de la comstackción de iproute2 y se colocan en / usr / lib / tc; por lo que es posible con algún esfuerzo hacer su propia distribución en base a datos experimentales.

Paquete perdido

La pérdida aleatoria de paquetes se especifica en el comando ‘tc’ en porcentaje. El menor valor posible distinto de cero es:

2 -32 = 0.0000000232%

 # tc qdisc change dev eth0 root netem loss 0.1% 

Esto hace que se retire aleatoriamente 1 / 10th de un porcentaje (es decir, 1 de cada 1000) paquetes.

También se puede agregar una correlación opcional. Esto hace que el generador de números aleatorios sea menos aleatorio y se puede usar para emular pérdidas de ráfagas de paquetes.

 # tc qdisc change dev eth0 root netem loss 0.3% 25% 

Esto causará que se pierda el 0.3% de los paquetes y que cada probabilidad sucesiva dependa por un cuarto de la última.

Prob n = 0.25 × Prob n-1 + 0.75 × Aleatorio

Tenga en cuenta que debe usar tc qdisc add si no tiene reglas para esa interfaz o tc qdisc change si ya tiene reglas para esa interfaz. Intentar utilizar tc qdisc change en una interfaz sin reglas dará el error RTNETLINK answers: No such file or directory .

Para los paquetes descartados, simplemente usaría iptables y el módulo estadístico .

 iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP 

Arriba arrojará un paquete entrante con una probabilidad del 1%. Tenga cuidado, cualquier cosa por encima de 0.14 y la mayoría de las conexiones de tcp probablemente se detenga por completo.

Eche un vistazo a man iptables y busque “estadística” para más información.

Uno de mis colegas usa tc para hacer esto. Consulte la página de manual para más información. Puede ver un ejemplo de su uso aquí .

iptables (8) tiene un módulo de estadísticas que se puede usar para que coincida con cada enésimo paquete. Para soltar este paquete, solo añada -j DROP .

Este tutorial sobre simulaciones de física de redes contiene una clase C ++ en el código de ejemplo para simular la latencia y la pérdida de paquetes en una conexión UDP y puede ser una guía. Consulte las variables de latencia pública y packetLoss de la clase Connection que se encuentran en el archivo Connection.h del código fuente descargable .

No lo he probado yo mismo, pero esta página tiene una lista de módulos de complementos que se ejecutan en el sistema de filtrado de ip iptables de Linux. Uno de los módulos se llama “enésima”, y le permite configurar una regla que elimine una tasa configurable de los paquetes. Puede ser un buen lugar para comenzar, al menos.

Puedes probar http://snad.ncsl.nist.gov/nistnet/ Es un proyecto NIST bastante antiguo (última versión de 2005), pero funciona para mí.

Una herramienta de inyección de fallas de red fácil de usar es Saboteur . Puede simular:

  • Partición de red total
  • Servicio remoto muerto (sin escuchar en el puerto esperado)
  • Retrasos
  • Packet loss -TCP timeout de conexión (como suele suceder cuando dos sistemas están separados por un firewall con estado)

Una de las herramientas más utilizadas en la comunidad científica para ese fin es DummyNet . Una vez que haya instalado el módulo de kernel de ipfw , para introducir 50 ms de retraso de propagación entre 2 máquinas simplemente ejecute estos comandos:

 ./ipfw pipe 1 config delay 50ms ./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2 

Para introducir también el 50% de las pérdidas de paquetes, debe ejecutar:

 ./ipfw pipe 1 config plr 0.5 

Aquí más detalles.