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.