Como o utilitário de telnet Inetutils determina se uma conexão ainda está ativa?

2

Comecei a usar soquetes na programação com Java (tenho experiência com Python) e, durante o teste de um servidor que escrevi com o comando telnet , notei que o utilitário responde imediatamente ao servidor que está sendo morto . Quando eu escrevo um cliente com Java (ou Python), são necessários pelo menos alguns segundos para o programa indicar que ele foi desconectado. Tanto quanto eu sei, não há uma maneira de testar se um soquete está conectado, a falta de uma mensagem de heartbeat, que meu servidor não foi escrito para aceitar ou receber.

Minha pergunta é: como as pessoas do GNU sabem quando meu soquete foi desconectado? Existe uma parte do TCP que eu não consegui encontrar na minha pesquisa que permitiria isso? Obrigado.

    
por Michael Smith 06.11.2011 / 02:46

1 resposta

0

Existem duas maneiras de fechar uma sessão TCP, a maneira correta para uma sessão estabelecida é uma de três vias, que envolve:

 Closing party -> Other end: FIN
 Other end -> Closing party: FIN ACK
 Closing party -> Other end: ACK

Portanto, esta sequência permite que ambas as extremidades saibam que a outra extremidade entende que a sessão está fechada.

O outro método é um pacote RST ou redefinido, que normalmente é enviado no caso de um problema. Ele é enviado imediatamente quando a parte receptora não está escutando na porta TCP conectada e também pode ser enviada no caso de um erro no aplicativo.

No seu caso, a sequência FIN ACK seria como a conexão deveria ser terminada, e isso deveria ser instigado por qualquer biblioteca que você esteja usando quando você fechar o socket.

Se eu fosse você, obteria wireshark ou configuração similar e veria exatamente o que acontece durante uma queda.

    
por 06.11.2011 / 02:54