【问题标题】:FIN-PSH-ACK server-side closure provoking RST from the clientFIN-PSH-ACK 服务器端关闭引发来自客户端的 RST
【发布时间】:2015-02-26 15:49:38
【问题描述】:

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

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

【问题讨论】:

    标签: c linux http tcp


    【解决方案1】:

    好的,我自己搞定了。当我根据 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 节)。

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 2020-05-05
      • 1970-01-01
      • 2011-06-16
      • 2015-06-23
      • 2012-07-27
      • 2021-03-20
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多