众所周知,当连接的一侧崩溃时,无法检测到连接丢失。您必须在TCP级别或应用程序协议级别上设置两端的keepalive。
参考文献:
但是如果对等体在同一个Linux机器上并且其中一个是segfaults,那么另一个会不会通过在下一次读取调用时收到错误来检测这种情况?
所有描述符都已关闭,对吧?不能正确关闭连接吗? (如果在网络中出现问题,那就是内核错误,而且每个人都注定失败了)
我试图获得FIFO的这个不错的功能:当你关闭一端时,另一端会收到错误/信号。
答案 0 :(得分:2)
如果进程崩溃,则OS始终关闭其描述符并发送用于TCP连接的FIN。如果与远程对等方建立通信,那么当FIN未发送或未发送时,存在很多情况,如操作系统崩溃或网络,因此必须使用保持活动机制。
在同一台机器上的对等体之间连接的情况下,如何在不通知另一对等体的情况下杀死一个通信对等体的可能性较小,但这种可能性仍然存在。例如,防火墙可能会丢弃FIN数据包:
$ telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
另一个终端:
# iptables -A INPUT -p tcp --sport 23 -j DROP
# iptables -A INPUT -p tcp --sport 23 -j DROP
# kill -9 7737 # telnet client process
Voila - telnet服务器不知道客户端已经终止。
这是非常模糊的情况,你可能会说它永远不会发生在你的环境中。但实施保持活检只是为了解决一个模糊不清的状态。