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

标签 c tcp tcp-keepalive

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

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

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

最佳答案

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

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

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

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

关于c - 为什么 TCP 保活数据包不触发 I/O 事件?是不是因为没有payload或者sequence number比connection的sequence number小1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483352/

相关文章:

c++ - 使用带有 C 函数指针的 C++ 类成员函数

windows - Socket.Bind 和 IP 源路由,具有多个本地网络接口(interface)

java - 如何从 HttpClient 设置 TCP 保持 Activity 状态?

postgresql - Postgres 的 tcp_keepalives_idle 不更新 AWS ELB 空闲超时

c - 在 C 中获取 HTTP 响应的大小

c++ - 将存储在 int64_t 中的系统时钟(微秒)转换为 float ?

Node.js 在大量并发连接中苦苦挣扎

go - Keep-alive:死亡节点检测

c - 有条件地添加数字

java - 如何从 Netty 向客户端发送多个响应