在本地主机套接字上是否需要任何类型的保持连接

Is any kind of keepalive necessary on localhost socket?

本文关键字:类型 任何 连接 主机 套接字 是否      更新时间:2023-10-16

众所周知,当连接的一端崩溃时,无法检测到连接丢失。您必须在TCP级别或应用程序协议级别的两端设置保持连接。

引用:

  • 如何检测TCP套接字断开连接(使用C伯克利套接字)
  • 检测 TCP 客户端断开连接

但是,如果对等方在同一台 Linux 机器上,并且其中一个出现段错误,那么另一个对等方是否会通过在下一次读取调用时收到错误来检测这种情况?

所有描述符都已关闭,对吧?这不应该正确关闭连接吗?(如果网络出现故障,那是内核故障,反正每个人都注定要失败)

我正在尝试获得FIFO的这个不错的功能:当您关闭一端时,另一端会收到错误/信号。

如果进程崩溃,操作系统总是关闭其描述符并发送 FIN 以进行 TCP 连接。如果与远程对等体建立通信,则在未发送或未交付 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

瞧 - telnet 服务器不知道客户端已终止。

好吧,这是非常模糊的条件,您可能会说它永远不会在您的环境中发生。但是,实施保持活动状态检查只是为了解决一个晦涩而奇怪的状态。