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
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)
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
IP SysctlLinux 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
ss(8) — Linux manual pageiproute2 rto (temporizador de retransmisión, en ms) y backoff (número de backoffs exponenciales) de -i
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)