TCP连接-延迟关闭()和RST

TCP连接-延迟关闭()和RST,c,linux,networking,tcp,C,Linux,Networking,Tcp,我让TCP客户端和TCP服务器在RHEL 5.3的不同机器上运行 我正在关闭服务器,FIN被发送到客户端。ACK由客户端的操作系统立即发回 客户端发现关闭(通过read()返回零)并仅在90秒后执行关闭。 在这一阶段,我在双方都验证了netstat,并且正如预期的那样(服务器上的FIN_WAIT_2和客户端上的CLOSE_WAIT) 由于客户端关闭()在90秒后,客户端的操作系统将FIN发送到服务器,但作为响应,我们从服务器接收RST,而不是预期的ACK 我还多次看到,由于“延迟”close

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

  • 我正在关闭服务器,FIN被发送到客户端。ACK由客户端的操作系统立即发回

  • 客户端发现关闭(通过read()返回零)并仅在90秒后执行关闭。 在这一阶段,我在双方都验证了netstat,并且正如预期的那样(服务器上的FIN_WAIT_2和客户端上的CLOSE_WAIT)

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

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

请注意,在这两种情况下,两侧都没有挂起的读取数据包,因此不会激活_-LINGER选项


有什么想法吗?

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


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

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


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

如果您杀死服务器,将有一个挂起的操作/数据包-来自客户端的close()将不会到达您的服务器程序。操作系统从服务器端发送FIN。从那一刻起,就服务器操作系统而言,连接不再存在,因此连接上的任何传入流量,甚至FIN,都将引发RST。如果您杀死服务器,将有一个挂起的操作/数据包-客户端的close()将不会到达您的服务器程序。操作系统从服务器端发送FIN。从那一刻起,就服务器操作系统而言,连接将不再存在,因此,连接上的任何传入流量,即使是FIN,都将引发RST。谢谢!什么会导致客户端在“延迟”关闭()时发送RST?我也遇到了这个问题。@idimba:可能意味着客户端也从未看到连接结束(a
recv()
返回0)。谢谢!什么会导致客户端在“延迟”关闭()时发送RST?我也遇到了这个问题。@idimba:可能意味着客户端也从未看到连接结束(a
recv()
返回0)。