我已经开始在 Java 编程中使用套接字(我有使用 Python 的经验),在测试我使用该telnet
命令编写的服务器时,我注意到该实用程序会立即响应被终止的服务器。当我用 Java(或 Python)编写客户端时,程序至少需要几秒钟才能指示它已断开连接。据我所知,没有办法测试套接字是否已连接,除非发送心跳消息,而我的服务器并未编写心跳消息来接受或接收心跳消息。
我的问题是,GNU 的人们如何知道我的套接字何时断开连接?我在搜索中没有找到 TCP 的某个部分可以实现这一点吗?谢谢。
答案1
有两种方法可以关闭 TCP 会话,对于已建立的会话,正确的方法是三向拆除,其中包括:
Closing party -> Other end: FIN
Other end -> Closing party: FIN ACK
Closing party -> Other end: ACK
所以这个序列让两端都知道另一端知道会话已经关闭。
另一种方法是 RST 或重置数据包,通常在出现问题时发送。当接收方未监听所连接的 TCP 端口时,它会立即发送,也可以在应用程序出现错误时发送。
在您的情况下,FIN ACK 序列将是终止连接的方式,并且这应该由您在关闭套接字时使用的任何库来启动。
如果我是你,我会使用 wireshark 或类似设置来准确查看拆除过程中发生的情况。