TCP连接在CLOSE_WAIT状态下挂起

11

当客户端先关闭套接字时,如果从服务器传输的数据不多,TCP连接关闭就可以了,如下:

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

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

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

服务器连接进入CLOSE_WAIT状态并长时间挂起。

问题出在哪里?是客户端相关还是服务器相关?这在Redhat5的本地套接字上发生。

这篇文章讨论了为什么会发送“RST”,但我不知道为什么服务器连接会卡在CLOSE_WAIT状态,并且没有发送FIN。

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

3个回答

2
这意味着在流中仍有未读取的数据,客户端尚未完成读取。您可以使用 SO_LINGER 选项强制关闭它。这里是适用于 Linux 的相关文档(也请参见选项本身,此处),以及 [这里是 Win32 的匹配函数2]。服务器端仍然保持打开状态,因此您可以尝试禁用 SO_LINGER

似乎SO_LINGER只影响close()调用,但服务器却在write()调用上挂起了? - Sam Liao
1
如果服务器在写入调用时挂起,那么您很可能已经填满了TCP窗口,堆栈正在等待客户端的ACK才能接受更多要发送的数据... - Len Holgate

0

这可能意味着服务器没有关闭套接字。您可以使用“lsof”列出该进程打开的文件描述符(包括TCP套接字),以轻松确定此问题。解决方法是在进程完成时始终关闭套接字(即使在错误情况下等)。


问题是服务器在写调用上卡住了,我无法检测错误。 - Sam Liao

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接