FIN-PSH-ACK服务器端关闭从客户端激发RST

时间:2014-12-30 13:12:00

标签: c linux http tcp

我探索客户端 - 服务器交互,我使用nginx服务器和我自己的客户端(c代码)。当keep-alive请求计数器在服务器上耗尽时(nginx' s默认值:keepalive_requests 100;)我可以在wireshark中看到服务器使用[FIN PSH ACK]和客户端启动关闭 - 我通过epoll检测到关闭#93; s EPOLLRDHUP | EPOLLHUP标记并调用close(file_descriptor)而不会弄乱so_linger - 将发送[RST ACK]数据包而不是预期的[FIN ACK]。

我的印象是,这种机制可能是一个较新的功能,允许服务器启动关闭而不必通过CLOSE_WAIT阶段,但我无法在google上找到任何相关内容。请问有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我自己绕过去了。当我根据epoll的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-UX。如果此类主机主动关闭连接但仍未读取堆栈已从链接收到的所有传入数据,则此主机发送RST而不是FIN(RFC 1122中的第4.2.2.13节)。