套接字心跳vs keepalive

时间:2016-02-29 12:22:48

标签: c++ windows sockets networking tcp

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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逻辑),在这种情况下,您可能希望使用内置的keepalive,因为它能够发送和接收"透明" keepalive数据包不影响TCP数据流的内容。在这种情况下,内置的keepalive可能很有用(特别是如果你真的需要keepalive代码在Linux下工作)。