Maximiza la transmisión de datos con opciones TCP/IP

Reduciendo la Latencia del Servidor con Opciones TCP

Opciones de TCP para mejorar el rendimiento y reducir la latencia del servidor

En un artículo anterior, explicamos cómo la opción TCP_CORK puede disminuir el número de paquetes transferidos en una red. Si bien esto es de vital importancia, reducir el tráfico es solo una parte del rompecabezas de la transmisión de datos de red de alto rendimiento. Otras opciones de TCP pueden mejorar significativamente el rendimiento y reducir la latencia de respuesta del servidor en determinadas condiciones. Veamos algunas de esas opciones.

Opción TCP_DEFER_ACCEPT

La primera opción que consideraremos es TCP_DEFER_ACCEPT (así es como se llama en Linux, otros sistemas operativos ofrecen la misma opción pero usan nombres diferentes). Para entender la idea de la opción TCP_DEFER_ACCEPT es necesario imaginar el proceso típico de interacción cliente-servidor HTTP. Considera cómo TCP establece una conexión con el objetivo de transferir datos.

En una red, la información viaja en unidades discretas llamadas paquetes IP (o datagramas IP). Un paquete siempre tiene una cabecera que lleva información de servicio, utilizada para el manejo interno del protocolo, y también puede llevar datos del cuerpo. Un ejemplo típico de información de servicio es un conjunto de banderas, que marcan los paquetes como teniendo un significado especial para una pila TCP/IP, como el acuse de recibo de haber recibido con éxito el paquete. A menudo, es posible llevar carga útil en el paquete "marcado", pero a veces, la lógica interna obliga a una pila TCP/IP a enviar paquetes solo con una cabecera. Estos paquetes a menudo introducen retrasos no deseados y aumentan la sobrecarga, lo que resulta en una degradación general del rendimiento.

Cómo configurar y utilizar un servidor TFTP en Windows 2000

El servidor ha creado un socket y está esperando una conexión. El procedimiento de conexión en TCP/IP es un "apretón de manos" de tres vías. Primero, el cliente envía un paquete TCP con una bandera SYN establecida y sin carga útil (un paquete SYN). El servidor responde enviando un paquete con las banderas SYN/ACK establecidas (un paquete SYN/ACK) para reconocer la recepción del paquete inicial. Luego, el cliente envía un paquete ACK para reconocer la recepción del segundo paquete y finalizar el procedimiento de conexión. Después de recibir el SYN/ACK, el servidor despierta a un proceso receptor mientras espera los datos. Una vez completado el "apretón de manos" de tres vías, el cliente comienza a enviar datos "útiles" para transferir al servidor. Por lo general, una solicitud HTTP es bastante pequeña y cabe en un solo paquete. Pero en este caso, se enviarán al menos cuatro paquetes en ambas direcciones, lo que agrega un tiempo considerable de retraso. Además, cabe destacar que el receptor ya estaba esperando la información y esto antes de que los datos fueran enviados.

Para mitigar estos problemas, Linux (junto con otros sistemas operativos) incluye una opción llamada TCP_DEFER_ACCEPT en su implementación de TCP. Establecida en un socket de escucha en el servidor, instruye al kernel para que no espere el paquete ACK final y no inicie el proceso hasta que haya llegado el primer paquete de datos reales. Después de enviar el SYN/ACK, el servidor esperará un paquete de datos de un cliente. Ahora, solo se enviarán tres paquetes a través de la red y el retraso en el establecimiento de la conexión se reducirá significativamente, lo cual es típico en HTTP.

Equivalentes de esta opción están disponibles en otros sistemas operativos también. Por ejemplo, en FreeBSD, se logra el mismo comportamiento con el siguiente código:

/* código omitido por claridad */

struct accept_filter_arg af = { “dataready”, “” };

setsockopt(s, SOL_SOCKET, SO_ACCEPTFILTER, &af, sizeof(af));

Esta característica, llamada "filtro de aceptación" en FreeBSD, se utiliza de diferentes maneras, aunque en todos los casos, el efecto es el mismo que TCP_DEFER_ACCEPT: el servidor no esperará el paquete ACK final, esperando solo un paquete que lleve una carga útil. Más información sobre esta opción y su importancia para un servidor web de alto rendimiento está disponible en la documentación de Apache.

Con la interacción entre cliente y servidor HTTP, puede ser necesario cambiar el comportamiento del cliente. ¿Por qué el cliente enviaría este paquete ACK "inútil" de todos modos? Una pila TCP no tiene forma de saber el estado de un paquete ACK. Si se usara FTP en lugar de HTTP, el cliente no enviaría ningún dato hasta que recibiera un paquete con el prompt del servidor FTP. En este caso, el retraso en el envío del ACK causaría un retraso en la interacción cliente-servidor. Para decidir si este ACK es necesario, el cliente debe conocer el protocolo de aplicación y su estado actual. Por lo tanto, es necesario modificar el comportamiento del cliente.

Para clientes basados en Linux, podemos usar otra opción, que también se llama TCP_DEFER_ACCEPT. Hay dos tipos de sockets: sockets de escucha y sockets conectados, y dos conjuntos correspondientes de opciones. Por lo tanto, es posible utilizar el mismo nombre para estas dos opciones que a menudo se usan juntas. Después de establecer esta opción en un socket conectado, el cliente no enviará un paquete ACK después de recibir un paquete SYN/ACK y, en cambio, esperará una próxima solicitud de un programa de usuario para enviar datos; por lo tanto, se enviará un paquete menos al servidor.

Cómo identificar y solucionar problemas de lentitud en redes

Opción TCP_QUICKACK

Otra forma de evitar retrasos causados ​​por el envío de paquetes inútiles es utilizar la opción TCP_QUICKACK. Esta opción es diferente a TCP_DEFER_ACCEPT, ya que se puede utilizar no solo para gestionar el proceso de establecimiento de conexión, sino también durante el proceso normal de transferencia de datos. Además, se puede establecer en cualquiera de los dos lados de la conexión cliente-servidor. Retrasar el envío del paquete ACK puede ser útil si se sabe que los datos del usuario se enviarán pronto y es mejor configurar la bandera ACK en ese paquete de datos para minimizar la sobrecarga. Cuando el remitente está seguro de que los datos se enviarán inmediatamente (múltiples paquetes), se puede establecer la opción TCP_QUICKACK en 0. El valor predeterminado de esta opción es 1 para los sockets en el estado "conectado", lo que será restablecido por el kernel a 1 inmediatamente después del primer uso. (Esta es una opción única).

En otro escenario, podría ser beneficioso enviar los paquetes ACK. El paquete ACK confirmará la recepción de un bloque de datos y cuando se procese el siguiente bloque, no habrá retraso. Este modo de transferencia de datos es típico en procesos interactivos, donde el momento de la entrada del usuario es impredecible. En Linux, esto se conoce como comportamiento predeterminado del socket.

En la situación mencionada anteriormente, donde un cliente está enviando solicitudes HTTP a un servidor, se sabe de antemano que el paquete de solicitud es corto y debe enviarse inmediatamente después de establecer una conexión, lo cual es indicativo de cómo funciona HTTP. No es necesario enviar un paquete puro de ACK, por lo que es posible establecer TCP_QUICKACK en 0 para mejorar el rendimiento. En el lado del servidor, ambas opciones solo se pueden establecer una vez en el socket de escucha. Todos los sockets creados indirectamente por una llamada de aceptación heredarán todas las opciones del socket original.

Al combinar las opciones TCP_CORK, TCP_DEFER_ACCEPT y TCP_QUICKACK, el número de paquetes que participan en cada transacción HTTP se reducirá a un nivel aceptable mínimo (según los requisitos del protocolo TCP y las consideraciones de seguridad). El resultado es una transferencia de datos y procesamiento de solicitudes rápidos, así como una latencia mínima entre el cliente y el servidor.

Conclusión

Cómo utilizar MRTG para monitorizar y analizar el tráfico de red en Linux

La optimización del rendimiento de programas de red es obviamente una tarea compleja. Las técnicas de optimización incluyen el uso del enfoque de copia cero siempre que sea posible, el ensamblaje adecuado de paquetes mediante TCP_CORK y equivalentes, la minimización del número de paquetes transferidos y la optimización de la latencia. Para obtener un aumento significativo en el rendimiento y la escalabilidad, es necesario utilizar todos los métodos disponibles de manera conjunta y coherente en todo el código. Por supuesto, también se requiere una comprensión clara del funcionamiento interno de la pila TCP/IP y del sistema operativo en su conjunto.

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Redes, allí encontraras muchos artículos similares a Maximiza la transmisión de datos con opciones TCP/IP , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.