【问题标题】:TCP connection - delayed close() and RSTTCP 连接 - 延迟关闭()和 RST
【发布时间】:2011-03-18 07:14:08
【问题描述】:

我在不同机器上的 RHEL 5.3 上运行 TCP 客户端和 TCP 服务器。

  • 我正在杀死服务器,并将 FIN 发送到客户端。客户端的操作系统会立即将 ACK 发回。

  • 客户端发现关闭(通过 read() 返回零)并仅在 90 秒后执行关闭。 在这个阶段,我在两边都验证了 netstat,它符合预期(服务器上的 FIN_WAIT_2 和客户端上的 CLOSE_WAIT)。

  • 由于客户端在 90 秒后关闭(),客户端的操作系统向服务器发送 FIN,但作为响应,我们收到来自服务器的 RST,而不是预期的 ACK。

我还多次看到由于“延迟”close(),客户端的操作系统发送了 RST 而不是 FIN。

请注意,在这两种情况下,双方都没有挂起的读取数据包,并且 SO_LINGER 选项未激活。

有什么想法吗?

【问题讨论】:

  • 如果你杀死服务器,将会有一个待处理的动作/数据包 - 来自客户端的 close() 不会到达你的服务器程序。
  • 操作系统从服务器端发送FIN。从那一刻起,就服务器操作系统而言,连接不再存在,因此其上的任何传入流量,即使是 FIN,都会引发 RST。

标签: c linux networking tcp


【解决方案1】:

RST 表示丢失了一些“数据”。在这种情况下,“数据”是客户端干净关闭套接字的信息 - 来自客户端的FIN 没有报告给服务器端应用程序(因为它已被杀死)。

换句话说,RST 告诉客户端服务器从未看到来自客户端的流结束。

【讨论】:

  • 谢谢!什么会导致客户端在“延迟”关闭()时发送 RST?我也遇到了这个问题。
  • @idimba:可能意味着客户端也从未看到连接结束(recv() 返回 0)。
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2013-08-11
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
相关资源
最近更新 更多