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