【问题标题】:Is any kind of keepalive necessary on localhost socket?本地主机套接字上是否需要任何类型的保活?
【发布时间】:2015-09-05 18:20:06
【问题描述】:

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

参考资料:

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

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

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

【问题讨论】:

  • 我有点怀疑行为是否会发生任何变化,无论对等方在哪个盒子上运行。
  • 这是 TCP 连接还是 UNIX 套接字连接?
  • 不是已知的事实。 send() 最终会检测到它。 两个你引用的来源都这么说。
  • @tadman,它是一个 TCP 套接字。 EJP,它在吹毛求疵。

标签: c++ linux sockets tcp


【解决方案1】:

如果一个进程崩溃,操作系统总是关闭它的描述符并为 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

瞧——远程登录服务器不知道客户端已经终止。

嗯,这是一个非常模糊的情况,你可能会说它永远不会在你的环境中发生。但是keep-alive检查的实现只是为了解决一个模糊和奇怪的状态。

【讨论】:

  • 使用管道连接到子进程。
猜你喜欢
  • 2015-09-03
  • 1970-01-01
  • 2019-08-14
  • 2021-09-10
  • 2012-10-25
  • 2017-03-05
  • 2021-04-18
  • 2014-02-08
  • 2017-01-11
相关资源
最近更新 更多