Se um host se desconecta do outro e você ainda vê sua conexão como ESTABLISHED
, provavelmente está relacionado ao fato de ele não estar honrando o protocolo TCP
e não fechar a conexão corretamente.
A saída netstat
é um intérprete do estado atual de TCP
connections. Se um cliente quiser desconectar / fechar o soquete anteriormente aberto e estabelecido, ele deverá notificar isso ao sistema remoto. Isso é feito enviando o FIN request
para o outro nó (mais informações aqui ), neste caso, o servidor.
Se não o fizerem, o cliente realmente se desconecta, mas o servidor remoto mantém pensando que o cliente ainda está conectado e mantendo seu estado como ESTABLISHED
, e é aí que o tcp_keepalive_time
parâmetro une a equação. Como nenhum pacote adicional será recebido, o kernel irá esperar o tempo especificado para este parâmetro para tempo limite da conexão e forçosamente fechá-lo.
Você pode depurar esse problema usando a ferramenta tcpdump
. Você poderia simplesmente ouvir a conexão do host do cliente no lado do servidor e verificar se ele não envia a solicitação FIN
.
tcpdump host X.X.X.X and port Y