Probar el rendimiento de una red.

iperf

La calidad de un enlace de red se puede determinar según su latencia, pérdida de paquetes (“datagramas“), variación de la latencia (“jitter“) y el ancho de banda.

Pruebas de calidad

Para examinar la calidad de un enlace de red se pueden realizar diferentes pruebas con
los protocolos TCP (Protocolo de Control de Transmisión) y UDP (Protocolo de Datagramas de Usuario).

La calidad de un enlace puede ser examinado bajo las siguientes métricas:

  • Latencia: que es el tiempo de respuesta o round-trip time (RTT) y puede medirse usando en comando Ping.
  • Jitter (variación en la latencia): puede medirse con Iperf ejecutando una prueba con UDP.
  • Perdida de datagramas: puede medirse con Iperf ejecutando una prueba con UDP.
  • El ancho de banda es medido mediante pruebas con TCP.

Diferencias entre TCP y UDP

La principal diferencia radica en que en transmisiones TCP se verifica la correcta recepción de los paquetes por parte del receptor, mientras que con UDP los paquetes son enviados sin realizar ningún tipo de verificación. La ventaja de UDP sobre TCP es la mayor velocidad de transmisión.
Iperf utiliza las diferentes capacidades de TCP y UDP para proveer datos estadísticos acerca de los enlaces de red.

Iperf

Iperf es una herramienta para medir el ancho de banda y la calidad de un enlace de red. Al ser multiplataforma podemos realizar las pruebas entre equipos con cualquier sistema basado en UNIX/Linux o Microsoft Windows.

Características de Iperf

  • TCP
    • Medición del ancho de banda.
    • Informe del tamaño de MSS/MTU y observación de los tamaños leídos.
    • Permite modificar el tamaño de la ventana TCP mediante socket buffers.
    • Multi-hilo si están disponibles los hilos pthreads o Win32. Cliente y servidor pueden realizar múltiples conexiones simultaneas.
  • UDP
    • El cliente puede crear flujos UDP con un ancho de banda especificado.
    • Medición de la pérdida de paquetes.
    • Medición de la variación de latencia (“jitter“).
    • Permite conexiones Multicast.
    • Multi-hilo si están disponibles los hilos pthreads. Cliente y servidor pueden realizar múltiples conexiones simultaneas (no soportado en Windows).
  • Las opciones permiten especificar sufijos con K (kilo-) y M (mega-). Por ejemplo 128K en lugar de 131072 bytes.
  • Permite ejecución por un tiempo determinado, en lugar de una cantidad fija de datos para la transferencia.
  • Elige las mejores unidades para el tamaño de los datos en los informes.
  • El servidor maneja múltiples conexiones, en lugar de finalizar ejecución tras una única prueba.
  • Muestra periódicamente el ancho de banda intermedio, jitter e informe de pérdidas en los intervalos especificados.
  • Permite la ejecución del servidor como demonio o servicio de Windows NT.
  • Utiliza flujos de datos representativos para probar cómo la compresión de la capa de enlace afecta al ancho de banda obtenido.

Pruebas con Iperf

Para realizar las pruebas sobre un enlace de red debemos ejecutar Iperf en ambos extremos del enlace a examinar. Un equipo se ejecutará en modo cliente y el otro en modo servidor.

Vamos a realizar varias pruebas alternando entre varias de las opciones disponibles, para conocer todas las opciones posibles podemos utilizar el modificador -h.

[mantra-multi][mantra-column width=”1/2″]

  • Configuración predeterminada
  • -f Formato de los datos
  • -r Ancho de banda bidireccional
  •  -d Ancho de banda bidireccional simultaneo
  •  -w Tamaño de la ventana de TCP

[/mantra-column] [mantra-column width=”1/2″]

  • -p, -t, -i Puerto, temporización e intervalo
  •  -u, -b Análisis UDP, configuración de ancho de banda
  •  -m Visualización del máximo tamaño de segmento
  •  -M Ajustes al máximo tamaño de segmento
  •  -P Análisis en paralelo

[/mantra-column] [/mantra-multi]

Configuración predeterminada

El equipo cliente se conecta al equipo servidor en el puerto TCP 5001 y sin los argumentos –r o –d, solo se mide el ancho de banda del cliente al servidor.

Cliente: 

#>iperf -c 192.168.66.39
————————————————————
Client connecting to 192.168.66.39, TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 3] local 192.168.66.35 port 62427 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-11.1 sec 21.1 MBytes 16.0 Mbits/sec

Servidor:

#>iperf -s
————————————————————
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 62427
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-11.1 sec 21.1 MBytes 16.0 Mbits/sec

Formato de los datos

La opción –f nos permite mostrar el resultado en el formato indicado: bits, Bytes, kilobits, Kilobytes, megabits, Megabytes, gigabits o Gigabytes. Habitualmente las mediciones del ancho de banda se indican en bits, kilobits, etc. y la cantidad de datos se muestra en Bytes, Kilobytes, etc.

Como recordatorio, 1 byte es igual a 8 bits y en las ciencias de la computación, 1 kilo es igual a 1024 (2^10). Por ejemplo: 100.000.000 bytes no son lo mismo que 100 Megabytes, en realidad son 100.000.000/1024 = 95,37 Megabytes.

Cliente

#>iperf -c 192.168.66.39 -f b
————————————————————
Client connecting to 192.168.66.39, TCP port 5001
TCP window size: 65535 Byte (default)
————————————————————
[ 3] local 192.168.66.35 port 63578 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.1 sec 20447232 Bytes 16187814 bits/sec

Servidor

#>iperf -s
————————————————————
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 63578
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.1 sec 19.5 MBytes 16.2 Mbits/sec

Ancho de banda bidireccional

En un análisis predeterminado solo se mide el ancho de banda en la dirección del cliente al servidor. En la medición bidireccional, el servidor se conecta de vuelta con el cliente permitiendo la medición en ambos sentidos del enlace de datos.
Si se desea realizar la medición del ancho de banda en ambas direcciones secuencialmente, se utiliza el argumento –r, .

Cliente

#>iperf -c 192.168.66.39 -r
————————————————————
Client connecting to 192.168.66.39, TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.35 port 63713 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.1 sec 18.4 MBytes 15.3 Mbits/sec

Servidor

#>iperf -s
————————————————————
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 63713
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.1 sec 18.4 MBytes 15.3 Mbits/sec
————————————————————
Client connecting to 192.168.66.35, TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 49887 connected with 192.168.66.35 port 5001
[ 4] 0.0-10.0 sec 104 MBytes 87.4 Mbits/sec

Ancho de banda bidireccional simultaneo

Para medir el ancho de banda en ambas direcciones simultáneamente, se utiliza el argumento –d.

Cliente

#>iperf -c 192.168.66.39 -d
————————————————————
Client connecting to 192.168.66.39, TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.35 port 63744 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.1 sec 16.2 MBytes 13.5 Mbits/sec

Servidor

#>iperf -s
————————————————————
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 63744
————————————————————
Client connecting to 192.168.66.35, TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 5] local 192.168.66.39 port 49888 connected with 192.168.66.35 port 5001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0-10.0 sec 59.6 MBytes 49.9 Mbits/sec
[ 4] 0.0-10.1 sec 16.2 MBytes 13.5 Mbits/sec

Tamaño de la ventana de TCP

El tamaño de la ventana TCP es la cantidad de datos que pueden ser almacenados en el buffer durante una conexión sin la validación por parte del receptor. El tamaño se encuentra dentro del rango de 2 a 65,535 bytes. En los sistemas Linux, cuando se especifica un tamaño de ventana con el argumento –w, el kernel reserva el doble de lo indicado.

Cliente

#>iperf -c 192.168.66.39 -w 2000

WARNING: TCP window size set to 2000 bytes. A small window size
will give poor performance. See the Iperf documentation.
————————————————————
Client connecting to 192.168.66.39, TCP port 5001
TCP window size: 1.95 KByte
————————————————————
[ 3] local 192.168.66.35 port 63758 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.3 sec 6.12 MBytes 4.98 Mbits/sec

Servidor

#>iperf -s -w 4000
————————————————————
Server listening on TCP port 5001
TCP window size: 3.91 KByte
————————————————————
[ 4] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 63758
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.3 sec 6.12 MBytes 4.97 Mbits/sec

Puerto, temporización e intervalo

El puerto de comunicación puede ser cambiado con la opción –p, este debe estar configurado tanto en el cliente como en el servidor y debe ser el mismo valor, el puerto TCP predeterminado es el 5001.
La opción –t especifica la duración del análisis en segundos, el valor predeterminado es de 10 segundos.
La opción –i indica el intervalo entre reportes de ancho de banda en segundos.

Cliente

#>iperf -c 192.168.66.39 -p 12000 -t 20 -i 4
————————————————————
Client connecting to 192.168.66.39, TCP port 12000
TCP window size: 64.0 KByte (default)
————————————————————
[ 3] local 192.168.66.35 port 63808 connected with 192.168.66.39 port 12000
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 4.0 sec 10.4 MBytes 21.8 Mbits/sec
[ 3] 4.0- 8.0 sec 7.88 MBytes 16.5 Mbits/sec
[ 3] 8.0-12.0 sec 9.00 MBytes 18.9 Mbits/sec
[ 3] 12.0-16.0 sec 8.12 MBytes 17.0 Mbits/sec
[ 3] 16.0-20.0 sec 7.88 MBytes 16.5 Mbits/sec
[ 3] 0.0-20.2 sec 43.4 MBytes 18.0 Mbits/sec

Servidor

#>iperf -s -p 12000
————————————————————
Server listening on TCP port 12000
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 12000 connected with 192.168.66.35 port 63808
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-20.2 sec 43.4 MBytes 18.0 Mbits/sec

Análisis UDP, configuración de ancho de banda

Las pruebas utilizando UDP se realizan con la opción –u. Dichas pruebas proporcionan información importante sobre el jitter y pérdida de paquetes. Si no se indica de manera predeterminada se utiliza TCP.

Para mantener una buena calidad en el enlace, la pérdida de paquetes no debe ser mayor a 1%. Una tasa de pérdida de paquetes alta generará muchas retransmisiones de segmentos TCP, lo cual afectará el ancho de banda.

El jitter es básicamente la variación de la latencia y no depende de la latencia. Se puede tener un tiempo de respuesta grande y un jitter muy bajo. El valor del jitter es particularmente importante en enlaces que son usados para voz sobre IP (VoIP) debido a que un jitter alto puede cortar la llamada.

La opción –b permite utilizar el ancho de banda deseado.

Cliente

#>iperf -c 192.168.66.39 -u -b 10m
————————————————————
Client connecting to 192.168.66.39, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 64.0 KByte (default)
————————————————————
[ 3] local 192.168.66.35 port 55753 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 11.9 MBytes 10.0 Mbits/sec
[ 3] Sent 8505 datagrams
[ 3] Server Report:
[ 3] 0.0-10.0 sec 11.9 MBytes 10.0 Mbits/sec 0.000 ms 0/ 8504 (0%)
[ 3] 0.0-10.0 sec 1 datagrams received out-of-order

Servidor

#>iperf -s -u -i 1
————————————————————
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 64.0 KByte (default)
————————————————————
[ 3] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 55753
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams

[ 3] 0.0- 1.0 sec 1.19 MBytes 10.0 Mbits/sec 0.000 ms 0/ 852 (0%)
[ 3] 1.0- 2.0 sec 1.19 MBytes 10.0 Mbits/sec 0.069 ms 0/ 850 (0%)
[ 3] 2.0- 3.0 sec 1.19 MBytes 9.98 Mbits/sec 0.000 ms 0/ 849 (0%)
[ 3] 3.0- 4.0 sec 1.19 MBytes 10.0 Mbits/sec 0.000 ms 0/ 851 (0%)
[ 3] 4.0- 5.0 sec 1.19 MBytes 10.0 Mbits/sec 0.000 ms 0/ 850 (0%)
[ 3] 5.0- 6.0 sec 1.19 MBytes 10.0 Mbits/sec 0.000 ms 0/ 850 (0%)
[ 3] 6.0- 7.0 sec 1.19 MBytes 10.0 Mbits/sec 0.000 ms 0/ 851 (0%)
[ 3] 7.0- 8.0 sec 1.19 MBytes 10.0 Mbits/sec 0.000 ms 0/ 850 (0%)
[ 3] 8.0- 9.0 sec 1.19 MBytes 10.0 Mbits/sec 0.000 ms 0/ 850 (0%)
[ 3] 9.0-10.0 sec 1.19 MBytes 10.0 Mbits/sec 0.000 ms 0/ 851 (0%)
[ 3] 0.0-10.0 sec 11.9 MBytes 10.0 Mbits/sec 0.000 ms 0/ 8504 (0%)
[ 3] 0.0-10.0 sec 1 datagrams received out-of-order

Visualización del tamaño máximo de segmento

El tamaño máximo del segmento (MSS) es la mayor cantidad de datos, en bytes, que soporta un equipo en un solo segmento de TCP sin fragmentar. Este tamaño puede ser calculado de la siguiente manera:
MSS = MTU – encabezados TCP e IP
Los encabezados TCP e IP tienen un tamaño igual a 40 bytes.

La unidad máxima de transferencia (MTU) es la mayor cantidad de datos que puede ser transferida en una trama.

Las diferentes topologías de red ya tienen establecido un valor predeterminado para el MTU:
Ethernet: 1500 bytes: usado en redes de área local.
PPPoE: 1492 bytes: usado en enlaces ADSL.
Token Ring (16 Mb/sec): 17914 bytes (tecnología antigua desarrollada por IBM).
Dial-up: 576 bytes.

Cliente

#>iperf -c 192.168.66.39 -m
————————————————————
Client connecting to 192.168.66.39, TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 3] local 192.168.66.35 port 63905 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 19.9 MBytes 16.6 Mbits/sec
[ 3] MSS and MTU size unknown (TCP_MAXSEG not supported by OS?)

Aqui el MSS no es igual a 1500 – 40 si no a 1500 – 40 – 12 (Usando la opción de Timestamps) = 1448

Servidor

#>iperf -s
————————————————————
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 63905
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 19.9 MBytes 16.6 Mbits/sec

Ajustes al máximo tamaño de segmento

Se utiliza la opción –M para cambiar el MSS.

Cliente

#>iperf -c 192.168.66.39 -M 1300 -m
WARNING: attempt to set TCP maximum segment size to 1300, but got 1281
————————————————————
Client connecting to 192.168.66.39, TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 3] local 192.168.66.35 port 63916 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.1 sec 21.0 MBytes 17.4 Mbits/sec
[ 3] MSS size 1 bytes (MTU 41 bytes, unknown interface)

Servidor

#>iperf -s
————————————————————
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 63916
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.1 sec 21.0 MBytes 17.4 Mbits/sec

Análisis en paralelo

El argumento –P se utiliza para correr pruebas en paralelo.

Cliente

#>iperf -c 192.168.66.39 -P 2
————————————————————
Client connecting to 192.168.66.39, TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 3] local 192.168.66.35 port 63936 connected with 192.168.66.39 port 5001
[ 4] local 192.168.66.35 port 63937 connected with 192.168.66.39 port 5001
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 16.2 MBytes 13.6 Mbits/sec
[ 3] 0.0-10.2 sec 16.1 MBytes 13.3 Mbits/sec
[SUM] 0.0-10.2 sec 32.4 MBytes 26.7 Mbits/sec

Servidor

#>iperf -s
————————————————————
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
————————————————————
[ 4] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 63936
[ 5] local 192.168.66.39 port 5001 connected with 192.168.66.35 port 63937
[ ID] Interval Transfer Bandwidth
[ 5] 0.0-10.0 sec 16.2 MBytes 13.6 Mbits/sec
[ 4] 0.0-10.2 sec 16.1 MBytes 13.3 Mbits/sec
[SUM] 0.0-10.2 sec 32.4 MBytes 26.7 Mbits/sec

Descargar Iperf

Windows (2000, XP, 2003, Vista, 7, 8) – iperf-2.0.5-2-win32

Linux 32 y 64 bits (i386 y AMD64) – iperf_2.0.5-2_i386_debian.tar iperf_2.0.5-2_amd64_debian.tar

MacOS X (Intel) – iperf-2.0.5-macosx-i686.tar

Solaris 10 (x86 y SPARC) – iperf_2.0.4_solaris10_x86 iperf_2.0.4_solaris10_sparc

Solaris 9 (x86 y SPARC) – iperf_2.0.4_solaris9_x86 iperf_2.0.4_solaris9_sparc

Solaris 8 (x86 y SPARC) – iperf_2.0.4_solaris8_x86 iperf_2.0.4_solaris8_sparc

C++ Source – iperf-2.0.5-source.tar

2 Comments

  1. Excelente artículo! Gracias por compartir esa información!

  2. Genial tús apuntes!!!, La eterna pregunta de los infromaticos de campo, administradores de red de mayor o menor nivel. Está la red optima???

Anímate a compartir con nosotros tus inquietudes y experiencias.

A %d blogueros les gusta esto: