Uma questão ampla. Talvez alguém possa analisar sua questão sobre a pilha TCP do kernel entre versões específicas do kernel.
Algumas respostas gerais:
Do lado do cliente
-
No caso de um sinal
SIGKILL
, o kernel encerra a execução do programa e, entre outras coisas, fecha os descritores de arquivos abertos do processo. Os soquetes TCP são tratados de forma um pouco diferente pelo kernel do que os arquivos regulares, pois precisam ser liberados e passar pelo processo de shudown do TCP.A diferença em um 'FIN, ACK' imediato do cliente e um desligamento de soquete mais longo pode depender do estado em que a conexão TCP do cliente estava quando o aplicativo cliente foi finalizado. Mas geralmente o kernel fechará os sockets abertos da aplicação.
Do lado do servidor
-
Um servidor nem sempre sabe quando um cliente se desconecta. A maneira mais confiável de determinar se um cliente foi desligado é tentar uma leitura do soquete que retorna um EOF.
O TCP foi projetado para ser resiliente à latência de conexão e a falhas intermitentes. Isso também se traduz em alguns desafios que detectam desconexões de maneira confiável, caso o handshaking de desconexão de
FIN, ACK
4 não ocorra.
Resumo
O que você pode estar vendo em um kill -9
do cliente é o servidor que entra no CLOSE_WAIT
do estado do TCP, onde está aguardando um tempo limite do TCP. Isso pode demorar um pouco. Mesmo que o cliente tenha sumido, se o kernel não mantivesse o handshaking de desconexão TCP, o servidor teria que expirar.
Se eu lembrar, isso pode levar vários segundos e é provável que você ainda veja ESTABLISHED
devido à execução do cliente e do servidor no mesmo host.