Job Snijders, un renombrado desarrollador de OpenBSD, líder de uno de los comités en la IETF (Internet Engineering Task Force), autor de 11 RFC relacionados con el enrutamiento y RPKI, y creador de IRRd (Internet Routing Registry Daemon), ha publicado un conjunto de parches para OpenBSD que añaden un nuevo parámetro sysctl «net.inet.tcp.nodelay» para desactivar el algoritmo de Nagle a nivel del sistema. Este parámetro libera a los desarrolladores de aplicaciones de tener que establecer el flag TCP_NODELAY para sockets individuales.
El algoritmo de Nagle se utiliza para agregar mensajes pequeños con el fin de reducir el tráfico. El algoritmo pausa el envío de nuevos segmentos TCP hasta recibir la confirmación de la recepción de datos previamente enviados o hasta que se alcance un tiempo de espera. Por ejemplo, sin utilizar la agregación, al enviar 1 byte, se envían 40 bytes adicionales con los encabezados TCP e IP del paquete, mientras que con el algoritmo de Nagle, los mensajes enviados antes de recibir confirmación desde el otro lado se acumulan y se envían en un solo paquete. Debido a la optimización de «ACK retrasado», que retrasa el envío de paquetes ACK, la señal a través de los paquetes confirmatorios en realidad no funciona, y el envío de mensajes acumulados se lleva a cabo cuando se alcanza un tiempo de espera.
Snijders sostiene que en las realidades actuales, el algoritmo de Nagle, desarrollado en una época en que varios usuarios competían por un ancho de banda de 1200 bps, está obsoleto y en redes de alta velocidad su opinión causa más daño que beneficio. Recientemente, Marc Brooker de Amazon Web Services (AWS) también expresó una opinión similar. Las razones a favor de desactivar el algoritmo de Nagle por defecto se pueden encontrar en un artículo publicado hace unos días.
Para desactivar el algoritmo de Nagle, existe la opción TCP_NODELAY, que puede establecerse para sockets de red individuales. El modo TCP_NODELAY se ha utilizado en muchas aplicaciones de OpenBSD, entre ellas openssh, httpd, iscsid, relayd, bgpd y unwind, y, en opinión de Snijders, ha llegado el momento de ofrecer la posibilidad de habilitarlo para todos los sockets TCP a nivel del sistema. Snijders también propone discutir la inclusión de TCP_NODELAY por defecto y el cambio del algoritmo de Nagle a un modo de opción que se pueda habilitar individualmente.
Fuente: opennet.ru
