Algoritmo de Nagle

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

El Algoritmo de Nagle se trata de un procedimiento que supone una mejora y aumento de eficiencia de las redes de comunicación basadas en Transmission Control Protocol (TCP). El algoritmo de Nagle es un método heurístico para evitar enviar paquetes IP particularmente pequeños, también denominados pequegramas (del inglés tinygrams). El algoritmo de Nagle intenta evitar la congestión que estos paquetes pueden ocasionar en la red reteniendo por poco tiempo la transmisión de datos TCP en algunas circunstancias.

Funcionamiento[editar]

Algoritmo[editar]

if hay nuevos datos en enviar
 if el tamaño de ventana y su disponibilidad de datos es >= MSS
  envía el tamaño de MSS ahora
 else
  if hay datos sin confirmar en espera
   encola los datos en el buffer hasta recibir un reconocimiento
  else
   envía los datos ahora con MSS = maximum segment size ( Tamaño Maximo de segmento )
  end if
 end if
end if

Generalidad[editar]

En TCP el emisor no está obligado a transmitir datos en cuanto los recibe de la aplicación, ni el receptor a enviar los reconocimientos en forma inmediata. Sin embargo, en numerosas ocasiones un cliente tiene muy pocos datos para enviar (por ejemplo, sólo 1 byte). En este caso el paquete a enviar contará 1 byte de datos, 20 bytes de cabecera TCP y 20 bytes de cabecera IP, dando un total de 41 bytes de los que 40 son de control y 1 de datos. Si se transmiten muchos segmentos de este tipo, no se estaría utilizando la red de manera eficiente.

Ventajas[editar]

Una primera mejora que sirve como solución a esta baja eficiencia de transmisión, es demorar el reconocimiento unos 500 ms en espera de datos moviéndose en la otra dirección, para mandar el reconocimiento en el mismo paquete (piggybacking). Con esta mejora, el reconocimiento del primer segmento y el eco generado por el receptor viajarían en el mismo segmento.

Utilizando el algoritmo de Nagle, una conexión TCP sólo puede tener un segmento de tamaño pequeño (pocos bytes) sin que se haya reconocido; es decir, sólo puede haber un único segmento de tamaño pequeño viajando por la red. El resto de los segmentos de tamaño pequeño no se pueden transmitir hasta que el asentimiento (ACK) del segmento pequeño, que esté viajando por la red, haya llegado. De esta forma, el algoritmo acumula información para enviar entre el último asentimiento recibido y el asentimiento por venir.

Así, los segmentos que están esperando para ser transmitidos se almacenan hasta que se recibe el asentimiento del segmento en tránsito. Cuando éste último llega, la conexión TCP puede enviar un segmento que contenga todos los datos almacenados hasta este momento, formando un segmento mayor. De esta forma, pequeñas cantidades de datos salientes son amalgamados dentro de la mayor carga de paquetes.

También se envía un segmento cuando los datos acumulados igualan o superan el MSS (Tamaño Máximo de Segmento), o la mitad de la ventana. Es interesante notar que el mecanismo es autoadaptativo, pues cuanto más cargada esté la red más tardarán los ACK y más agrupados irán los datos.

Aplicaciones[editar]

El algoritmo de Nagle funciona cuando los retardos en la red son grandes; es decir, si la conexión cruza una WAN. En caso de que la conexión sea local, en una LAN, es difícil que se aplique este algoritmo a causa de la alta velocidad de la red. En ocasiones, es interesante deshabilitar el algoritmo de Nagle, en aquellos casos en que la aplicación en uso no puede esperar, o bien cuando se tienen graves problemas por paquetes perdidos. En particular, los pequegramas pueden llegar a ser particularmente ineficientes bajo enlaces de banda estrecha como SLIP.

Un típico caso de ejemplo de aplicación que requiere que el algoritmo de Nagle sea deshabilitado es el movimiento del ratón en un escritorio controlado de manera remota, donde se desea que el usuario no note diferencias en el movimiento entre el uso remoto y el uso local; o bien herramientas de red interactivas que transmiten pulsaciones únicas de teclas, como telnet o rsh (remote shell).

Véase también[editar]

Referencias[editar]