客户端首先closures套接字,当从服务器没有太多的数据时,tcp连接closures是好的,如:
FIN --> <-- ACK <-- FIN, ACK ACK -->
当服务器忙着发送数据时:
FIN --> <-- ACK,PSH RST -->
服务器连接进入CLOSE_WAIT状态,并挂在那里很长一段时间。
这里有什么问题? 客户端相关或服务器相关? 这发生在本地套接字的Redhat5上。
本文讨论为什么发送“RST”,但我不知道为什么服务器连接停留在CLOSE_WAIT上,并且不发送FIN。
[编辑]我忽略了最重要的信息,这发生在qemu的slirpnetworking仿真。 这似乎是一个处理密切联系的slirp错误的问题。
这意味着流中还有未读数据,客户端还没有读完。
您可以使用SO_LINGER
选项强制关闭它。 这里是 Linux 的相关文档 (这里也请看选项本身),以及Win32的[这里是匹配函数2]。
这是服务器端保持打开状态,所以在服务器端可以尝试禁用SO_LINGER
。
这可能意味着服务器没有关闭套接字。 您可以通过使用“lsof”列出由该进程打开的包含TCP套接字的文件描述符来轻松地进行分析。 修复的方法是让程序在完成时始终关闭套接字(即使在错误的情况下等)
这是qemu的一个已知缺陷 。