Linux Tcp连接挂起在关闭等待状态

Linux Tcp连接挂起在关闭等待状态,linux,tcp,network-programming,network-protocols,qemu,Linux,Tcp,Network Programming,Network Protocols,Qemu,客户端首先关闭套接字,当服务器没有太多数据时,tcp连接关闭正常,如下所示: FIN --> <-- ACK <-- FIN, ACK ACK --> FIN--> 服务器连接将处于关闭等待状态,并在那里挂起很长时间 这里有什么问题?客户端相关还是服务器相关?这在本地套接字的Redhat5上发生 这篇文章讨论了为什么发送“RST”,但我不知道为什么服务器连接卡在CLOSE_WAIT上,而不发送FIN [编辑]我忽略了最重要的信息,这发生在qemu的slir

客户端首先关闭套接字,当服务器没有太多数据时,tcp连接关闭正常,如下所示:

FIN -->
   <-- ACK
   <-- FIN, ACK
ACK -->
FIN-->
服务器连接将处于关闭等待状态,并在那里挂起很长时间

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

这篇文章讨论了为什么发送“RST”,但我不知道为什么服务器连接卡在CLOSE_WAIT上,而不发送FIN


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

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

您可以使用
SO\u LINGER
选项将其强制关闭。对于Linux(也请参见选项本身,),以及Win32的[这里是匹配的函数2]


服务器端保持打开状态,因此在服务器端您可以尝试禁用
以便_LINGER

这可能意味着服务器尚未关闭套接字。通过使用“lsof”列出该进程打开的文件描述符(包括TCP套接字),可以很容易地看出这一点。修复方法是让进程在完成套接字时始终关闭它(即使在错误情况下也是如此)

这是qemu的一个众所周知的解决方案。

似乎延迟只影响close()调用,但服务器挂起write()改为调用?如果服务器挂起写调用,那么您可能已填充TCP窗口,堆栈正在等待来自客户端的确认,然后才能接受更多数据发送…问题是服务器挂起写调用,我无法检测错误。
FIN -->
    <-- ACK,PSH
RST -->