零窗口说明什么
TCP 接收方通过通告窗口告诉对方「我还能收多少字节」。当接收缓冲区被写满、应用来不及读走数据时,窗口被通告为 0,发送方必须停止发送并周期性发探测包等待窗口更新。这是「网络本身没问题、慢在接收端应用」最直接的抓包证据,典型出现在数据库大查询回包、日志同步和消费速度跟不上的队列客户端上。
基本信息
| 适用平台 | Wireshark / tshark 分析任意平台抓取的 pcap |
|---|---|
| 关键显示过滤器 | tcp.analysis.zero_window、tcp.window_size_value == 0 |
| 配套过滤器 | tcp.analysis.zero_window_update、tcp.analysis.window_update |
| 含义 | 接收窗口为 0:缓冲区满,发送侧被迫停发 |
| 与拥塞窗口的区别 | 零窗口反映接收侧压力,与发送侧拥塞控制无关 |
典型使用场景
- 业务报「接口偶发几秒无响应」而链路指标正常时定位背压点
- 数据库客户端读取大结果集慢:确认是服务端发送受限还是客户端消费慢
- 日志采集与消息队列消费滞后:判断消费者是否成为瓶颈
- 上传或下载中断:排查是否是接收端应用阻塞导致长时间停顿
- 性能压测复盘:区分服务端处理慢与客户端读取慢两个不同方向
定位零窗口
定位零窗口
# 只看零窗口事件
tcp.analysis.zero_window
# 直接按窗口值为 0 过滤
TCP.WINDOW_SIZE_VALUE == 0
# 零窗口更新事件(接收方腾出空间后重新通告)
tcp.analysis.zero_window_update
# 组合:谁在喊零窗口、多久恢复
tcp.analysis.zero_window || tcp.analysis.window_update
# tshark 非交互式统计
tshark -r capture.pcap -Y 'tcp.analysis.zero_window' -T fields -e frame.time -e ip.src -e tcp.srcport事件对照与判读
| 抓包现象 | 含义 | 判读要点 |
|---|---|---|
| Zero Window | 接收方通告窗口为 0 | 记录首次出现的时刻与流方向,确定是哪端慢 |
| Zero Window Probe | 发送方按协议探测对方是否能收 | 属正常机制,不是故障本身 |
| Zero Window Update | 接收方腾出空间重新通告窗口 | 与首次零窗口的时间差就是应用停顿的时长 |
| 窗口很小但不为 0 | 接收缓冲区接近耗尽 | 同样指向消费端压力,只是尚未完全停发 |
| 伴随重传 | 停发后恢复时的正常补偿 | 不要误判成网络丢包 |
零窗口是接收侧压力信号,追查方向应是接收端应用(慢查询、锁等待、单线程处理、GC 停顿),而不是先去换网线或调网卡参数。