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

Guia do Lag em Jogos › Causas-raiz da retransmissão TCP

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)

Abrir o card interativo, com figuras e simulações →

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

Sintomas
Travamento, Avanço rápido
Fatores
Paralisação
Quem é afetado
Só eu, Servidor inteiro
Quando
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)
Casos reais
Roblox 2021: Queda de 73 horas no Roblox: contenção no cluster de service discovery (Consul)

Fontes

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    Com a janela de recepção em 0, quem envia manda zero window probes e aumenta exponencialmente o intervalo entre eles
  2. 7.5. TCP Analysis Wireshark
    TCP ZeroWindow: pacote em que quem recebe anuncia janela 0 e faz quem envia parar de transmitir
  3. Display Filter Reference: Transmission Control Protocol Wireshark
    Filtros de exibição tcp.analysis.zero_window e tcp.analysis.zero_window_probe
  4. SNMP counter Linux kernel
    TcpExtTCPToZeroWindowAdv: vezes em que a janela de recepção anunciada passou de um valor diferente de 0 para 0
  5. net/ipv4/proc.c Linux kernel
    Nomes dos contadores no nstat: TCPToZeroWindowAdv, TCPWinProbe
  6. net/ipv4/tcp_output.c Linux kernel
    TCPWinProbe: aumenta a cada probe (tcp_send_probe0) enviado quando a janela de recepção do outro lado está em 0
  7. net/ipv4/tcp_diag.c Linux kernel
    Em uma conexão, o Recv-Q do ss é o número de bytes recebidos que o programa ainda não leu

Veja também

Mesma camada: Causas-raiz da retransmissão TCP

Mesmo sintoma (Travamento) em outras camadas

Ver o card interativo, com figuras e simulações