2009-12-16 123 views
9

客户先关闭插座,当没有从服务器多数据,TCP连接关闭是好的,如:TCP连接挂在CLOSE_WAIT状态

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

当服务器忙于发送数据:

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

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

这里有什么问题吗?客户端相关或服务器相关?这发生在本地套接字的Redhat5上。

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

[编辑]我忽略了最重要的信息,这发生在QEMU的SLIRP网络仿真。这似乎是一个处理密切联系的问题。

回答

0

这是一个已知的defect用于QEMU的插座。

+0

更好的网址:http://lists.gnu.org/archive/html/qemu-devel/2008-06/msg00372.html – qerub 2012-02-09 17:24:08

2

这意味着有流中留在读数据时,该客户端还没有读完。

您可以通过使用SO_LINGER选项强制其关闭。用于Linux的Here's relevant documentation(另请参阅选项本身here),以及Win32的[这里是匹配函数2]。

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

+0

似乎SO_LINGER只影响close()调用,但服务器挂在write()调用上呢? – 2009-12-16 10:17:39

+1

如果服务器上写电话挂,那么你可能已经填补了TCP窗口和堆栈从客户端等待ACK的,才可以接受更多的数据发送... – 2009-12-16 14:45:54

0

这可能意味着服务器尚未关闭套接字。您可以通过使用“lsof”列出由该进程打开的包含TCP套接字的文件描述符来轻松地说明这一点。解决方法是有过程中始终关闭时,它的完成(甚至在错误情况等)

+0

的问题是服务器挂在写打电话,我无法检测到错误。 – 2009-12-17 01:51:21