TCP 流分析82 条

TCP 零窗口与恢复

接收端缓冲满时通告窗口 0 暂停发送;发送方定期发窗口探测,窗口恢复后继续。抓包表现为窗口=0 通告 + 周期探测 + 窗口更新后恢复。

零窗口与恢复机制

TCP 用通告窗口告诉对端「我还能接多少字节」。接收缓冲被写满、应用来不及读取时,接收端通告窗口 0,发送端必须停止发送,只能按退避周期发窗口探测。等应用把数据读走、缓冲释放,接收端发一个窗口更新把窗口放开,传输才继续。抓包看到的就是「窗口 0 通告 → 周期探测 → 窗口更新 → 数据恢复」这条链路。

基本信息

本质接收侧流控:接收缓冲不足时暂停发送方
关键报文窗口 0 通告、窗口探测、窗口更新
Wireshark 过滤tcp.analysis.zero_window / window_probe / window_update
内核相关接收缓冲由 SO_RCVBUF / tcp_rmem 等参数决定(Linux)
持续时间取决于接收端应用何时读取,与网络无关

典型使用场景

  • 长连接业务周期性卡顿,确认是否为接收侧缓冲打满
  • 定位「服务端处理慢」的硬证据:窗口归零后发送方确实无包可发
  • 评估大批量传输时接收缓冲是否需要调大
  • 区分「网络丢包」与「应用读取慢」两类吞吐骤降

恢复链路

恢复链路
窗口为 0 的通告           # 接收端缓冲已满
发送端周期发窗口探测      # 按退避间隔,探测间隔逐步拉长
应用读取释放缓冲          # 接收端本地动作,抓包里看不到
窗口更新(数值大于 0)    # 接收端通知可以继续发送
数据段重新出现            # 传输恢复

分阶段报文特征

阶段报文特征动作方
通告归零窗口字段等于 0接收端
窗口探测零载荷或单字节小包,间隔递增发送端
窗口更新窗口字段恢复为正值接收端
恢复传输正常数据段重新出现发送端
零窗口持续过久时,中间设备可能因会话老化直接断开连接,长连接业务要同时关注中间设备超时配置。
抓包只能证明「慢在接收侧应用」,具体是 GC、锁竞争还是下游依赖阻塞,需要结合应用日志与线程状态。

易错点

  • 把零窗口当网络故障处理:它是接收端应用读取慢的直接证据,优化点在应用侧
  • 忽略方向性:同一连接两个方向独立,一方卡住另一方可能完全正常
  • 把窗口探测计入重传统计:探测包是正常流控行为,混入统计会虚高丢包率

数据来源与参考

  • RFC 9293(零窗口与探测)
  • Wireshark User's Guide
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌