【发布时间】: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