我有两台 CentOS 服务器(一台是应用服务器,另一台是数据库)通过一个端口进行通信。每隔一段时间,应用服务器就会开始广播连接到数据库的端口处于“ZeroWindow”(窗口大小为零)状态(通过 tcpdump 可以看到)。
发生这种情况时,数据库服务器上的端口的发送 Q 将被字节填满,因为应用服务器端没有任何内容在读取它们。
当发生这种情况时,我如何知道是什么原因导致我的应用服务器将端口发送到这个“ZeroWindow”状态?
答案1
端口不会“广播”零窗口。TCP 接收窗口 (RWIN) 是 TCP 连接的一个属性。通过 RWIN,接收方可以告知发送方其缓冲区可以接收多少字节。发送方在等待 ACK 之前只会发送此窗口中的字节数。将 RWIN 设置为 0 后,发送方将不会再发送任何数据包,直到 RWIN 再次增加。
大小为 0 的 RWIN 通常意味着接收器没有更多可用的缓冲区来从 TCP 连接接收数据,可能是因为应用程序未收集数据或收集速度不够快。
因此,您必须在接收器(应用服务器)端调试应用程序,才能了解其为何将 RWIN 设置为零。
首先,查看输出netstat -tpn
,看看连接的 Recv-Q 是否在增加或保持在较高数字。这表明应用程序未收集数据(或收集速度不够快)。之后,这取决于应用程序。