解决“TCP 零窗口”问题

网络工程 通讯协议 故障排除 线鲨 包分析
2021-07-13 01:52:41

我目前在对交易应用程序进行故障排除时遇到问题。让我给出一个当前网络设置的简单图

(Gov't Stock Exchange Network Router)X-->(256kbs 租用线路)<--X(Telco Router)<-(100mbps fast E link)--->我们的网络设备(5个交换机,1个防火墙)<- -> 交易服务器。

我们的用户报告说他们在上午 9:30 到 9:45 左右遇到速度缓慢的问题。我检查了我们所有网络设备和接口的 CPU、内存、响应时间和链路利用率,所有这些都报告正常水平。

交易过程的一部分是证券交易所网络和我们的交易服务器之间的通信,因此如果该 256kbps 租用线路链接有任何缓慢,肯定会导致缓慢。不幸的是,电信路由器并未受到电信公司的监控,如果我们可以将他们的设备添加到我们的 Solarwinds,我们仍在征求许可。

所以我能看到的最近的链路是从我们的交换机到我们这边的租用线路路由器的 100mbps 链路。

当交易者在交易中遇到 3ms 到 5ms 的延迟时,它表明:

传输:1500bps - 1900bps

接收:2000bps - 2400bps

每分钟传输的字节数:44KB-60KB

Wireshark 目前报告没有问题

特别注意每 9:34 - 9:37 因为他们在交易中经历 10 毫秒 - 15 毫秒的延迟:

传输:1900bps - 2400bps

接收:2400bps - 3200bps

每分钟传输的字节数:90KB - 170KB

Wireshark 报告说我收到 TCP 零窗口(交易服务器向证券交易所服务器发送零窗口警报)错误,但它只持续几毫秒,并且每天只发生两次或三次。

甚至发生过一件事,我们的交易员在交易中遇到了 1 到 3 分钟的疯狂延迟!:

传输:4000bps

接收:5600bps

Wireshark 报告说,我们在当天的整个交易期间都收到 TCP 零窗口(交易服务器向证券交易所服务器发送零窗口警报)错误。这仅发生过一次,直到现在,我仍然无法解决此问题

Trading Server 团队报告说他们的 CPU、内存和 NIC 利用率正常,当然,每个人都在责怪网络人员。

所以这里是我的问题:

0.) 我解决这个问题的方式有什么问题吗?我想我应该把这个写成问题号。0,哈哈。

1.) 当 TCP 零窗口发生时,我应该检查哪些东西和设备?因为服务器团队报告他们交易服务器的内存和网卡利用率是正常的。

2.) 有没有办法在wireshark中绘制传输/接收bps和接收到的字节?我目前做的是去统计 -> 对话 -> IPV4 -> 检查“限制显示到这个过滤器”,我使用的过滤器是 ip.addr eq XXXX 和 ip.addr eq YYYY 和 (frame.time ge "DATE HH:MM:SS.000000000" and frame.time le "DATE HH:MM:SS.999999999") 然后查看接收到的 bps 和字节

3.) 还有其他我可以查看或检查的东西吗(网络设备等)?

非常感谢您的帮助!:)

1个回答

好。由于您捕获的数据包表明您的交易服务器正在发送窗口大小为 0 的 TCP ACK,您至少知道问题肯定在您这边。这实际上是一件好事,因为您可以解决它。 (有一件事可能是他们最终会遇到的问题,我稍后再谈)

您还追踪了在吞吐量增加期间发生的问题,这也是一件好事。

您说您的交易服务器上的 CPU/RAM 使用率报告正常。您正在使用的应用程序是否偶然配置为在主机操作系统上使用有限数量的 RAM?也许是有限的百分比?因为如果是这样,那么按理说,当您有更多的连接和更高的吞吐量时,应用程序可用的 RAM 更少,因此 TCP 可用的资源更少。

无论哪种方式,您的交易服务器使用的是什么操作系统?如果您还没有,您应该考虑调整操作系统以将更多 RAM 专用于 TCP。Windows 中,您可以修改注册表值Linux 中,您可以编辑配置文件

确保您的防火墙(以及两者之间没有其他任何东西)尝试代理您的 TCP 会话也是明智之举。这样您就知道您正在处理完整的“客户端到服务器”TCP 连接,而不是介于两者之间的连接。

我能提供的最后一件事是在您的服务器发送 0 的窗口大小之前研究从证券交易所发送到您的服务器的 TCP 数据包。特别是,在 IP 标头的 ECN 中查找传入数据包的值为 11字段(显式拥塞通知——过去是DSCP 中的最后两位,如果您正在查看IP 标头,则为第 14 位和第 15 位)。如果通信中的客户端和服务器都支持 ECN,并且传输中的路由器检测到拥塞,则它可能会打开这些位以告诉客户端和服务器减慢传输速度。 (这就是我说的那件事,可能是他们最后的问题)

我认为(试图)回答问题 0、1、3。我将不得不多研究一点才能为您提供 2 的可靠答案。但我非常有信心有一种方法。