零窗与丢包的区别
传输停滞有两种完全不同的原因,恢复方式也不一样:接收方通告的窗口为 0 属于流量控制,数据本身并没有丢,只要接收方腾出空间并发出窗口更新,发送立刻恢复;而报文真的丢失属于丢包问题,只能靠重传补偿。把两者混为一谈会导致处置方向出错——把流控当丢包去查链路,或者把丢包当流控去等应用读取,都会白白耗掉排查时间。
基本信息
| 适用平台 | Wireshark / tshark 的传输层分析标注 |
|---|---|
| 关键标注 | 零窗、窗口更新、重传 |
| 辅助线索 | 窗口探测包的频率与大小 |
| 恢复路径 | 流控靠窗口更新恢复,丢包靠重传恢复 |
典型使用场景
- 传输长时间停滞,先判断是流控还是丢包
- 应用读取慢导致的停滞定位
- 排查发送端反复发送小探测包的原因
- 区分接收侧缓冲不足与链路丢包两类问题
- 为接收端缓冲区调整提供依据
- 在批量数据处理场景中定位消费者过慢的点
过滤与判读
过滤与判读
tcp.analysis.zero_window # 接收方窗口为 0
tcp.analysis.window_update # 窗口更新(恢复信号)
tcp.analysis.retransmission # 真正的丢包补偿
# 零窗期间发送方会周期性发窗口探测包,包很小属正常
# 出现零窗且随后有窗口更新 → 属流控,恢复由接收方决定两类现象对照
| 现象 | 机制 | 恢复条件 |
|---|---|---|
| 窗口为 0 | 接收方告知暂时收不下 | 接收方腾出空间并发出窗口更新 |
| 数据未达 | 报文在路径上丢失 | 超时或快速重传补偿 |
| 窗口探测包 | 发送方周期性试探 | 接收方有空间即恢复正常发送 |
| 重传标注 | 发送方重复发送同一段 | 对端确认后停止重传 |
零窗期间的窗口探测包体积很小,看到频繁的小包不要当作异常流量处理。
窗口探测的间隔由协议栈参数决定,频率异常时应当去核对对端实现与参数,而不是直接归因于网络。