【问题标题】:Tcp connections hang on CLOSE_WAIT statusTcp 连接挂在 CLOSE_WAIT 状态
【发布时间】:2009-12-16 09:26:47
【问题描述】:

客户端先关闭socket,当服务器端数据不多时,tcp连接关闭就好了:

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

服务器忙于发送数据时:

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

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

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

这个article讲为什么会发送“RST”,但是不知道为什么服务器连接卡在CLOSE_WAIT,不发送FIN。

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

【问题讨论】:

    标签: linux tcp network-programming network-protocols qemu


    【解决方案1】:

    这意味着流中还有未读数据,客户端还没有读完。

    您可以使用SO_LINGER 选项强制关闭它。 Here's relevant documentation 用于 Linux(另见选项本身,here),[这里是匹配函数 2] 用于 Win32。

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

    【讨论】:

    • 似乎 SO_LINGER 只影响 close() 调用,而服务器却挂在 write() 调用上?
    • 如果服务器挂起一个写调用,那么你可能已经填满了 TCP 窗口并且堆栈正在等待来自客户端的 ACK,然后它才能接受更多要发送的数据...
    【解决方案2】:

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

    【讨论】:

    • 问题是服务器在写调用时挂起,我无法检测到错误。
    【解决方案3】:

    这是 qemu 的已知 defect

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2012-02-08
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      相关资源
      最近更新 更多