Problemas realistas en el control de congestión TCP
Si el remitente envía datos demasiado rápido, es posible que el receptor no tenga tiempo de recibirlos, lo que provocará la pérdida de datos. El llamado control de flujo sirve para evitar que la velocidad de envío del remitente sea demasiado rápida para que el receptor pueda recibirlo a tiempo.
Utilizando el mecanismo de ventana deslizante, el control de flujo del remitente se puede implementar fácilmente en la conexión TCP.
Deje que A envíe datos a B. Cuando se establece la conexión, B le dice a A: "Mi ventana de recepción es rwnd = 400" (donde rwnd representa la ventana de recepción). Por lo tanto, la ventana de envío del remitente no puede exceder el valor de la ventana de recepción proporcionada por el receptor. Tenga en cuenta que la unidad de ventana de TCP son bytes, no segmentos de mensajes. La figura no muestra el proceso de negociación de la ventana cuando se establece la conexión TCP. Suponga que la longitud de cada segmento es de 100 bytes y que el valor inicial del número de secuencia del segmento de datos se establece en 1. El reconocimiento en mayúscula representa el bit de reconocimiento en el encabezado y el ACK en minúscula representa el valor ACK del campo de reconocimiento.
Como se puede ver en la figura, B ha realizado el control de flujo tres veces. La ventana se reduce a rwnd = 300 por primera vez, a rwnd = 100 por segunda vez y finalmente a rwnd = 0, es decir, el remitente no puede enviar más datos. Este estado que hace que el remitente suspenda la transmisión continuará hasta que el Host B vuelva a enviar un nuevo valor de ventana. Los tres segmentos de datos enviados por B a A tienen ACK = 1 establecido. El campo del número de confirmación solo tiene significado cuando ACK=1.
TCP dispone de un temporizador continuo para cada conexión. Cada vez que un extremo de una conexión TCP recibe una notificación de ventana cero desde el otro extremo, inicia un temporizador persistente. Si el tiempo establecido por el temporizador de persistencia expira, se enviará un segmento de mensaje de control de ventana cero (con 1 byte de datos) y la parte que recibe el segmento de mensaje restablecerá el temporizador de persistencia.
2. Se debe considerar la velocidad de transmisión.
Se pueden utilizar diferentes mecanismos para controlar cuándo se envían los segmentos TCP. Por ejemplo:
Algoritmo de Nagle: si el proceso de aplicación de envío envía los datos que se enviarán al búfer de envío TCP byte a byte, el remitente enviará primero el primer byte de datos y almacenará en el búfer todos los bytes de datos posteriores. . Cuando el remitente recibe un acuse de recibo del primer carácter de datos, reúne todos los datos en el búfer de transmisión en un segmento de mensaje y lo envía, mientras continúa almacenando en el búfer los datos que llegan posteriores. El siguiente segmento sólo se enviará después de recibir la confirmación del segmento anterior. Cuando los datos llegan rápidamente y la velocidad de la red es lenta, el uso de este método puede reducir significativamente el ancho de banda de la red. El algoritmo de Nagle también estipula que cuando los datos que llegan alcanzan la mitad del tamaño de la ventana de envío o la longitud máxima del segmento del mensaje, se enviará un segmento del mensaje inmediatamente.
Además, síndrome de ventana de confusión: la caché del receptor TCP está llena y el proceso de aplicación interactiva solo lee 1 byte de la caché del receptor a la vez (haciendo que el espacio de la caché del receptor solo libere 1 byte), y luego escribe en El remitente envía un acuse de recibo, configurando la ventana en 1 byte (pero el datagrama enviado es de 40 bytes). Sí, el remitente envió 1 byte de datos (el datagrama IP del remitente es de 41 bytes). El receptor devuelve un acuse de recibo, aún configurando la ventana en 1 byte. De esta forma, la eficiencia de la red es muy baja. Para resolver este problema, el receptor puede esperar un período de tiempo para que el búfer del receptor tenga suficiente espacio para acomodar el segmento de mensaje más largo, o que el búfer del receptor esté medio libre. Siempre que ocurran estas dos situaciones, el receptor enviará un mensaje de confirmación informando al remitente del tamaño de la ventana actual. Además, el remitente no debe enviar segmentos que sean demasiado pequeños, sino acumular datagramas en segmentos que sean lo suficientemente grandes, o la mitad del tamaño del espacio de búfer del receptor.
Control de congestión TCP
1. Congestión: La demanda de recursos supera los recursos disponibles. Si muchos recursos en la red escasean al mismo tiempo, el rendimiento de la red se deteriorará significativamente y el rendimiento de toda la red disminuirá a medida que aumenta la carga.
Control de congestión: Evita que se inyecte un exceso de datos en la red para que los enrutadores o enlaces de la red no se sobrecarguen. Lo que tiene que hacer el control de la congestión tiene un requisito previo: la red puede soportar la carga de la red existente.
El control de la congestión es un proceso global que involucra a todos los hosts, enrutadores y todos los factores relacionados que reducen el rendimiento de la transmisión de la red.
Control de tráfico: se refiere al control del tráfico punto a punto. Este es un problema de un extremo a otro. Lo que tiene que hacer el control de flujo es suprimir la velocidad a la que el remitente envía datos para que el receptor pueda recibirlos a tiempo.
Coste de control de congestión: Necesidad de obtener información sobre la distribución del tráfico dentro de la red. Antes de implementar el control de congestión, es necesario intercambiar información y varios comandos entre los nodos para seleccionar una estrategia de control e implementar el control. Esto crea gastos generales adicionales. El control de la congestión también requiere asignar algunos recursos a cada usuario para uso individual, impidiendo un mejor disfrute de los recursos de la red.
2. Varios métodos de control de congestión
Inicio lento, evitación de congestión, retransmisión rápida y recuperación rápida.
2.1 Inicio lento y prevención de congestión
El remitente mantiene la variable de estado de la ventana de congestión (CWND). El tamaño de la ventana de congestión depende del grado de congestión de la red y cambia dinámicamente. El remitente iguala su ventana de envío a la congestión.
El principio del remitente que controla la ventana de congestión es que mientras la red no esté congestionada, la ventana de congestión aumentará para enviar más paquetes de datos. Pero siempre que la red está congestionada, la ventana de congestión se reduce para reducir la cantidad de paquetes inyectados en la red.
Algoritmo de inicio lento: cuando un host comienza a enviar datos, si se inyecta una gran cantidad de bytes de datos en la red inmediatamente, puede causar congestión en la red porque la carga de la red ahora no está clara. Por lo tanto, un mejor método es detectar primero, es decir, aumentar gradualmente la ventana de transmisión de pequeña a grande, es decir, aumentar gradualmente el valor de la ventana de congestión de pequeña a grande. Normalmente, al comenzar a enviar un segmento de mensaje, la ventana de congestión cwnd se establece en el valor del segmento de mensaje más grande MSS. Sin embargo, después de recibir cada acuse de recibo de un nuevo segmento de mensaje, la ventana de congestión aumenta como máximo en un valor MSS. Al aumentar gradualmente la ventana de congestión del remitente cwnd de esta manera, la velocidad a la que se inyectan los paquetes en la red puede hacerse más razonable.
La ventana de congestión cwnd se duplica en cada ronda de transmisión. El tiempo de una ronda de transmisión es en realidad el tiempo de ida y vuelta RTT. Pero una "ronda de transmisión" pone más énfasis en enviar continuamente todos los segmentos permitidos por la ventana de congestión cwnd y recibir un acuse de recibo del último byte enviado.
Además, "inicio lento" no significa que la tasa de crecimiento de cwnd sea lenta, sino que cwnd = 1 se establece cuando TCP comienza a enviar un segmento, de modo que el remitente solo puede enviar un segmento. al principio del segmento (para probar la congestión de la red) y luego aumente gradualmente cwnd.
Para evitar que la ventana de congestión cwnd crezca demasiado rápido y cause congestión en la red, también es necesario establecer una variable de estado ssthresh de umbral de inicio lento (cómo configurar ssthresh). El umbral de inicio lento ssthresh se puede usar de la siguiente manera:
Cuando cwnd
Cuando cwnd> Ssthresh, deje de usar el algoritmo de inicio lento y cambie al algoritmo para evitar la congestión.
Cuando cwnd = ssthresh, se pueden utilizar tanto el algoritmo de inicio lento como el algoritmo para evitar el control de la congestión.
Algoritmo para evitar la congestión: haga que la ventana de congestión cwnd aumente lentamente, es decir, para cada RTT de ida y vuelta, la ventana de congestión cwnd del remitente aumenta en 1 en lugar de duplicarse. De esta manera, la ventana de congestión cwnd crece lentamente según una ley lineal, que es mucho más lenta que el algoritmo de inicio lento.
Ya sea en la fase de inicio lento o en la fase de evitación de congestión, siempre que el remitente determine que la red está congestionada (en función de no recibir confirmación), debe establecer el umbral de inicio lento ssthresh a la mitad. del valor de la ventana del remitente cuando se produce congestión (pero no menos de 2). Luego, la ventana de congestión cwnd se restablece a 1 y se implementa el algoritmo de inicio lento. El propósito de esto es reducir rápidamente la cantidad de paquetes que un host envía a la red, dando a los enrutadores congestionados tiempo suficiente para procesar la acumulación de paquetes en la cola.
Como se muestra en la figura siguiente, el proceso de control de congestión anterior se explica con valores numéricos específicos. La ventana de envío ahora es tan grande como la ventana de congestión.
lt1 gt; Cuando se inicializa la conexión TCP, establezca la ventana de congestión cwnd en 1.
Como se mencionó anteriormente, para facilitar la comprensión, la unidad de ventana en la figura usa el número de segmentos en lugar del número de bytes. El valor inicial del umbral de inicio lento se establece en 16 segmentos, es decir, cwnd = 16.
lt2 gtAl ejecutar el algoritmo de inicio lento, el valor inicial de la ventana de congestión cwnd es 1. De ahora en adelante, cada vez que el remitente recibe un acuse de recibo para un nuevo segmento de mensaje, cambia el valor de la ventana de congestión a 1 y luego comienza la siguiente ronda de transmisión (la abscisa en la figura es la ronda de transmisión). Por lo tanto, la ventana de congestión cwnd crece exponencialmente con las rondas de transmisión. Cuando la ventana de congestión cwnd aumenta hasta el umbral de inicio lento ssthresh (es decir, cwnd=16), se ejecuta el algoritmo de control de congestión y la ventana de congestión crece linealmente.
lt3 gt Supongamos que cuando el valor de la ventana de congestión aumenta a 24, la red expirará (es probable que esto se deba a una congestión de la red). El valor ssthresh actualizado pasa a ser 12 (es decir, pasa a ser la mitad del valor de la ventana de congestión 24 cuando expira el tiempo de espera), la ventana de congestión se restablece a 1 y se ejecuta el algoritmo de inicio lento. Cuando cwnd=ssthresh=12, en su lugar se ejecuta el algoritmo para evitar la congestión, la ventana de congestión crece linealmente y el tamaño del MSS aumenta con cada tiempo de ida y vuelta.
Énfasis: "Evitar la congestión" no significa que la congestión pueda evitarse por completo. La congestión de la red aún no se puede evitar por completo utilizando las medidas anteriores. "Evitar la congestión" se refiere a controlar el crecimiento lineal de la ventana de congestión durante la fase de evitación de la congestión para hacer que la red sea menos propensa a la congestión.