客户端首先关闭套接字,当服务器没有太多数据时,tcp连接关闭就好了:
FIN -->
<-- ACK
<-- FIN, ACK
ACK -->
当服务器忙于发送数据时:
FIN -->
<-- ACK,PSH
RST -->
服务器连接进入CLOSE_WAIT状态并在那里停留很长时间。
这里有什么问题?客户相关或服务器相关?这种情况发生在Redhat5上,用于本地套接字。
此article谈论为什么发送“RST”,但我不知道为什么服务器连接卡在CLOSE_WAIT上,并且不发送FIN。
[编辑]我忽略了最重要的信息,这发生在qemu的slirp网络仿真上。这似乎是处理密切连接的slirp bug的问题。
答案 0 :(得分:2)
这意味着流中还有未读数据,客户端尚未完成读取。
您可以使用SO_LINGER
选项强制关闭它。 Linux的Here's relevant documentation(也参见选项本身,here),以及[这里是Win32的匹配函数2]。
服务器端是保持打开的,所以在服务器端你可以尝试禁用SO_LINGER
。
答案 1 :(得分:0)
这可能意味着服务器尚未关闭套接字。您可以通过使用“lsof”列出由该进程打开的文件描述符(包括TCP套接字)来轻松告诉您。解决方法是让进程在完成后始终关闭套接字(即使在错误情况下等)
答案 2 :(得分:0)
这是qemu的已知defect。