Tcp连接挂起CLOSE_WAIT状态

时间:2009-12-16 09:26:47

标签: linux tcp network-programming network-protocols qemu

客户端首先关闭套接字,当服务器没有太多数据时,tcp连接关闭就好了:

FIN -->
   <-- ACK
   <-- FIN, ACK
ACK -->

当服务器忙于发送数据时:

FIN -->
    <-- ACK,PSH
RST -->

服务器连接进入CLOSE_WAIT状态并在那里停留很长时间。

这里有什么问题?客户相关或服务器相关?这种情况发生在Redhat5上,用于本地套接字。

article谈论为什么发送“RST”,但我不知道为什么服务器连接卡在CLOSE_WAIT上,并且不发送FIN。

[编辑]我忽略了最重要的信息,这发生在qemu的slirp网络仿真上。这似乎是处理密切连接的slirp bug的问题。

3 个答案:

答案 0 :(得分:2)

这意味着流中还有未读数据,客户端尚未完成读取。

您可以使用SO_LINGER选项强制关闭它。 Linux的Here's relevant documentation(也参见选项本身,here),以及[这里是Win32的匹配函数2]。

服务器端是保持打开的,所以在服务器端你可以尝试禁用SO_LINGER

答案 1 :(得分:0)

这可能意味着服务器尚未关闭套接字。您可以通过使用“lsof”列出由该进程打开的文件描述符(包括TCP套接字)来轻松告诉您。解决方法是让进程在完成后始终关闭套接字(即使在错误情况下等)

答案 2 :(得分:0)

这是qemu的已知defect