TCP estima RTT usando un promedio móvil ponderado exponencial (https://en.m.wikipedia.org/wiki/… (lo siento, no puedo entender cómo formatear el hipervínculo en el móvil)) basado en el RTT observado durante la transmisión.
Básicamente, cuando TCP envía un paquete, inicia un temporizador, que se agota cuando alcanza el valor TimeoutInterval calculado. Para simplificar, solo se usa un temporizador, a pesar del hecho de que varios segmentos pueden estar en tránsito a la vez (esto se llama canalización).
Para cualquier paquete dado, hay un número de secuencia. Cuando el remitente TCP recibe un ACK para el paquete, detiene el temporizador; el tiempo transcurrido se guarda como SampleRTT y proporciona una instantánea de las condiciones de la red. Como este valor puede fluctuar con el tiempo, la EWMA se calcula utilizando la EstimatedRTT anterior y la SampleRTT recién adquirida mediante la ecuación:
- ¿Por qué se dice que es difícil ejecutar servidores en casa debido a la traducción de direcciones de red?
- ¿Cuáles son los hechos más interesantes sobre la dirección IP?
- ¿Cuál es la necesidad de un protocolo de ventana deslizante en un pagador de enlace de datos?
- Cómo verificar la cola de TCP backlog para un proceso específico en Linux
- ¿Por qué son necesarias las direcciones IPv4 privadas y cómo funcionan?
EstimatedRTT = 0.875 * EstimatedRTT + 0.125 * SampleRTT
Para obtener una explicación de los valores utilizados, consulte RFC 6298. El uso de un EWMA significa que la importancia relativa de una muestra dada disminuye exponencialmente a medida que se agregan más. En inglés, las muestras más recientes se consideran más importantes porque representan una estimación más reciente.
Además del promedio, la variabilidad o desviación RTT se estima por
DevRTT = 0.75 * DevRTT + 0.25 * | SampleRTT – EstimatedRTT |
Dados estos promedios, debemos decidir un tiempo de espera para establecer. Obviamente, el tiempo de espera debe ser al menos EstimatedRTT, con un margen adicional de variación. Si DevRTT es pequeño, el RTT es bastante constante, por lo que el margen puede ser pequeño. Si la varianza es mayor, deberíamos permitir un margen de error mayor. Por lo tanto
TimeoutInterval = EstimatedRTT + 4 * DevRTT
RFC 6298 recomienda un intervalo de tiempo de espera inicial de un segundo. Cuando se produce un tiempo de espera, el valor de TimeoutInterval se duplica para evitar otro tiempo de espera para el mismo paquete. Esto también proporciona cierto control de congestión: cuantos más tiempos de espera se produzcan, más tiempo esperará TCP antes de la retransmisión. Una vez que pasa el paquete problemático, TimeoutInterval se restaura a su último valor calculado. EstimatedRTT no se calcula para los paquetes que se retransmiten, por lo que esta duplicación no afecta el valor.