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)
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
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)