Janela zero (paralisação que parece retransmissão) Zero window, often mistaken for retransmission
ID da causa rt-zero-window · Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento), Infraestrutura de servidores (Equipe de infraestrutura)
Quando o programa que recebe não lê o socket a tempo e o buffer enche, quem envia para de transmitir e manda só zero window probes. A causa não está na rede.
Por quê O cliente parado em um frame ou uma thread do servidor bloqueada deixa de ler o socket → Efeito A janela de recepção chega a 0, e quem envia para de transmitir e manda só probes (em intervalos cada vez maiores) → Na tela Travamento e depois avanço rápido. A captura de pacotes mostra “ZeroWindow” e não há perda
Quando junta muita gente, Aleatoriamente, de vez em quando
Responsável
Responsável principal Desenvolvimento do cliente (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento), Infraestrutura de servidores (Equipe de infraestrutura)
O que fazer (Equipe de desenvolvimento)
Verificar primeiro o lado que enviou o ZeroWindow na captura de pacotes (o lado que não consegue ler o socket), ler a rede sem parar em uma thread separada, dar ao buffer de recepção um tamanho adequado. Cliente: resolver as causas de frames parados, como carregamento e GC. Servidor: resolver o que bloqueia a thread que lê o socket.
O que fazer (Equipe de infraestrutura)
Incluir no monitoramento o TcpExtTCPToZeroWindowAdv do nstat do servidor (vezes em que o servidor anunciou janela de recepção 0; se aumentar, o problema está no servidor e vai para o desenvolvimento do servidor), fornecer capturas de pacotes do lado do servidor.
No gráfico
Lacuna e depois tudo junto · Volume recebido por conexão, ocorrências de janela zero
Onde olhar
Na captura de pacotes, achar o lado que anunciou janela 0 com o filtro do Wireshark tcp.analysis.zero_window. No nstat do servidor, separar TcpExtTCPToZeroWindowAdv (o servidor anunciou janela 0) de TcpExtTCPWinProbe (probes enviados para a janela 0 do outro lado) e ver o Recv-Q dos sockets do servidor (bytes que o programa ainda não leu, no ss)
Confirma se
Durante a parada não há retransmissões, só janela zero e probes. Se o TcpExtTCPToZeroWindowAdv do servidor ou o Recv-Q dos sockets do servidor aumentam, é o servidor que não lê a tempo; se o TcpExtTCPWinProbe aumenta, é o cliente que não lê a tempo
Descarta se
Sem janela zero na captura e com os mesmos dados sendo reenviados: a causa é perda ou retransmissão espúria
Como verificar
Ferramentas de infra (sem precisar do código do jogo)