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