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

Libro blanco del lag en juegos › L8 Sockets y protocolos

Bloqueo HOL en TCP Head-of-line blocking

ID de la causa sk-hol · 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 →

Para mantener el orden, TCP no entrega al juego los paquetes que llegaron después de uno perdido hasta que vuelve a recibir ese paquete.

Por qué Se pierde un paquete → Efecto Los paquetes siguientes ya llegaron, pero esperan en el búfer de recepción → En pantalla Congelamiento y después todo se libera de golpe: cámara rápida

Síntomas
Congelamiento, Cámara rápida
Factores
Pérdida de paquetes, Detención
A quién afecta
Solo yo
Cuándo
De vez en cuando, al azar
Responsable
Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Desarrollo de cliente (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Servidor: usar UDP para las posiciones en tiempo real, enviar de forma confiable solo lo imprescindible, repartir el tráfico en varios flujos (streams). Cliente: cambiar el código de red para usar el mismo modelo que el servidor (UDP, canales separados).
Cifras de referencia
Perder un paquete detiene todo como mínimo un tiempo de ida y vuelta más algo de margen; si también se pierde la retransmisión, de cientos de ms a varios segundos.
En el gráfico
Hueco y luego ráfaga · Datos recibidos por conexión, retransmisiones
Dónde mirar
Captura de paquetes en el servidor (tcpdump, Wireshark) para ver, en la conexión de ese jugador, los paquetes retransmitidos y los huecos antes y después; para todo el servidor, incremento de TcpRetransSegs en nstat -az
Se confirma si
El tramo detenido empieza con la retransmisión de un paquete y, justo después de que llega, los datos acumulados se procesan de golpe (lo recibido se queda en 0 y luego llega todo junto)
Se descarta si
No aplica si el juego se comunica por UDP. Si se detiene sin retransmisiones, revisar el tick del servidor (“Tick que excede su presupuesto”)
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)

Fuentes

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    TCP es un servicio de flujo de bytes confiable y en orden
  2. RFC 5681: TCP Congestion Control IETF
    Detecta la pérdida con 3 ACK duplicados y hace una retransmisión rápida; si no, espera al temporizador de retransmisión
  3. RFC 6298: Computing TCP's Retransmission Timer IETF
    Backoff que duplica el temporizador de retransmisión cada vez que expira
  4. net/ipv4/proc.c (Linux v6.12) Linux kernel
    Nombres de contador que muestra nstat: RetransSegs (segmentos retransmitidos) del grupo Tcp

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