한국어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

Ventana cero (una detención que parece retransmisión) Zero window, often mistaken for retransmission

ID de la causa rt-zero-window · Responsable principal Desarrollo de cliente (Equipo de desarrollo) · También Desarrollo de servidor (Equipo de desarrollo), Infraestructura de servidores (Equipo de infraestructura)

Abrir la ficha interactiva con gráficos y simulaciones →

Cuando el programa receptor no lee el socket a tiempo y el búfer se llena, el emisor deja de enviar y solo manda sondas de ventana cero. El problema no está en la red.

Por qué El cliente deja de procesar frames o un hilo del servidor se bloquea, y nadie lee el socket → Efecto La ventana de recepción llega a 0, y el emisor deja de enviar y solo manda sondas (a intervalos cada vez más largos) → En pantalla Congelamiento seguido de cámara rápida. En la captura de paquetes aparece “ZeroWindow” y no hay pérdida

Síntomas
Congelamiento, Cámara rápida
Factores
Detención
A quién afecta
Solo yo, Todo el servidor
Cuándo
Cuando se junta mucha gente, De vez en cuando, al azar
Responsable
Responsable principal Desarrollo de cliente (Equipo de desarrollo) · También Desarrollo de servidor (Equipo de desarrollo), Infraestructura de servidores (Equipo de infraestructura)
Tareas (Equipo de desarrollo)
Empezar por el lado que envió el ZeroWindow en la captura de paquetes (el que no lee el socket), leer la red sin parar en un hilo aparte, dar un tamaño adecuado al búfer de recepción. Cliente: resolver las causas de las paradas de frames, como la carga o el GC. Servidor: resolver lo que bloquea al hilo que lee el socket.
Tareas (Equipo de infraestructura)
Añadir al monitoreo TcpExtTCPToZeroWindowAdv del nstat del servidor (veces que el servidor anunció una ventana de recepción 0; si sube, el problema está en el servidor y hay que pasarlo a desarrollo de servidor), facilitar capturas de paquetes del lado del servidor.
En el gráfico
Hueco y luego ráfaga · Datos recibidos por conexión, ventanas cero
Dónde mirar
En la captura de paquetes, buscar con el filtro de Wireshark tcp.analysis.zero_window qué lado anunció la ventana 0. En el nstat del servidor, ver por separado TcpExtTCPToZeroWindowAdv (el servidor anunció ventana 0) y TcpExtTCPWinProbe (sondas enviadas ante la ventana 0 del otro extremo), y el Recv-Q de los sockets del servidor (bytes que el programa aún no ha leído, en ss)
Se confirma si
Durante la pausa no hay retransmisiones; solo circulan ventanas cero y sondas. Si suben TcpExtTCPToZeroWindowAdv o el Recv-Q de los sockets del servidor, es el servidor el que no lee a tiempo; si sube TcpExtTCPWinProbe, es el cliente
Se descarta si
Si en la captura no hay ventanas cero y se reenvían los mismos datos, apunta a pérdida o a retransmisiones espurias
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Casos reales
Roblox 2021: Caída de 73 horas en Roblox: contención en el clúster de descubrimiento de servicios (Consul)

Fuentes

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    Con la ventana de recepción en 0, el emisor envía sondas de ventana cero y alarga el intervalo entre sondas de forma exponencial
  2. 7.5. TCP Analysis Wireshark
    TCP ZeroWindow: paquete con el que el receptor anuncia ventana 0 y hace que el emisor deje de enviar
  3. Display Filter Reference: Transmission Control Protocol Wireshark
    Filtros de visualización tcp.analysis.zero_window y tcp.analysis.zero_window_probe
  4. SNMP counter Linux kernel
    TcpExtTCPToZeroWindowAdv: veces que la ventana de recepción anunciada pasó de un valor distinto de 0 a 0
  5. net/ipv4/proc.c Linux kernel
    Nombres de contador que muestra nstat: TCPToZeroWindowAdv y TCPWinProbe
  6. net/ipv4/tcp_output.c Linux kernel
    TCPWinProbe: sube con cada sonda (tcp_send_probe0) enviada cuando la ventana de recepción del otro extremo es 0
  7. net/ipv4/tcp_diag.c Linux kernel
    En una conexión, el Recv-Q de ss es el número de bytes recibidos que el programa aún no ha leído

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