流级取消与连接级错误
HTTP/2 把请求拆成多个并发流,出错时可以只终止一个流而不影响整条连接,这就是 RST_STREAM 帧的作用:它携带错误码说明取消原因,例如取消、拒绝服务等。它与 TCP 的重置报文是两回事——前者是应用层流级动作,后者是传输层连接级动作。排障时最需要避免的错误就是看到流量中断就按连接级故障处理,实际上其他流可能一直运行正常。
基本信息
| 适用平台 | Wireshark / tshark 解析的 HTTP/2 流量 |
|---|---|
| 帧过滤 | http2.type == 3(RST_STREAM 帧) |
| 错误码字段 | http2.rst_stream.error |
| 连接级信号 | GOAWAY 帧代表整条连接即将关闭 |
典型使用场景
- 页面部分资源加载失败而其他正常,确认是否为流级取消
- 排查服务端主动拒绝某些请求的原因
- 区分客户端主动放弃与服务端故障两类现象
- 验证负载均衡或代理是否正确支持多路复用
- 为前端错误上报寻找网络侧对应证据
- 确认服务端优雅下线时的连接级通知行为
过滤与判读
过滤与判读
http2.type == 3 # RST_STREAM 帧
http2.type == 7 # GOAWAY 帧(连接级)
http2.rst_stream.error # 错误码取值
# 客户端主动取消常见于超时或页面离开,未必是故障
# 服务端拒绝通常伴随策略或限流信息
# 出现 GOAWAY 说明是连接级处置,需与流级取消分开对待帧与错误码读法
| 观察项 | 含义 | 判读方向 |
|---|---|---|
| RST_STREAM 帧 | 单个流被终止 | 其余流继续运行,属局部问题 |
| 流错误码 | 取消原因分类 | 按取值区分主动取消与拒绝 |
| GOAWAY 帧 | 整条连接即将关闭 | 多为服务端下线或重启信号 |
| 受影响流数量 | 取消范围 | 单流与多流同时取消含义不同 |
不同协议版本实现下错误码取值需要按版本核对,抓包工具会直接给出解码后的名称,以工具显示为准。
客户端主动取消往往出现在用户离开页面或等待超时之后,这类取消不应计入服务端故障率。