El valor CongestionWindowSize se calcula siguiendo las siguientes reglas:
Estima el RTT promedio como
donde:
Finalmente, la estimación (promedio) para el time-out es
El algoritmo original no funciona correctamente cuando ocurre una retransmisión. En esta situación, el emisor no puede saber si el ACK recibido se corresponde con la primera o la segunda transmisión (problema de la ambigüedad del ACK). Si supone que es con la primera y no ocurre así, el SampleRTT medido sería demasiado largo. Si supone que es con la segunda y esto no es cierto, el cálculo es demasiado corto. Gráficamente:
Ambos errores son perjudiciales para el cálculo del TimeOut:
La solución:
Ignorar los RTT’s de los segmentos retransmitidos para computar el time-out.
Estimar el RTT sólo para los segmentos que no son retransmitidos acarrea un nuevo problema. Supongamos que debido a un aumento en la carga de la red o de la congestión, el RTT aumenta por encima del time-out, lo que provoca una retransmisión. Como el TCP va a ignorar el RTT de los segmentos retransmitidos, nunca va a actualizar la estimación para el RTT mientras las latencias sigan siendo altas y el ciclo continuará. Por este motivo, además:
Cada vez que se retransmite se dobla el time-out, hasta alcanzar 2×MSL [4].
El motivo de este aumento exponencial del time-out obedece a que normalmente un aumento en las latencias se debe a problemas de congestión y ante esta situación lo mejor es disminuir rápidamente la frecuencia de las retransmisiones.
Por desgracia, la mejora del algoritmo básico realizada por Karn y Partridge no funciona cuando los niveles de congestión son altos, ya que las latencias son muy variables. En esta situación es muy importante no colapsar aún más la red usando time-outs demasiado bajos.
La mejora propuesta por Jacobson y Karels consiste en tener en cuenta además la variación de los RTT’s, no sólo su media. Intuitivamente, si la varianza es baja, entonces EstimatedRTT es más fiable. Por otra parte, una varianza alta significa que EstimatedRTT no debe ser considerado con tanto peso a la hora de calcular TimeOut. De esta forma, el cálculo actual del time-out en el TCP es
donde: