套接字心跳vs keepalive

Woj*_*lik 5 c++ sockets windows networking tcp

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

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

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

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

Jer*_*ner 5

TCP 内置的 keepalive 功能的一个问题是它并不总是易于配置。例如,在 Linux 上,setsockopt() 有各种选项(例如 TCP_KEEPIDLE、TCP_KEEPCNT 和 TCP_KEEPINTVL),您可以使用它们将 keepalive 的行为设置为您想要的,但在其他操作系统中,这些行为不容易调整,至少不容易调整以编程方式。因此,如果您希望程序的保活行为能够移植到各种操作系统并在所有操作系统上表现一致,那么滚动您自己的心跳通常是最佳选择。

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