Transporte de confiabilidad TCP
Todos estamos familiarizados con el protocolo TCP como un protocolo de transporte fiable, pero ¿cómo garantiza la fiabilidad del transporte?
Para lograr una transmisión confiable, es necesario considerar muchos factores, como la corrupción, la pérdida, la duplicación y la fragmentación desordenada de datos. Si estos problemas no se resuelven, no se podrá lograr una transmisión confiable.
Por lo tanto, TCP emplea mecanismos como el número de secuencia, la respuesta de acuse de recibo, el control de reenvío, la gestión de la conexión y el control de la ventana para lograr una transmisión fiable.
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, también conocido como control de tráfico de red, es una manifestación de la compleja relación entre productores y consumidores. Probablemente te hayas encontrado con esta situación muchas veces en el trabajo o en entrevistas de trabajo. 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, sabrás que cuando los mensajes de RabbitMQ se acumulan en exceso, el rendimiento de todo el servidor MQ puede degradarse. Lo mismo ocurre con TCP; si no se controla, se enviarán demasiados mensajes a la red y los consumidores superarán su capacidad, mientras que los productores seguirán enviando mensajes duplicados, lo que afectará gravemente al rendimiento de la red.
Para abordar este fenómeno, TCP proporciona un mecanismo que permite al emisor controlar la cantidad de datos enviados en función de la capacidad de recepción real del receptor, lo que se conoce 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 exclusivas de una única conexión TCP y no todas las conexiones comparten una ventana.
TCP proporciona control de flujo mediante una variable que define la ventana de recepción. Esta ventana indica al remitente cuánto espacio de caché queda disponible. El remitente controla la cantidad de datos enviados según la capacidad de recepción real del receptor.
El host receptor notifica al remitente el tamaño máximo de datos que puede recibir, y el remitente envía hasta ese límite. Este límite es el tamaño de la ventana, ¿recuerdas el encabezado TCP? Existe un campo de ventana de recepción que indica la cantidad de bytes que el receptor puede o está dispuesto a recibir.
El host emisor enviará periódicamente un paquete de sondeo de ventana, que se utiliza para detectar si el host receptor aún puede aceptar datos. Cuando el búfer del receptor está a punto de desbordarse, el tamaño de la ventana se reduce para indicar al emisor que controle la cantidad de datos enviados.
Aquí se muestra 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 la ventana de recepción y la ventana de envío, existe una ventana de congestión, que se utiliza principalmente para determinar la frecuencia con la que el emisor comienza a enviar datos a la ventana de recepción. Por lo tanto, el emisor TCP también gestiona la ventana de congestión. Necesitamos un algoritmo para decidir la cantidad de datos que se deben enviar, ya que enviar demasiados o muy pocos datos no es lo 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 remitente llenara la caché del receptor con datos, pero desconocíamos lo que ocurría en la red. Normalmente, las redes informáticas se encuentran en un entorno compartido. Por consiguiente, puede haber congestión de red debido a la comunicación entre otros hosts.
Cuando la red está congestionada, si se sigue enviando un gran número de paquetes, pueden surgir problemas como retrasos y pérdida de paquetes. En este caso, TCP retransmitirá los datos, pero la retransmisión aumentará la carga en la red, lo que provocará mayores retrasos y más pérdida de paquetes. Esto puede convertirse en un círculo vicioso que se agrava progresivamente.
Por lo tanto, TCP no puede ignorar lo que sucede en la red. Cuando la red está congestionada, 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 llamado 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 esto 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 acordado entre el emisor y el receptor que indica la cantidad de datos que el receptor 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, si 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 al observar si recibe el paquete de confirmación ACK dentro del tiempo especificado. Si el remitente no recibe el paquete de confirmación ACK dentro de dicho tiempo, se considera que la red está congestionada.
Además de la ventana de congestión, es momento de analizar el algoritmo de control de congestión TCP. El algoritmo de control de congestión TCP consta de tres partes principales:
Comienzo lento:Inicialmente, la ventana de congestión 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 supera un determinado umbral, el remitente aumenta dicha ventana de forma lineal para ralentizar su crecimiento y evitar la sobrecarga de la red.
Recuperación rápida:Si se produce 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.
Comienzo lento
Cuando se establece una conexión TCP, la ventana de congestión cwnd se configura inicialmente con un valor mínimo de MSS (tamaño máximo de segmento). De esta forma, la tasa de envío inicial es de aproximadamente MSS/RTT bytes/segundo. El ancho de banda disponible real suele ser mucho mayor que MSS/RTT, por lo que TCP busca la tasa de envío óptima, que se puede lograr mediante un inicio lento.
En el proceso de inicio lento, el valor de la ventana de congestión cwnd se inicializa en 1 MSS. Cada vez que se confirma la recepción de un segmento de paquete transmitido, el valor de cwnd aumenta en 1 MSS, hasta alcanzar 2 MSS. Posteriormente, el valor de cwnd se duplica con 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 puede crecer indefinidamente; el crecimiento tiene que terminar en algún momento. Entonces, ¿cuándo termina el aumento de la tasa de envío? El inicio lento generalmente finaliza el aumento de la tasa de envío de una de varias 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 opción consiste en 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 pérdida de paquetes con cada duplicación cuando cwnd es mayor que ssthresh. Por lo tanto, lo mejor es establecer cwnd igual a ssthresh, lo que provocará que TCP cambie al modo de control de congestión y finalice el inicio lento.
La última forma en que puede terminar el inicio lento es si se detectan tres acuses de recibo redundantes; en ese caso, TCP realiza una retransmisión rápida y entra en el estado de recuperación. (Si no queda 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 el 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 en el que el valor de cwnd aumenta solo en un MSS (longitud máxima del segmento de paquete) después de que se completa cada transmisión. Por ejemplo, incluso si se confirman 10 segmentos de paquete, el valor de cwnd solo aumentará en un MSS. Este es un modelo de crecimiento lineal y también tiene un límite superior de crecimiento. Cuando se produce una pérdida de paquetes, el valor de cwnd cambia a un MSS y el valor de ssthresh se establece en la mitad de cwnd. O bien, se detendrá el crecimiento de MSS cuando se reciban 3 respuestas ACK redundantes. Si aún se reciben 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 aumenta 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 mejorar al máximo la eficiencia de la transmisión.
Cuando llega una confirmación (ACK) del segmento de paquete perdido, TCP disminuye 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 red se congestione aún más.
Si se produce un tiempo de espera después del estado de control de congestión, la situación de la red se agrava y TCP pasa del estado de evitació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 una vez que la red se recupera, para equilibrar la tasa de transmisión y el grado de congestión de la red.
Resumen
Como protocolo de transporte fiable, TCP implementa la fiabilidad mediante números de secuencia, acuses de recibo, control de retransmisión, gestión de conexiones y control de ventanas. El mecanismo de control de flujo regula la cantidad de datos enviados por el emisor según la capacidad de recepción del receptor, evitando así la 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, 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 la congestión y la recuperación rápida son los tres componentes principales del algoritmo de control de congestión de TCP, que ajustan 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, analizaremos en detalle el mecanismo de retransmisión de TCP. Este mecanismo es fundamental para lograr una transmisión confiable de datos, ya que garantiza la transmisión segura al reenviar los datos perdidos, corruptos 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. ¡No se lo pierdan!
Fecha de publicación: 24 de febrero de 2025

