如何诊断为什么端口广播“ZeroWindow”状态

我有两个CentOS服务器(一个是应用程序服务器,另一个是数据库)通过端口进行通信。 每隔一段时间,应用服务器开始广播连接到DB的端口具有“ZeroWindow”(窗口大小为零)状态(如通过tcpdumps所示)。

发生这种情况时,数据库服务器上的端口将发送Q填充字节,因为App Server端没有读取它们。

我怎么知道是什么原因导致我的应用服务器在发生这种情况时将端口发送到这个“ZeroWindow”状态?

端口不“广播”零窗口。 TCP接收窗口(RWIN)是TCP连接的一个属性。 通过RWIN,接收者告诉发送者可以接收多less字节的缓冲区。 在等待ACK之前,发送方只会发送与此窗口中一样多的字节。 RWIN设置为0,发送者将不会再发送更多的数据包,直到RWIN再次增加。

大小为0的RWIN通常意味着接收方没有更多的缓冲区可用于从TCP连接接收数据,这可能是因为数据不是由应用程序收集的,也可能是因为收集速度不够快。

所以你将不得不在接收器(应用程序服务器)端debugging应用程序,看看为什么它将RWIN设置为零。

首先,查看netstat -tpn的输出,并查看连接的Recv-Q是否增加或停留在高位。 这将表明数据不是由应用程序收集(或不够快)。 之后,这取决于应用程序。