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

Guia do Lag em Jogos › L8 Sockets e protocolos

HOL blocking no TCP Head-of-line blocking

ID da causa sk-hol · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do cliente (Equipe de desenvolvimento)

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

Para manter a ordem, o TCP não entrega ao jogo os pacotes que chegaram depois enquanto não receber de novo o pacote perdido.

Por quê Um pacote se perde → Efeito Os pacotes seguintes chegam, mas ficam esperando no buffer de recepção → Na tela Para e depois libera tudo de uma vez: avanço rápido

Sintomas
Travamento, Avanço rápido
Fatores
Perda de pacotes, Paralisação
Quem é afetado
Só eu
Quando
Aleatoriamente, de vez em quando
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do cliente (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Servidor: usar UDP para posições em tempo real, entrega confiável só para o que for indispensável, dividir em vários streams. Cliente: mudar o tratamento de rede para o mesmo modelo do servidor (UDP, canais separados).
Números de referência
Perder um pacote causa uma parada de pelo menos um tempo de ida e volta, e mais um pouco. Se a retransmissão também se perder, a parada vai de centenas de ms a alguns segundos.
No gráfico
Lacuna e depois tudo junto · Volume recebido por conexão, retransmissões
Onde olhar
Ver, numa captura de pacotes do lado do servidor (tcpdump ou Wireshark), os pacotes retransmitidos na conexão daquele jogador e as lacunas antes e depois deles; para o servidor inteiro, ver o aumento de TcpRetransSegs no nstat -az
Confirma se
A parada começa com a retransmissão de um único pacote, e os dados acumulados são processados todos de uma vez logo depois que o pacote retransmitido chega (o volume recebido fica em 0 e depois vem tudo junto)
Descarta se
Jogo que se comunica por UDP: não se aplica. Parada sem retransmissão: verificar o tick do servidor (“Estouro do tick”)
Como verificar
Ferramentas de infra (sem precisar do código do jogo)

Fontes

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    O TCP é um serviço de fluxo de bytes confiável e em ordem
  2. RFC 5681: TCP Congestion Control IETF
    Detecta a perda com 3 ACKs duplicados e faz fast retransmit; se não, espera o timer de retransmissão
  3. RFC 6298: Computing TCP's Retransmission Timer IETF
    Backoff que dobra o timer de retransmissão cada vez que ele expira
  4. net/ipv4/proc.c (Linux v6.12) Linux kernel
    Nomes dos contadores mostrados pelo nstat: RetransSegs (segmentos retransmitidos) do grupo Tcp

Veja também

Mesma camada: L8 Sockets e protocolos

Mesmo sintoma (Travamento) em outras camadas

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