Protocolo de Control de Transmisión (TCP): Conexión, Fiabilidad y Congestión

5. Transporte Orientado a la Conexión: TCP

TCP (Transmission Control Protocol) es un servicio de transporte fiable orientado a la conexión que incorpora las siguientes características esenciales: gestión de estado, control de flujo, control de congestión, garantía de entrega, establecimiento de conexión y segmentación de datos.

Funciones Mínimas de un Protocolo de Transporte

Una conexión TCP es full-duplex y punto a punto, por lo que no permite la transferencia de datos a múltiples receptores simultáneamente. Para iniciar la comunicación, los procesos de aplicación en ambos hosts deben establecer la conexión previamente. Es crucial notar que los sistemas intermedios (routers) no mantienen estados de la conexión TCP.

Establecimiento de la Conexión TCP

El establecimiento de la conexión es un acuerdo en tres fases (el three-way handshake) que implica:

  1. Intercambio de tres segmentos especiales (SYN, SYN-ACK, ACK).
  2. Definición de las variables de estado.
  3. Un retardo de establecimiento previo a la transferencia de datos.

Una vez establecida, el proceso de aplicación cliente pasa los datos a través del socket al buffer de emisión. TCP enviará segmentos de datos a la capa de red según su conveniencia.

Segmentación y MSS

La cantidad máxima de datos que puede llevar un segmento TCP está limitada por el MSS (Maximum Segment Size). El MSS depende del tamaño de la MTU (Maximum Transmission Unit) para garantizar que el segmento TCP se ajuste a una trama y evitar la fragmentación a nivel IP.

Estructura del Segmento TCP

La estructura del segmento TCP incluye:

  • Cabecera: 20 bytes fijos.
  • Puertos: Número de puerto de origen y de destino (16 bits cada uno).
  • Número de Secuencia (SN): 32 bits. Indica el número de secuencia del primer byte de datos del segmento.
  • Número de Reconocimiento (ACK): 32 bits. Indica el SN del siguiente byte esperado.
  • Longitud de Cabecera: 4 bits.
  • Flags (1 bit cada uno):
    • ACK: Validez del campo Número de Reconocimiento.
    • SYN: Establecimiento de conexión.
    • FIN: Cierre de conexión.
    • URG: Contenido urgente.
    • PSH: Pasar de inmediato los datos a la capa superior.
    • RST: Rechazo de conexión.
  • Ventana de Recepción: 16 bits.
  • Suma de Verificación (Checksum): 16 bits.
  • Puntero de Datos Urgente: 16 bits.
  • Opciones: Longitud variable.

Funciones del Emisor TCP

Las funciones principales del emisor son:

  1. Recepción de PDUs de la Capa Superior: TCP encapsula los datos en un segmento, los pasa a la capa IP y se inicia un temporizador para ese segmento.
  2. Recepción de ACK: Se compara el valor del ACK con la variable BaseEmision (el SN más antiguo pendiente de ACK). Si el valor del ACK es mayor que BaseEmision, el ACK confirma ese segmento y todos los anteriores (reconocimiento acumulativo).
  3. Fin de Temporizador (Timeout): TCP retransmite el segmento asociado y se reinicia el temporizador. Cada vez que TCP retransmite por timeout, el valor del temporizador se duplica.

Retransmisión Rápida

La Retransmisión Rápida es una solución para mitigar los problemas de retardo que se producen con timeouts largos. Un emisor detecta la pérdida de paquetes si recibe tres ACK duplicados del último byte recibido correctamente.

Para la resolución de errores en cadena, TCP utiliza una solución híbrida que combina:

  • GBN (Go-Back-N): Con reconocimientos acumulativos y ACK duplicados.
  • SR (Selective Repeat): Con retransmisión selectiva y almacenamiento en el buffer del receptor de segmentos con SN fuera de orden.

Control de Flujo TCP

El Control de Flujo es el procedimiento de TCP para regular la velocidad entre emisor y receptor con el fin de evitar el desbordamiento del buffer del receptor. Se asume que el emisor conoce el valor de la Ventana de Recepción (W).

  • Si el buffer está lleno, la ventana es nula (W=0) y el emisor es notificado para que detenga el envío de segmentos.
  • Cuando el proceso de aplicación lee y saca segmentos del buffer, el receptor actualiza el valor de la ventana al emisor.
  • Si el emisor detecta que la ventana es cero, debe continuar enviando segmentos de un byte periódicamente (por ejemplo, por minuto) para evitar el bloqueo total de la conexión.

7. Mecanismos de Control de Congestión en TCP

TCP utiliza el control de congestión terminal a terminal, ya que los routers IP no proporcionan realimentación directa al emisor sobre el estado de congestión de la red.

Ventana de Congestión (VC)

El emisor TCP regula la velocidad de transmisión (Vtrans) mediante la variable Ventana de Congestión (VC), la cual se ajusta en función de la congestión observada. La VC establece la restricción de velocidad máxima impuesta por el emisor.

La Ventana del Emisor (VE) es el número de bytes que se pueden enviar sin esperar ACK. Representa el valor mínimo entre la VC y la Ventana de Recepción (W):

VE = min{VC, W}

Si el buffer del receptor tiene gran capacidad (no requiere control de flujo), entonces VE es limitada principalmente por VC. Si apenas hay congestión, la velocidad de transmisión es aproximadamente Vtrans = VC / RTT (Round Trip Time).

Detección y Reacción a la Congestión

El emisor TCP percibe la congestión mediante dos sucesos principales:

  1. Vencimiento del timeout.
  2. Recepción de tres ACKs duplicados.

Ante la congestión, la Vtrans se reduce. Si los ACKs se reciben de forma normal y correcta, se asume que no hay congestión, lo que permite un incremento rápido o lento de VC y Vtrans, dependiendo de la fase del algoritmo.

Algoritmo de Control de Congestión TCP (AIMD)

El control de congestión TCP sigue el principio AIMD (Crecimiento Aditivo y Decremento Multiplicativo) y opera en tres modos:

1. Arranque Lento (Slow Start)

Se inicia cuando se establece una conexión TCP o después de un timeout. Aunque se llama «lento», la Vtrans se incrementa exponencialmente:

  • El VC inicial se establece en 1 MSS.
  • VC se incrementa en 1 MSS por cada ACK recibido de un segmento transmitido.
  • Por lo tanto, Vtrans se duplica en cada periodo RTT durante esta fase.

Esta fase termina si:

  • Vencimiento del Timeout: Se pierde un paquete. El emisor establece VC = 1 MSS y reinicia el proceso de Arranque Lento.
  • VC alcanza el Umbral: El Umbral (Umbral de Arranque Lento) se establece inicialmente como VCmax / 2 (donde VCmax es el valor de VC cuando se detectó congestión por última vez). Cuando VC = Umbral, se deja de incrementar VC exponencialmente, terminando la fase de Arranque Lento y pasando al modo de Evitación de la Congestión.
  • Recepción de Tres ACKs Duplicados: TCP realiza una Retransmisión Rápida y entra en el modo de Recuperación Rápida.
2. Evitación de la Congestión (Congestion Avoidance)

Se pasa a este estado al estar cerca del punto de congestión (VC = Umbral). En esta fase, el crecimiento es lineal (aditivo):

  • VC se incrementa en 1 MSS por cada RTT completo.

Esta fase termina si:

  • Vence la Temporización (Timeout): Se pasa al Arranque Lento (VC = 1 MSS).
  • Se reciben Tres ACKs Duplicados: Se establece Umbral = VC_actual / 2 y se entra en Recuperación Rápida.
3. Recuperación Rápida (Fast Recovery)

Este modo se activa tras recibir tres ACKs duplicados (sin esperar el timeout):

  • VC se incrementa en 1 MSS por cada ACK duplicado recibido correspondiente al segmento perdido.
  • Cuando se recibe el ACK del segmento que faltaba, se establece Umbral = VC_actual / 2 y se vuelve al estado de Evitación de la Congestión.
  • Si se produce un fin de temporización (timeout) durante esta fase, VC se establece en 1 MSS y se cambia al estado de Arranque Lento.

Tasa de Transferencia y Equidad

Si se omiten las fases de Arranque Lento, la velocidad de transferencia (Vtrans) en TCP se comporta en forma de «dientes de sierra», variando entre W/2RTT y W/RTT, donde W es el tamaño de VC cuando se pierde un segmento.

Por ello, la Tasa de Transferencia Media (TTM) es aproximadamente:

TTM = 0.75 * W / RTT

Equidad (Fairness) en AIMD

Si hay k conexiones TCP con rutas diferentes que atraviesan un enlace de cuello de botella, el mecanismo de control de congestión se considera equitativo si cada conexión obtiene la misma partición de ancho de banda del enlace. Idealmente:

Vtrans = Vtrans total / k

Es importante destacar que las conexiones TCP en paralelo y el tráfico UDP no son inherentemente equitativos bajo este esquema.