为什么 TCP 保活数据包不触发 I/O 事件?是不是因为没有payload或者sequence number比connection的sequence number小1

why TCP keep-alive packet doesn't trigger I/O event? Is it because no payload or sequence number is 1 less than sequence number of connection

我想让我的应用层在我的服务器收到 Keep Alive 数据包时得到通知。我想知道 Keep Alive 数据包不触发 I/O 事件的原因是什么。是因为TCP Keep Alive包没有数据还是sequence number比connection sequence number小1。

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

我也想知道如果我填充一个字节到 Keep Alive 数据包 data/payload,我的应用程序会收到通知/ I/O 事件 / Epoll 触发吗?

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

这些是 transport-level 消息详细信息。在应用程序级别,TCP 为您提供字节流,与 low-level 细节无关。如果你想要 application-level 心跳,你应该在应用层协议上实现它们。

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

  • 首先,它们是由网络层发送的,应用程序无法控制它们(超时除外)
  • 更重要的是,如果通过某种(黑暗的)魔法你设法干扰了网络层(比如,你修补了你的内核:)并开始将数据放入其中,它们将不再是保持活动的数据包,并且会变得正常数据包,承载数据。当然,您的接收者将收到数据通知,这将成为消息流的一部分。