【问题标题】:Socket heartbeat vs keepalive套接字心跳与keepalive
【发布时间】:2016-06-12 11:42:05
【问题描述】:

实现自己的心跳和为套接字设置`keepalive有什么优缺点?

我在某处读到,keepalive 有时可能会失败,并且无论如何都会关闭连接(取决于网络结构)。另一件事是自己的心跳可以检测应用程序是否响应(不仅仅是套接字)。

我的主要目标是确保所有这些:保持连接活跃,即使没有数据发送(除了可能的心跳),双方的快速连接丢失检测,应用程序响应检测。

我已经在两端实现了一个简单的心跳,效果很好,但是我想知道是否可以用开箱即用的 keepalive 功能替换它。

【问题讨论】:

  • 不要对非代码文本使用代码格式。

标签: c++ windows sockets networking tcp


【解决方案1】:

TCP 内置的 keepalive 功能的一个问题是它并不总是很容易配置。例如,在 Linux 上,setsockopt() 有各种选项(例如 TCP_KEEPIDLE、TCP_KEEPCNT 和 TCP_KEEPINTVL),您可以使用它们将 keepalive 的行为设置为您想要的,但 in other OS's those behaviors are not easily adjusted, at least not programmatically。因此,如果您希望程序的 keepalive 行为能够移植到各种操作系统并在所有操作系统上保持一致,那么滚动自己的心跳通常是可行的方法。

另一方面,可能有一些程序或网络协议不容易支持心跳/无操作消息的概念(或者您可能希望您的程序能够使用许多协议,而无需必须为每个支持的协议提供单独的保活逻辑),在这种情况下,您可能希望使用内置保活,因为它能够发送和接收不影响内容的“透明”保活数据包TCP 数据流。在这种情况下,内置的 keepalive 会很有用(特别是如果您真的只需要 keepalive 代码就可以在 Linux 下工作)。

【讨论】:

  • 您是否知道保持活动不起作用的任何情况?除了配置。
  • 嗯,我在工作中编写的控制软件就是一个例子:它需要在 Mac、Linux 和 Windows 上运行,并且需要能够在一两秒内通知操作员,如果与服务器的连接丢失(因为它在现场表演中控制音响系统,如果操作员无法再控制声音,他需要立即知道,以便采取行动)。对于这个用例,keepalive 是不够的,因为在 Windows 和 Mac 下,客户端计算机可能需要几个小时才能确定连接已丢失。
  • keepalive数据包是否只有在tcp_keepalive_time(Linux默认值7200)过期后才发送透明keepalive数据包?
  • 还应该在防火墙上的理想超时之前发送 tcp 探测以保持连接处于活动状态,以防数据流不连续以防止防火墙老化连接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 2019-09-15
相关资源
最近更新 更多