Transporte de confiabilidad TCP
Todos estamos familiarizados con el protocolo TCP como un protocolo de transporte confiable, pero ¿cómo garantiza la confiabilidad del transporte?
Para lograr una transmisión confiable, se deben considerar diversos factores, como la corrupción, la pérdida, la duplicación y los fragmentos desordenados de datos. Si no se pueden resolver estos problemas, no se logrará una transmisión confiable.
Por lo tanto, TCP emplea mecanismos como número de secuencia, respuesta de acuse de recibo, control de reenvío, gestión de conexión y control de ventana para lograr una transmisión confiable.
En este artículo, nos centraremos en la ventana deslizante, el control de flujo y el control de congestión de TCP. El mecanismo de retransmisión se aborda por separado en la siguiente sección.
Control de flujo de red
El Control de Flujo de Red, o Control de Tráfico de Red, es en realidad una manifestación de la sutil relación entre productores y consumidores. Probablemente te hayas encontrado con esta situación a menudo en el trabajo o en entrevistas. Si la capacidad de producción del productor supera con creces la capacidad de consumo del consumidor, la cola crecerá indefinidamente. En un caso más grave, cuando los mensajes de RabbitMQ se acumulan demasiado, el rendimiento de todo el servidor MQ puede verse afectado. Lo mismo ocurre con TCP: si no se controla, se enviarán demasiados mensajes a la red y los consumidores habrán excedido su capacidad, mientras que los productores seguirán enviando mensajes duplicados, lo que afectará gravemente el rendimiento de la red.
Para solucionar este fenómeno, TCP proporciona un mecanismo para que el emisor controle la cantidad de datos enviados en función de la capacidad de recepción real del receptor, conocido como control de flujo. El receptor mantiene una ventana de recepción, mientras que el emisor mantiene una ventana de envío. Cabe destacar que estas ventanas son solo para una única conexión TCP y no todas las conexiones comparten una ventana.
TCP proporciona control de flujo mediante una variable para la ventana de recepción. Esta ventana indica al emisor la cantidad de espacio de caché disponible. El emisor controla la cantidad de datos enviados según la capacidad de aceptación real del receptor.
El host receptor notifica al emisor el tamaño de los datos que puede recibir, y este envía hasta este límite. Este límite es el tamaño de la ventana. ¿Recuerda el encabezado TCP? Existe un campo de ventana de recepción que indica la cantidad de bytes que el receptor puede o desea recibir.
El host emisor enviará periódicamente un paquete de sondeo de ventana para detectar si el host receptor aún puede aceptar datos. Cuando el búfer del receptor corre el riesgo de desbordarse, el tamaño de la ventana se reduce para indicar al emisor que controle la cantidad de datos enviados.
Aquí hay un diagrama de control de flujo de red:
Control de congestión de la red
Antes de introducir el control de congestión, es necesario comprender que, además de las ventanas de recepción y de envío, existe una ventana de congestión, que se utiliza principalmente para determinar la velocidad a la que el emisor comienza a enviar datos a la ventana de recepción. Por lo tanto, el emisor TCP también mantiene la ventana de congestión. Necesitamos un algoritmo para determinar la cantidad de datos adecuada para enviar, ya que enviar muy pocos o demasiados datos no es ideal; de ahí el concepto de ventana de congestión.
En el control de flujo de red anterior, lo que evitábamos era que el emisor llenara la caché del receptor con datos, pero desconocíamos qué sucedía en la red. Normalmente, las redes informáticas se encuentran en un entorno compartido. Como resultado, puede haber congestión en la red debido a la comunicación entre otros hosts.
Cuando la red está congestionada, si se envía continuamente una gran cantidad de paquetes, pueden surgir problemas como retrasos y pérdidas. En este punto, TCP retransmitirá los datos, pero la retransmisión aumentará la carga de la red, lo que resultará en mayores retrasos y más pérdidas de paquetes. Esto puede generar un círculo vicioso que se agravará.
Por lo tanto, TCP no puede ignorar lo que sucede en la red. Cuando la red se congestiona, TCP se sacrifica reduciendo la cantidad de datos que envía.
Por lo tanto, se propone el control de congestión, cuyo objetivo es evitar que la red se sature con datos del remitente. Para regular la cantidad de datos que el remitente debe enviar, TCP define un concepto denominado ventana de congestión. El algoritmo de control de congestión ajustará el tamaño de la ventana de congestión según el grado de congestión de la red, para así controlar la cantidad de datos enviados por el remitente.
¿Qué es una ventana de congestión? ¿Qué tiene que ver con la ventana de envío?
La ventana de congestión es una variable de estado que mantiene el remitente y que determina la cantidad de datos que puede enviar. Esta ventana cambia dinámicamente según el nivel de congestión de la red.
La ventana de envío es un tamaño de ventana acordado entre el emisor y el receptor, que indica la cantidad de datos que este último puede recibir. La ventana de congestión y la ventana de envío están relacionadas; la ventana de envío suele ser igual al mínimo de las ventanas de congestión y recepción, es decir, swnd = min(cwnd, rwnd).
La ventana de congestión cwnd cambia de la siguiente manera:
Si no hay congestión en la red, es decir, no se produce ningún tiempo de espera de retransmisión, la ventana de congestión aumenta.
Si hay congestión en la red, la ventana de congestión disminuye.
El remitente determina si la red está congestionada observando si el paquete de confirmación de ACK se recibe dentro del plazo especificado. Si el remitente no recibe el paquete de confirmación de ACK dentro del plazo especificado, se considera que la red está congestionada.
Además de la ventana de congestión, es hora de analizar el algoritmo de control de congestión TCP. Este algoritmo consta de tres partes principales:
Inicio lento:Inicialmente, la ventana de congestión de cwnd es relativamente pequeña y el remitente aumenta la ventana de congestión exponencialmente para adaptarse rápidamente a la capacidad de la red.
Prevención de la congestión:Una vez que la ventana de congestión excede un cierto umbral, el remitente aumenta la ventana de congestión de manera lineal para reducir la tasa de crecimiento de la ventana de congestión y evitar sobrecargar la red.
Recuperación rápida:Si se produce una congestión, el remitente reduce a la mitad la ventana de congestión y entra en el estado de recuperación rápida para determinar la ubicación de la recuperación de la red a través de los acuses de recibo duplicados recibidos y luego continúa aumentando la ventana de congestión.
Inicio lento
Al establecer una conexión TCP, la ventana de congestión cwnd se establece inicialmente en un valor mínimo de MSS (tamaño máximo de segmento). De esta manera, la velocidad de envío inicial es de aproximadamente MSS/RTT bytes/segundo. El ancho de banda disponible suele ser mucho mayor que MSS/RTT, por lo que TCP busca la velocidad de envío óptima, que puede lograrse mediante un inicio lento.
En el proceso de inicio lento, el valor de la ventana de congestión cwnd se inicializa en 1 MSS y, cada vez que se confirma la transmisión de un segmento de paquete, su valor se incrementa en un MSS, es decir, alcanza los 2 MSS. Posteriormente, el valor de cwnd se duplica por cada transmisión exitosa de un segmento de paquete, y así sucesivamente. El proceso de crecimiento específico se muestra en la siguiente figura.
Sin embargo, la tasa de envío no siempre puede crecer; este crecimiento debe detenerse en algún momento. Entonces, ¿cuándo termina el aumento de la tasa de envío? El inicio lento suele detener el aumento de la tasa de envío de una de las siguientes maneras:
La primera forma es el caso de pérdida de paquetes durante el proceso de envío de inicio lento. Cuando se produce una pérdida de paquetes, TCP establece la ventana de congestión del remitente (cwnd) en 1 y reinicia el proceso de inicio lento. En este punto, se introduce el concepto de umbral de inicio lento (ssthresh), cuyo valor inicial es la mitad del valor de cwnd que genera la pérdida de paquetes. Es decir, cuando se detecta congestión, el valor de ssthresh es la mitad del valor de la ventana.
La segunda forma es correlacionar directamente con el valor del umbral de inicio lento ssthresh. Dado que el valor de ssthresh es la mitad del valor de la ventana cuando se detecta congestión, puede producirse una pérdida de paquetes con cada duplicación si cwnd es mayor que ssthresh. Por lo tanto, es recomendable establecer cwnd en ssthresh, lo que provocará que TCP cambie al modo de control de congestión y finalice el inicio lento.
La última forma en que el inicio lento puede terminar es si se detectan tres ACKs redundantes. TCP realiza una retransmisión rápida y entra en estado de recuperación. (Si no está claro por qué hay tres paquetes ACK, se explicará por separado en el mecanismo de retransmisión).
Prevención de la congestión
Cuando TCP entra en estado de control de congestión, cwnd se establece en la mitad del umbral de congestión ssthresh. Esto significa que el valor de cwnd no puede duplicarse cada vez que se recibe un segmento de paquete. En su lugar, se adopta un enfoque relativamente conservador: el valor de cwnd se incrementa solo en un MSS (longitud máxima del segmento de paquete) después de cada transmisión. Por ejemplo, incluso si se reconocen 10 segmentos de paquete, el valor de cwnd solo aumentará en un MSS. Este es un modelo de crecimiento lineal con un límite superior. Cuando se produce una pérdida de paquetes, el valor de cwnd se cambia a un MSS y el valor de ssthresh se establece en la mitad de cwnd. También se detiene el crecimiento de MSS cuando se reciben tres respuestas ACK redundantes. Si se siguen recibiendo tres ACK redundantes después de reducir a la mitad el valor de cwnd, el valor de ssthresh se registra como la mitad del valor de cwnd y se entra en el estado de recuperación rápida.
Recuperación rápida
En el estado de Recuperación Rápida, el valor de la ventana de congestión cwnd se incrementa en un MSS por cada ACK redundante recibido, es decir, un ACK que no llega en secuencia. Esto permite aprovechar los segmentos de paquetes que se han transmitido correctamente en la red para optimizar la eficiencia de transmisión.
Cuando llega un acuse de recibo del segmento de paquete perdido, TCP reduce el valor de cwnd y entra en el estado de prevención de congestión. Esto permite controlar el tamaño de la ventana de congestión y evitar que la congestión de la red siga aumentando.
Si se agota el tiempo de espera después del estado de control de congestión, la condición de la red se agrava y TCP migra del estado de prevención de congestión al estado de inicio lento. En este caso, el valor de la ventana de congestión cwnd se establece en 1 MSS, la longitud máxima del segmento de paquete, y el valor del umbral de inicio lento ssthresh se establece en la mitad de cwnd. El objetivo es aumentar gradualmente el tamaño de la ventana de congestión después de que la red se recupere para equilibrar la velocidad de transmisión y el grado de congestión de la red.
Resumen
Como protocolo de transporte confiable, TCP implementa transporte confiable mediante número de secuencia, acuse de recibo, control de retransmisión, gestión de conexión y control de ventana. Entre ellos, el mecanismo de control de flujo controla la cantidad de datos enviados por el emisor según la capacidad de recepción real del receptor, lo que evita los problemas de congestión de la red y la degradación del rendimiento. El mecanismo de control de congestión evita la congestión de la red ajustando la cantidad de datos enviados por el emisor. Los conceptos de ventana de congestión y ventana de envío están relacionados entre sí, y la cantidad de datos en el emisor se controla ajustando dinámicamente el tamaño de la ventana de congestión. El inicio lento, la prevención de congestión y la recuperación rápida son los tres componentes principales del algoritmo de control de congestión de TCP, que ajusta el tamaño de la ventana de congestión mediante diferentes estrategias para adaptarse a la capacidad y el grado de congestión de la red.
En la siguiente sección, examinaremos en detalle el mecanismo de retransmisión de TCP. Este mecanismo es fundamental para lograr una transmisión fiable. Garantiza la transmisión fiable de datos mediante la retransmisión de datos perdidos, dañados o retrasados. El principio de implementación y la estrategia del mecanismo de retransmisión se presentarán y analizarán en detalle en la siguiente sección. ¡Manténganse al tanto!
Hora de publicación: 24 de febrero de 2025