1

我想让我的应用程序层在我的服务器收到 Keep Alive 数据包时得到通知。我想知道 Keep Alive 数据包不触发 I/O 事件的原因是什么。是不是因为TCP Keep Alive包没有数据或者序号比连接的序号少1。

我做了一些测试,让我的客户发送 Keep Alive Packets。我的服务器使用 epoll 但没有被触发。

我还想知道如果我填充一个字节来保持活动数据包数据/有效负载,我的应用程序会收到通知/I/O 事件/Epoll 触发吗?

4

1 回答 1

4

你不应该对此感到惊讶。例如,您也不会收到 RST 数据包的通知。

这些是传输级别的消息传递细节。在应用程序级别,TCP 为您提供字节流,与底层细节无关。如果你想拥有应用程序级的心跳,你应该在应用程序级协议上实现它们。

您最近的编辑似乎源于某种混乱。您不能将数据添加到 Keep Alive 数据包中,原因有两个:

  • 首先,它们是由网络层发送的,应用程序无法控制它们(除了超时)
  • 更重要的是,如果通过某种(黑暗)魔法你设法干扰了网络层(比如,你修补了你的内核 :) 并开始将数据放入其中,它们将不再是保活数据包,而是成为正常的数据包,携带数据. 当然,您的接收者会收到有关数据的通知,这些数据将成为消息流的一部分。
于 2019-06-06T18:45:41.153 回答