2. TCP Transmission Control Protocol

2.6. Arranque lento y Evitar Congestión

"Slow Start and Congestion Avoidance"

Las implementaciones antiguas de TCP inician una conexión con el remitente inyectando múltiples segmentos en la red, hasta el tamaño de ventana anunciado por el receptor.
Aunque esto está bien cuando los dos hosts están en la misma LAN, si hay enrutadores y enlaces más lentos entre el emisor y el receptor, pueden surgir problemas.

Si  los enrutadores intermedios no pueden manejarlo, los paquetes se descartan y la retransmisión, los resultados y el rendimiento se degradan.
El algoritmo para evitar esto se llama SLOW START.

Este trabaja observando la velocidad a la que se deben inyectar nuevos paquetes en la red. Es la velocidad a la que se reciben los acuses de recibos por el otro extremo.

Slow start agrega otra ventana al TCP del remitente: la ventana de congestión, llamada cwnd.

Cuando una nueva conexión se establece con un host en otra red, la ventana de congestión se inicializa a un segmento (por ejemplo, el tamaño del segmento anunciado por el otro extremo, o el predeterminado, normalmente 536 o 512).

Cada vez que se recibe un ACK, la ventana de congestión aumenta en un segmento. El emisor puede transmitir el valor más bajo de la ventana de congestión o la ventana anunciada. La ventana de congestión es el control de flujo impuesto por el emisor, mientras que la ventana anunciada es un control de flujo impuesto por el receptor.

El  primero se basa en la evaluación del remitente de la congestión de red percibida; el último está relacionado con la cantidad de espacio de búfer disponible en el receptor para esta conexión.

El remitente comienza transmitiendo un segmento y esperando su ACK. Cuando se recibe el ACK, la ventana de congestión se incrementa de uno a dos, y se pueden enviar dos segmentos. Cuando se reconoce cada uno de esos dos segmentos, la ventana de congestión se incrementa a cuatro. Esto proporciona un crecimiento exponencial, aunque no es exactamente exponencial, porque el receptor puede retrasar sus ACK, normalmente envía un ACK por cada dos segmentos que recibe.
En algún momento, la capacidad de la red IP (por ejemplo, enlaces WAN más lentos) se puede alcanzar, y un enrutador intermedio comenzará a descartar paquetes. Este le dice al remitente que su ventana de congestión se ha vuelto demasiado grande.

En este punto se dispara el mencanismo de Evitar Congestión.


Congestion avoidance

La suposición del algoritmo es que la pérdida de paquetes causada por daños es muy pequeña (mucho menos del 1%). Por lo tanto, la pérdida de un paquete indica congestión en algún lugar de la red entre el origen y el destino.

La  pérdida de paquetes se puede producir:

  • Se produce un tiempo de espera.
  • Se reciben ACK duplicados.

La prevención de congestión y el slow start son algoritmos independientes con diferentes objetivos, pero cuando ocurre una congestión, TCP debe ralentizar su tasa de transmisión de paquetes en la red e invocar un inicio lento para que las cosas vuelvan a funcionar.
En la práctica, se implementan juntos y desde el protocolo se requieren que se mantengan dos variables para cada conexión:

  • Una ventana de congestión, cwnd.
  • Un tamaño de umbral de inicio lento, ssthresh.

Estos trabajan de la siguiente manera (LO QUE SIGUE ES A MODO INFORMATIVO)

1. La inicialización de una conexión determinada establece cwnd = 1 en un segmento y ssthresh= 65535 bytes.
2. La rutina de salida TCP nunca envía más que el valor más bajo de cwnd o la ventana anunciada del receptor.
3. Cuando se produce una congestión (tiempo de espera o ACK duplicado), la mitad del actual tamaño de la ventana se guarda en ssthresh. Además, si la congestión se indica por un tiempo de espera, cwnd se establece en uno en el  segmento.
4. Cuando el otro extremo reconozca nuevos datos, aumenta cwnd, pero la forma en que aumenta depende de si TCP está realizando un slow start o Congestion avoidance. Si cwnd es menor o igual que ssthresh, TCP está en comienzo lento; de lo contrario, TCP está evitando la congestión.

Esto permite que se usen mecanismos para evitar la congestión en distintas situaciones de una misma conexión.