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

Guia do Lag em Jogos › L8 Sockets e protocolos

Perda dos últimos dados no encerramento forçado por RST SO_LINGER, abrupt RST

ID da causa sk-linger · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)

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

Quando o servidor fecha a conexão às pressas, o último aviso enviado ou o sinal de salvamento concluído se perde.

Por quê O servidor fecha a conexão com encerramento forçado (RST). Acontece com SO_LINGER em 0 s ou ao fechar sem ler todos os dados recebidos → Efeito O motivo do kick e os últimos dados que ainda estavam sendo enviados são descartados → Na tela “Conexão encerrada por erro desconhecido” sem motivo aparente

Sintomas
Desconexão
Fatores
Perda de pacotes
Quem é afetado
Só eu
Quando
Aleatoriamente, de vez em quando
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Depois de enviar o motivo, fechar primeiro só a direção de envio (shutdown), ler até o fim os dados recebidos até o outro lado fechar e só então fechar, evitar SO_LINGER com 0 s.
No gráfico
Picos aleatórios · Conexões encerradas com RST
Onde olhar
Ver o aumento de TcpExtTCPAbortOnData (fechou com RST com dados ainda por enviar, SO_LINGER em 0 s) e TcpExtTCPAbortOnClose (fechou com dados não lidos) no nstat -az, e ver numa captura de pacotes do lado do servidor, no momento da queda, se o servidor fecha com RST ou com FIN
Confirma se
No horário dos reports de “Conexão encerrada por erro desconhecido”, o servidor envia RST, e AbortOnData e AbortOnClose sobem
Descarta se
O servidor encerrou normalmente com FIN, mas o motivo não aparece: aponta para o tratamento do encerramento no cliente
Como verificar
Ferramentas de infra (sem precisar do código do jogo)

Fontes

  1. closesocket function (winsock.h) Microsoft
    Com SO_LINGER ligado e tempo 0, o fechamento vira um encerramento forçado que reseta a conexão na hora, e os dados não enviados se perdem
  2. RFC 9293: Transmission Control Protocol (TCP) IETF
    Fechar com dados recebidos ainda não lidos envia RST para avisar da perda de dados
  3. Graceful Shutdown, Linger Options, and Socket Closure Microsoft
    Sequência: fechar primeiro só o envio com shutdown e fechar o socket depois de receber o aviso de encerramento do outro lado
  4. SNMP counter Linux kernel
    TcpExtTCPAbortOnData: fechou com RST com dados ainda por enviar, por exemplo com SO_LINGER em 0 s; TcpExtTCPAbortOnClose: fechou com dados não lidos e enviou RST

Veja também

Mesma camada: L8 Sockets e protocolos

Mesmo sintoma (Desconexão) em outras camadas

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