linux TCP连接在CLOSE_WAIT状态下挂起

kg7wmglp  于 2023-03-17  发布在  Linux
关注(0)|答案(3)|浏览(133)

客户端先关闭套接字,当没有太多的数据从服务器,tcp连接关闭是可以的,如:

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

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

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

服务器连接进入CLOSE_WAIT状态,并长时间挂起。
这里的问题是什么?客户端相关还是服务器相关?这发生在Redhat5的本地套接字上。
这个article讨论了为什么发送“RST”,但我不知道为什么服务器连接在CLOSE_WAIT上卡住,并且不发送FIN。
[EDIT]忽略了最重要的信息,这是qemu的slirp网络仿真出现的问题,似乎是处理紧密连接的slirp bug问题。

3pmvbmvn

3pmvbmvn1#

这意味着流中还有未读的数据,客户端尚未完成阅读。
您可以通过使用SO_LINGER选项强制关闭它。Linux的Here's relevant documentation(另请参见选项本身here),Win32的[这里是匹配的函数2]。
服务器端保持打开状态,因此您可以在服务器端尝试禁用SO_LINGER

q43xntqr

q43xntqr2#

这可能意味着服务器还没有关闭套接字。你可以很容易地通过使用“lsof”来列出该进程打开的文件描述符来判断这一点,其中包括TCP套接字。修复方法是让进程在完成时总是关闭套接字(即使在错误情况下等)

相关问题