한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Libro blanco del lag en juegos › Causas raíz de la retransmisión TCP

Eliminación de opciones TCP en dispositivos intermedios Middlebox strips TCP options

ID de la causa rt-sack-stripped · Responsable principal Infraestructura de red (Equipo de infraestructura) · También Infraestructura de servidores (Equipo de infraestructura)

Abrir la ficha interactiva con gráficos y simulaciones →

Si algunos firewalls o aceleradores eliminan o modifican las opciones TCP, cuando se pierden varios paquetes solo se recupera uno por cada ida y vuelta, o la ventana (lo que se puede enviar de una vez) se reduce, y todo va más lento.

Por qué La “normalización TCP” de un firewall o un acelerador antiguo elimina las opciones de SACK, marcas de tiempo (timestamps) y escalado de ventana → Efecto Si se pierden varios paquetes, se recupera uno por cada ida y vuelta, y la ventana queda limitada a 64 KB → En pantalla Cada pérdida provoca un congelamiento mucho más largo (sin SACK tampoco se puede usar RACK-TLP), seguido de cámara rápida al liberarse. Las transferencias grandes, como los parches, también van lentas

Síntomas
Congelamiento, Cámara rápida
Factores
Detención, Latencia
A quién afecta
Una región o un ISP, Todo el servidor
Cuándo
Siempre
Responsable
Responsable principal Infraestructura de red (Equipo de infraestructura) · También Infraestructura de servidores (Equipo de infraestructura)
Tareas (Equipo de infraestructura)
Red: desactivar la normalización TCP en ese dispositivo, revisar también la aleatorización de números de secuencia del firewall, comparar las opciones del SYN con capturas de paquetes en los dos extremos. Servidores/SO: comprobar en ss -ti si las conexiones sin sack ni wscale se concentran en una ruta concreta (en Windows, ts puede estar desactivado según la configuración, así que si solo falta ts puede ser normal), comprobar que net.ipv4.tcp_sack del servidor vale 1.
En el gráfico
Siempre alto · Recuperaciones iniciadas sin SACK (TcpExtTCPRenoRecovery)
Dónde mirar
Si cada conexión muestra sack y wscale en ss -ti, la proporción entre TcpExtTCPRenoRecovery (recuperaciones iniciadas sin SACK) y TcpExtTCPSackRecovery en nstat, y TcpExtTCPSACKDiscard (bloques SACK descartados por incoherentes). En las rutas sospechosas, capturar el SYN en los dos extremos y comparar las opciones (tcp.options.sack_perm de Wireshark, etc.)
Se confirma si
Solo las conexiones que pasan por una ruta o un dispositivo concreto carecen de sack y wscale, y TcpExtTCPRenoRecovery pesa mucho. La opción de SACK permitido que llevaba el SYN del emisor no aparece en el SYN que recibe el otro extremo. Si la causa es la aleatorización de números de secuencia, las opciones siguen ahí, pero sube TcpExtTCPSACKDiscard
Se descarta si
Si sack falta en todas las conexiones, revisar primero el valor de net.ipv4.tcp_sack del servidor. Si las opciones están intactas y TcpExtTCPSACKDiscard no cambia, la lentitud de la recuperación viene de otro lado (“Recuperación lenta en thin streams”)
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Para saber más
SACK puede romperse aunque las opciones sigan presentes. Si la aleatorización de números de secuencia (sequence randomization) del firewall cambia solo el número de secuencia de la cabecera y deja intactos los números dentro del SACK, el emisor descarta esos SACK incoherentes. El resultado es el mismo si en el servidor se puso tcp_sack=0 durante el problema de seguridad de SACK de 2019 y luego se olvidó volver a activarlo.

Fuentes

  1. RFC 2018: TCP Selective Acknowledgment Options IETF
    Sin SACK, con solo ACK acumulativos, se puede conocer un único paquete perdido por cada ida y vuelta
  2. RFC 7323: TCP Extensions for High Performance IETF
    Sin la opción de escalado de ventana, la ventana es como máximo 2^16 = 64 KiB
  3. RFC 8985: The RACK-TLP Loss Detection Algorithm for TCP IETF
    RACK-TLP requiere usar SACK
  4. net/ipv4/tcp_output.c Linux kernel
    En Linux, TLP solo se programa en las conexiones que usan SACK
  5. IP Sysctl Linux kernel
    tcp_sack: 1 por defecto (activado)
  6. misc/ss.c iproute2
    ss -ti muestra ts, sack y wscale:envío,recepción según las opciones que use la conexión
  7. tcp: limit payload size of sacked skbs Linux kernel
    Commit que corrige la vulnerabilidad de procesamiento de SACK de 2019 (CVE-2019-11477)
  8. Linux and FreeBSD Kernel: Multiple TCP-based remote denial of service vulnerabilities (NFLX-2019-001) Netflix
    Como medida temporal, en su momento se recomendó tcp_sack=0 (desactivar el procesamiento de SACK)
  9. SNMP counter Linux kernel
    TcpExtTCPRenoRecovery (recuperación iniciada sin SACK) y TcpExtTCPSackRecovery (recuperación iniciada con SACK), TcpExtTCPSACKDiscard (bloques SACK no válidos)
  10. Display Filter Reference: Transmission Control Protocol Wireshark
    Filtro de visualización tcp.options.sack_perm (opción de SACK permitido en el SYN)

Ver también

Misma capa: Causas raíz de la retransmisión TCP

Causas de otras capas con el mismo síntoma (Congelamiento)

Ver la ficha interactiva con gráficos y simulaciones