====== Rendimiento de una Red ====== {{:informatica:networking:cropped-cropped2.jpg?380|Networking}} Para probar el rendimiento de una red, no nos bastan las aplicaciones convencionales, las que pueden producir una serie de inconsistencias en las pruebas de velocidad de una red entre **dos puntos**, para eso hay herramientas especializadas que permite hacer estas pruebas. Para realizar esto, disponemos de una herramienta especializada que permite probar protocolos TCP y UDP entre dos puntos. ===== Características de Iperf ===== * 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. Protocolo 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. * Cliente y servidor pueden realizar múltiples conexiones simultaneas. Protocolo 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 simultáneas. ===== Pruebas con Iperf ===== Para realizar las pruebas con esta herramienta, 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 cliente se conecta al servidor por el puerto **tcp/5001**, sin argumentos, **iperf** sólo mide el ancho de banda entre el cliente y el servidor. ==== Servidor ==== Para ejecutar en modo Servidor, se debe ejecutar en un terminal, en el equipo de definamos como servidor, el comando siguiente: # iperf -s La salida en el lado del servidor es similar a esta: +------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) +------------------------------------------------------------ [ 4] local 192.168.0.7 port 5001 connected with 192.168.0.10 port 42314 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.1 sec 114 MBytes 94.2 Mbits/sec [ 5] local 192.168.0.7 port 5001 connected with 192.168.0.10 port 42330 [ 5] 0.0-10.1 sec 113 MBytes 94.2 Mbits/sec [ 4] local 192.168.0.7 port 5001 connected with 192.168.0.10 port 42332 [ 4] 0.0-10.1 sec 113 MBytes 94.2 Mbits/sec ==== Cliente ==== Para el otro equipo que probará la velicidad de conexión es el definido como el cliente de esta conexión, para ello deberemos ejecutar en el terminal, el comando siguiente: $ iperf -c ip_destino La salida en el lado del cliente, es similar a esta: +------------------------------------------------------------ Client connecting to 192.168.0.7, TCP port 5001 TCP window size: 85.0 KByte (default) +------------------------------------------------------------ [ 3] local 192.168.0.10 port 42332 connected with 192.168.0.7 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 113 MBytes 95.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. # iperf -c ip_destino -f b # iperf -c 192.168.0.7 -f b Esto nos entrega los datos en //bits por segundo //. +------------------------------------------------------------ Client connecting to 192.168.0.7, TCP port 5001 TCP window size: 87040 Byte (default) +------------------------------------------------------------ [ 3] local 192.168.0.10 port 42856 connected with 192.168.0.7 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 118882304 Bytes 95014041 bits/sec ===== Diferentes Pruebas con iperf ===== A continuación realizaremos diferentes pruebas de mediciones con diferentes puertos, protocolos y tamaños, variando los intervalos de tiempos y otros parámetros de la comunicación TCP/UDP. ==== Ancho de Banda Bidireccional ==== El comando predeterminado sólo mide el ancho de banda, desde el **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**. # iperf -c 192.168.0.7 -r ==== Ancho de Banda Bidireccional Simultáneo ==== Para medir el ancho de banda en ambas direcciones simultáneamente, se utiliza el argumento en la línea de comandos **–d**. # iperf -c 192.168.0.7 -d ==== Tamaño de la Ventana 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. # iperf -c 192.168.0.7 -w 2000 => Para el cliente # iperf -s -w 4000 => Para el Servidor ==== 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. # iperf -c 192.168.0.7 -p 12960 -t 20 -i 6 => Para el Cliente # iperf -s -p 12960 => Para el Servidor ==== 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 al **1%**. Una tasa de pérdida de paquetes alta generará muchas retransmisiones de segmentos TCP, lo cual afectará el ancho de banda. La opción **-b** permite usar el ancho de banda deseado en la prueba. # iperf -c 192.168.0.7 -u -b 100m => Para el Cliente # iperf -s -u -i 1 => Para el Servidor El Cliente envía al Server paquetes UDP con un ancho de banda seleccionado de 100Mbps y el Server recepciona esos paquetes UDP con intervalos de 1 segundo. ==== 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. # iperf -c 192.168.0.7 -m => Para el Cliente # iperf -s ==== Ajustes al Máximo Tamaño de Segmento ==== Para cambiar el tamaño del segmento (**MSS**), se utiliza la opción **-M** en el comando: # iperf -c 192.168.0.7 -M 1300 -m => Para el Cliente # iperf -s => Para el Servidor En el ejemplo se visualiza que el segmento se ha definido de 1300, pero se debe considerar que el segmento proporciona menos de los 1300 byte como datos útiles debido a que utiliza dentro del segmento como parte del control del protocolo, que es diferente a los flags de los headers del protocolo. ==== Análisis en Paralelo ==== Para realizar pruebas en paralelo se utiliza la opción **-P**, la que se usa de la siguiente manera: # iperf -c 192.168.0.7 -P 2 => Para el Cliente # iperf -s => Para el Servidor Estas pruebas simultáneas y en paralelo producen una división del ancho de banda disponible en a red y en las NIC en cada extremo de la comunicación y es utilizada para ver el rendimiento de los enlaces.