Linux 服务器报告一个零窗口,但有';接收缓冲区中没有数据
我有一个基于LINUX的服务器应用程序,它在套接字连接上报告一个TCP ZeroWindow,以指示它正在关闭接收窗口。Wireshark证实了这一点,还应注意,已禁用窗口缩放 奇怪的是,当使用netstat查看此连接时,该连接显示以下内容:Linux 服务器报告一个零窗口,但有';接收缓冲区中没有数据,linux,sockets,networking,tcp,wireshark,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
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,这意味着它可以接收更多数据,但连接仍然报告一个零窗口,指示客户端不发送任何内容
因此,连接会陷入这种状态,除了定期向服务器发送特殊探测段的客户端之外,不再有数据流。这些探测的目的是提示服务器发回包含当前窗口大小的段;但是,窗口永远不会重新打开
说到这里,我正在寻找一种解释,说明连接在这种状态下是如何被卡住的:带有Recv-Q的ZeroWindow也是零
谢谢 服务器可能已确定已完成数据读取,并已调用套接字。这不应该向客户端发送RST,因为仍然允许服务器发送数据。linux实现可能会在
shutdown()
之后将窗口大小设置为0,因为进程表明它无论如何都不会读取更多数据(这只是一个假设,如果linux真的这样做,我从不尝试)。如果可以重现此问题,请在连接进入此状态之前尝试清除服务器进程