提问者:小点点

FIN-PSH-确认字符服务器端闭包从客户端引发RST


当服务器上的保活请求计数器耗尽时(nginx的默认值:keepalive_requests100;)我可以在wireshark中看到服务器用[FIN PSH确认字符]启动闭包,客户端-我通过epoll的EPOLLRDHUP|EPOLLHUP标志检测闭包并调用关闭(file_descriptor)而不会干扰so_linger-将发送[RST确认字符]数据包而不是预期的[FIN确认字符]。

我的印象是这种机制可能是一个较新的功能,它允许服务器无需经过CLOSE_WAIT阶段就可以启动关闭,但是我在谷歌上找不到任何相关的东西。有什么想法吗?


共1个答案

匿名用户

好的,我自己想通了。当我根据电子投票的RDHUP/HUP标志调用close()时,我不会从read(file_descriptor)调用中得到0,也就是说,有些数据可能仍然在skb中(即使我在检查RDHUP/HUP标志之前读取了它)。在这种情况下,内核根据以下内容发送RST代替FIN:

(http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination)

一些主机TCP堆栈可能会实现半双工关闭序列,Linux或HP用户体验都是如此。如果这样的主机主动关闭连接,但仍未读取堆栈已从链路接收到的所有传入数据,则该主机发送RST而不是FIN(RFC1122中的第4.2.2.13节)。