服务器报告ZeroWindow,但接收缓冲区中没有数据

时间:2014-01-21 16:27:58

标签: linux sockets networking tcp wireshark

我有一个基于LINUX的服务器应用程序,它在套接字连接上报告TCP ZeroWindow以指示它正在关闭接收窗口。这已通过Wireshark确认,还应注意窗口缩放已禁用。

奇怪的是,当使用netstat查看此连接时,连接显示以下内容:

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 192.168.0.201:1344          192.168.0.101:35340         ESTABLISHED

我觉得这很奇怪的原因是,Recv-Q报告值为0,这意味着它可以接收更多数据,但是连接仍然报告ZeroWindow指示客户端不发送任何内容。< / p>

因此,除了定期向服务器发送特殊探测段的客户端之外,连接在这种状态下卡住了,除此之外没有数据流动。这些探测的目的是提示服务器发回包含当前窗口大小的段;然而,窗户永远不会重新打开。

有了这个说法,我正在寻找解释连接如何在这种状态下卡住的原因:带有Recv-Q的ZeroWindow也为零。

谢谢!

1 个答案:

答案 0 :(得分:0)

服务器可能已经确定已完成读取数据并已在套接字上调用shutdown(., SHUT_RD)。这不应该向客户端发送RST,因为仍然允许服务器发送数据。 linux实现可能会在shutdown()之后将窗口大小设置为0,因为该进程已经指示它无论如何都不会再读取任何数据(只是一个假设,如果linux真的那样,我从不尝试)。如果您可以重现该问题,请在连接进入此状态之前尝试strace服务器进程。