如何检测TCP保持活动数据包并保持连接打开
how to detect TCP keep alive packets and keep connection open
我用epoll写了自己的服务器。当我从客户端向服务器发送 TCP keep alive 包时,epoll 事件不会被触发。问题:我希望我的服务器在服务器获取 tcp keep alive 包时保持连接打开。
我也尝试查看 tcp 信息,但是当服务器获得 keep alive 包时,其属性没有更新。
我理解 tcp keep alive packages 没有数据但是 header。我在我的 tcpdump 中看到,内核在收到 keep alive 包后发回 tcp keep alive ACK。我的目标是在 keep alive 到达时保持连接打开(有点像我服务器中的重置计时器,我的服务器可以在没有 tcp 真实数据的情况下关闭连接)
我将客户端设置为建立连接并发送数据(例如 "hello world"),然后将保持活动状态的数据包发送到服务器。
我的服务器触发了epoll。我也已经尝试将我的服务器设置为 non-blocking。
// epoll setting I tested
EPOLLIN | EPOLLOUT | EPOLLRDHUP | EPOLLET
(我在网上找到的大多数问题都与客户端有关,我的问题更多的是关于 tcp 的服务器或接收方保持活动状态,如何保持打开状态)
不,据我所知这是不可能的。
你将不得不在应用协议中实现心跳,然后你就可以停止使用TCP keepalive。
我用epoll写了自己的服务器。当我从客户端向服务器发送 TCP keep alive 包时,epoll 事件不会被触发。问题:我希望我的服务器在服务器获取 tcp keep alive 包时保持连接打开。
我也尝试查看 tcp 信息,但是当服务器获得 keep alive 包时,其属性没有更新。
我理解 tcp keep alive packages 没有数据但是 header。我在我的 tcpdump 中看到,内核在收到 keep alive 包后发回 tcp keep alive ACK。我的目标是在 keep alive 到达时保持连接打开(有点像我服务器中的重置计时器,我的服务器可以在没有 tcp 真实数据的情况下关闭连接)
我将客户端设置为建立连接并发送数据(例如 "hello world"),然后将保持活动状态的数据包发送到服务器。
我的服务器触发了epoll。我也已经尝试将我的服务器设置为 non-blocking。
// epoll setting I tested
EPOLLIN | EPOLLOUT | EPOLLRDHUP | EPOLLET
(我在网上找到的大多数问题都与客户端有关,我的问题更多的是关于 tcp 的服务器或接收方保持活动状态,如何保持打开状态)
不,据我所知这是不可能的。
你将不得不在应用协议中实现心跳,然后你就可以停止使用TCP keepalive。