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

Guia do Lag em Jogos › L8 Sockets e protocolos

Keepalive com valor padrão de 2 horas TCP keepalive defaults

ID da causa sk-keepalive · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do cliente (Equipe de desenvolvimento), Infraestrutura de servidores (Equipe de infraestrutura)

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

Quando o outro lado some sem sinal de encerramento, o TCP só percebe muito depois. O keepalive (recurso do TCP que verifica se uma conexão ociosa continua viva) vem desligado por padrão e, mesmo ligado, só começa a verificar depois de 2 horas de inatividade.

Por quê O cliente some sem sinal de encerramento porque o aparelho desligou ou a conexão caiu → Efeito O servidor considera a conexão viva (keepalive com padrão de 7.200 s; se havia dados sendo enviados, cerca de 15 minutos até desistir das retransmissões) → Na tela Fica um personagem fantasma e, ao reconectar, aparece o erro “já conectado”

Sintomas
Não conecta / loading infinito, Invisível / entidade fantasma
Fatores
Perda de pacotes
Quem é afetado
Só eu
Quando
Depois de ficar parado, Logo após login ou manutenção
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do cliente (Equipe de desenvolvimento), Infraestrutura de servidores (Equipe de infraestrutura)
O que fazer (Equipe de desenvolvimento)
Servidor: responder aos heartbeats e, se não receber nenhum por um certo tempo, encerrar a conexão por conta própria (ajustar TCP_KEEPIDLE e TCP_USER_TIMEOUT), na reconexão substituir a sessão antiga usando o token de sessão e retomá-la. Cliente: enviar heartbeats no nível do jogo a cada intervalo de alguns segundos a algumas dezenas de segundos (no máximo metade do menor timeout de inatividade), reconectar automaticamente quando cair.
O que fazer (Equipe de infraestrutura)
Baixar os padrões do kernel (tcp_keepalive_time etc.) para os sockets em que o código não define valores próprios (vale só para sockets com SO_KEEPALIVE ligado).
Números de referência
No Linux, o padrão é começar a verificar após 7.200 s de inatividade, enviar 9 probes a cada 75 s e derrubar a conexão se não houver resposta até o fim. Somando, são cerca de 2 horas e 11 minutos. O Windows também só começa a verificar, por padrão, após 2 horas de inatividade.
No gráfico
Alto só em alguns · Tempo desde o último recebimento, por conexão
Onde olhar
Ver com ss -tnoi o lastrcv (ms desde o último recebimento) e o timer de keepalive (timer:(keepalive,…)) de cada conexão e cruzar com os registros de recusa “já conectado” do servidor do jogo
Confirma se
Há conexões ESTABLISHED com lastrcv de alguns minutos a algumas horas, e a reconexão daquela conta é recusada com “já conectado”
Descarta se
Nenhuma conexão silenciosa há muito tempo, mas aparece “já conectado”: aponta para o código de limpeza de sessões do servidor do jogo
Como verificar
Ferramentas de infra (sem precisar do código do jogo)

Fontes

  1. tcp(7) — Linux manual page Linux man-pages
    Após 7.200 s de inatividade, 9 probes a cada 75 s (cerca de 11 minutos a mais); vale só para sockets com SO_KEEPALIVE ligado; TCP_KEEPIDLE e TCP_USER_TIMEOUT
  2. RFC 9293: Transmission Control Protocol (TCP) IETF
    O keepalive deve vir desligado por padrão, e o intervalo de inatividade padrão deve ser de pelo menos 2 horas
  3. SO_KEEPALIVE socket option Microsoft
    Timeout padrão do keepalive TCP no Windows de 2 horas
  4. ss(8) — Linux manual page iproute2
    lastrcv do -i (ms desde o último recebimento), timer:(keepalive,…) do -o

Veja também

Mesma camada: L8 Sockets e protocolos

Mesmo sintoma (Não conecta / loading infinito) em outras camadas

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