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

Libro blanco del lag en juegos › L8 Sockets y protocolos

RTO de TCP y backoff exponencial RTO and exponential backoff

ID de la causa sk-rto · Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Desarrollo de cliente (Equipo de desarrollo)

Abrir la ficha interactiva con gráficos y simulaciones →

Cada vez que una retransmisión vuelve a fallar, la espera se duplica, así que un corte breve de la conexión se convierte en una detención larga.

Por qué La conexión se corta un momento y las retransmisiones también fallan una tras otra → Efecto La espera hasta el siguiente intento se duplica cada vez: 0.3 → 0.6 → 1.2 → 2.4 s (con un ping de 100 ms) → En pantalla La conexión se cortó 1 segundo, pero el juego se congela más de 2. Si el corte dura más, acaba en desconexión

Síntomas
Congelamiento, Desconexión
Factores
Pérdida de paquetes, Detención
A quién afecta
Solo yo
Cuándo
De vez en cuando, al azar, Al moverse o cambiar de zona
Responsable
Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Desarrollo de cliente (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Servidor: responder a los heartbeats y cerrar la conexión por su cuenta si no los recibe durante cierto tiempo (adelantar el abandono con TCP_USER_TIMEOUT), retomar la sesión con un token de sesión, usar UDP confiable. Cliente: enviar heartbeats a intervalos cortos y, si dejan de llegar respuestas, reconectar enseguida sin esperar a la retransmisión TCP.
Cifras de referencia
En Linux, el RTO (tiempo de espera antes de retransmitir) tiene como mínimo “ping + 200 ms” y, al establecer la conexión, empieza en 1 segundo. Con la configuración predeterminada (tcp_retries2=15), aunque las retransmisiones sigan fallando, la conexión no se abandona hasta pasados unos 15 minutos.
En el gráfico
Hueco y luego ráfaga · RTO y backoff por conexión, expiraciones del RTO
Dónde mirar
rto (espera de retransmisión en ms) y backoff (expiraciones seguidas) de la conexión detenida con ss -ti; para todo el servidor, incremento de TcpExtTCPTimeouts (expiraciones del temporizador de retransmisión) en nstat -az
Se confirma si
La conexión detenida tiene un backoff de 1 o más y un rto que ha crecido al orden de segundos, y TCPTimeouts sube a esa hora
Se descarta si
Si las retransmisiones se resuelven con retransmisión rápida y no hay expiraciones del RTO, la detención es corta. En ese caso: “Bloqueo HOL en TCP”
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)

Fuentes

  1. RFC 6298: Computing TCP's Retransmission Timer IETF
    RTO inicial de 1 segundo; cada vez que el temporizador expira, el RTO se duplica (backoff exponencial)
  2. net/ipv4/tcp_input.c (Linux v6.12) Linux kernel
    En Linux, RTO = RTT suavizado + variación del RTT, y el mínimo de la variación es tcp_rto_min (200 ms), así que el RTO es al menos RTT + 200 ms
  3. IP Sysctl Linux kernel
    tcp_rto_min_us predeterminado: 200 ms; RTO inicial de la solicitud de conexión: 1 segundo; con tcp_retries2=15, al menos 924.6 segundos (unos 15 minutos) hasta abandonar
  4. ss(8) — Linux manual page iproute2
    rto (temporizador de retransmisión, en ms) y backoff (número de backoffs exponenciales) de -i
  5. net/ipv4/proc.c (Linux v6.12) Linux kernel
    Nombres de contador que muestra nstat: TCPTimeouts del grupo TcpExt
  6. net/ipv4/tcp_timer.c (Linux v6.12) Linux kernel
    Cada vez que expira el temporizador de retransmisión, sube TCPTimeouts, backoff aumenta en uno y el RTO se duplica (hasta el máximo)

Ver también

Misma capa: L8 Sockets y protocolos

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

Ver la ficha interactiva con gráficos y simulaciones