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)
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”
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
tcp(7) — Linux manual pageLinux 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