11. Errores y recuperación en la capa de transporte

Ninguna red es perfecta: los routers descartan paquetes, los enlaces inalámbricos introducen ruido y los extremos pueden saturarse. TCP incorpora algoritmos para detectar estas condiciones y recuperarse sin que la aplicación perciba fallos graves, mientras que UDP delega toda la responsabilidad al software superior.

En este tema se detalla cómo se reenvían paquetes perdidos, cómo se evitan duplicados, qué temporizadores intervienen y qué diferencias existen entre la gestión de errores de TCP y UDP.

11.1 Panorama de los errores

Los incidentes más frecuentes son:

  • Pérdida de segmentos: desaparecen en la red o se descartan por congestión.
  • Corrupción de datos: alteraciones detectadas por el checksum.
  • Duplicados: retransmisiones que llegan tarde cuando el original ya fue aceptado.
  • Retrasos excesivos: provocan expiración de temporizadores y generan timeouts.

TCP enfrenta cada caso con mecanismos específicos; UDP simplemente entrega el datagrama tal como llega o lo descarta si falla la verificación.

11.2 Reenvío de paquetes perdidos

TCP deduce una pérdida mediante dos eventos:

  1. Timeout de retransmisión (RTO): si no llega el ACK antes de que expire el temporizador, el segmento se vuelve a enviar y el RTO se expande exponencialmente para evitar congestionarse.
  2. ACK duplicados: tres ACK con el mismo valor indican que el receptor recibió segmentos posteriores pero falta uno intermedio, por lo que se ejecuta fast retransmit.

Estas estrategias limitan el tiempo de recuperación. Una pérdida aislada suele corregirse en milisegundos mediante fast retransmit; en cambio, una cadena de timeouts prolonga la interrupción.

11.3 Control de duplicados y checksum

El checksum TCP cubre la cabecera y los datos, además de una pseudo-cabecera con IP de origen y destino. Si el valor no coincide, el segmento se descarta sin notificar.

Los números de secuencia permiten filtrar duplicados: si llega un segmento cuyo rango ya fue recibido, el receptor lo descarta pero vuelve a enviar un ACK acumulativo para mantener la sesión sincronizada.

UDP también incorpora checksum (obligatorio en IPv6), pero no existe un mecanismo estándar para pedir retransmisión; la aplicación debe decidir si reintenta o ignora la pérdida.

11.4 Manejo de tiempos de espera

TCP gestiona varios temporizadores:

  • RTO: controla las retransmisiones de datos regulares.
  • Persistencia: evita bloqueos cuando el receptor anuncia ventana cero.
  • Keepalive: detecta pares inactivos en sesiones largas.
  • Time-Wait: protege contra segmentos rezagados tras el cierre.

Ajustar estos temporizadores es crítico: valores demasiado cortos generan retransmisiones injustificadas; demasiado largos retrasan la recuperación.

11.5 TCP vs. UDP ante errores

Aspecto TCP UDP
Retransmisiones Automáticas con temporizadores y ACK duplicados. No existen; la aplicación debe decidir si reintenta.
Detección de duplicados Secuencias y ACK acumulativos. No se detecta; los duplicados llegan a la aplicación.
Checksum Obligatorio, descarta segmentos corruptos. Opcional en IPv4, obligatorio en IPv6.
Control de tiempo RTO, persistencia, keepalive, time-wait. Ninguno estándar.

11.6 Diagnóstico con herramientas

Las capturas en Wireshark muestran retransmissions (coloreadas en rojo) y ACK duplicados (amarillo). Además, Windows permite inspeccionar sucesos desde la consola:

PowerShell

Get-Counter "\TCPv4\Segments Retransmitted/sec" -SampleInterval 1 -MaxSamples 5

Get-NetTCPConnection -State Established |
  Select-Object -First 5 -Property LocalPort, RemoteAddress, RetransmissionTimeout

El contador de rendimiento revela si las retransmisiones aumentan durante una ventana de tiempo. Get-NetTCPConnection expone el RTO actual negociado por cada socket, lo que ayuda a detectar configuraciones anómalas.

11.7 Simulación de retransmisión en Python

El siguiente script emula un emisor que incrementa el RTO cada vez que falla una entrega y vuelve a la normalidad cuando recibe ACK:

Manejo básico de RTO

def retransmitir(intentos, rto_inicial=0.2, factor=2):
    rto = rto_inicial
    for intento in range(1, intentos + 1):
        print(f"Intento {intento}: envío segmento (RTO={rto:.2f}s)")
        exito = intento == intentos
        if exito:
            print("ACK recibido, RTO vuelve al valor inicial")
            rto = rto_inicial
        else:
            rto *= factor
            print("Sin ACK, duplico RTO para evitar congestión")
    return rto

retransmitir(4)

Aunque simplificado, demuestra el comportamiento exponencial del RTO y el hecho de que se restablece al completar una retransmisión exitosa.

11.8 Buenas prácticas

  • Monitorear tasas de retransmisión para anticipar congestión o enlaces defectuosos.
  • Evitar middleboxes que alteren ACK, pues pueden engañar al emisor sobre el estado real de la conexión.
  • Implementar lógicas de reintento en protocolos sobre UDP si la entrega es esencial.

11.9 Cierre

La forma en que la capa de transporte maneja errores determina la experiencia del usuario final. TCP ofrece una red virtual confiable gracias a sus mecanismos de detección y recuperación; UDP, en cambio, proporciona velocidad a costa de simplicidad. Conocer estas diferencias permite diseñar aplicaciones resilientes y diagnosticar problemas sin adivinar.