抓包结果里出现了 TCP ZeroWindow。在改动内核参数之前,先确认是哪个端点通告了零窗口。

该端点描述的是它在这条 TCP 连接上的接收能力,并不是在宣告整个代理有多少可用带宽。零窗口探测让发送方得以了解对方通告的接收能力是否发生变化;探测本身并不能证明存在丢包或代理故障。

browser  <-- TCP A -->  proxy  <-- TCP B -->  website

这是两段彼此独立的 TCP 会话。假设浏览器停止读取一个大响应,并在 A 上通告零窗口。随着代理自身缓冲区被填满,它最终可能不再从 B 读取数据。之后 B 上出现的零窗口,可能是慢客户端造成的结果,而不是最初的问题。

上传时也可能出现相反的情况。如果目标应用停止消费数据,它在 B 上的窗口就会关闭。压力随后可能经由代理的缓冲区回传到客户端一侧。

把观察结果按顺序整理

  1. 记录连接两端以及受影响数据传输的方向。
  2. 确认哪个端点最先通告了收缩或归零的接收窗口。
  3. 检查它的应用是在读取、卡在别的操作上,还是受资源限制。
  4. 在判定最初原因之前,对比代理另一条连接上的时间点。

Wireshark 的窗口分析标签只是对抓包的有用解读,并不是要求你把每个接收缓冲区都调大。窗口缩放同样需要结合这条连接的协商结果来理解。

从代理列表换一个端点、看到传输恢复,是有用的证据,说明路径变了;但仅凭这一点,并不能证明某个操作系统的 TCP 实现有缺陷。请把解释落在接收进程和等待开始的那条连接上。

相关文章