首页/网络/抓包与流量分析速查/TCP 事件与 HTTP/2 请求关联
TCP 流分析82 条

TCP 事件与 HTTP/2 请求关联

HTTP/2 多请求共享一条 TCP:把 tcp.analysis 事件与 http2.streamid 对照,才能回答"哪个请求受到了重传/乱序影响"。

为什么要把 TCP 事件落到请求上

HTTP/2 把多个请求复用在一条 TCP 连接上,连接级的重传、乱序、窗口收缩会同时影响这条连接上的所有流。只看连接层指标,只能说「这条连接有问题」,回答不了「哪个请求被影响了」。把 tcp.analysis 事件与 http2.streamid 联合过滤,才能把连接级异常落到具体请求,给出可执行的结论。

基本信息

联合维度tcp.stream 定位连接,http2.streamid 定位该连接上的请求
连接级字段tcp.analysis.* 系列,如重传、重复确认、乱序、零窗
流级字段http2.streamid、http2.headers.* 头部字段
过滤写法两个条件用 && 组合,互不干扰
前提条件加密流量需解密后才能看到 HTTP/2 层字段
注意事项HTTP/2 流窗口与 TCP 窗口两套机制要分别看

典型使用场景

  • 慢请求归因:区分是服务端处理慢,还是同连接上的邻居流把带宽与窗口吃掉了
  • 丢包影响面评估:重传发生后,确认同连接上有哪些请求的响应被推迟
  • 并发上限核对:观察同一连接上的流数量是否长期贴近服务端设置的上限
  • 取消与中断:把 RST_STREAM 与连接的 RST 区分开,判断是上层取消还是连接被断
  • 压测复盘:连接级异常与流级耗时的分布放到同一张表里对照

组合过滤

组合过滤
tshark -r a.pcap -Y 'tcp.stream == 7 && tcp.analysis.flags' -T fields -e frame.number -e _ws.col.info
tshark -r a.pcap -Y 'tcp.stream == 7 && http2.streamid == 5' -V | head -80
tshark -r a.pcap -Y 'tcp.stream == 7 && http2.headers.authority contains "api"' -T fields -e http2.streamid
tshark -r a.pcap -Y 'tcp.stream == 7 && http2.type == 3' -T fields -e frame.number   # 该连接上的复位流

组合过滤对照

过滤条件回答的问题判读提示
tcp.stream == 7这条连接发生了什么先看连接级异常总量
tcp.stream == 7 && http2.streamid == 5这个请求的帧交互细节看请求到响应的帧序列与耗时
... && tcp.analysis.flags异常落在哪些帧上与请求的帧区间对照定位影响范围
... && http2.type == 3哪些请求被主动取消区分客户端取消与服务端拒绝
... && http2.headers.authority contains按域名挑出请求确认问题集中在哪个后端
HTTP/2 的流级窗口更新与 TCP 的接收窗口是两个独立机制,同一个请求可能被其中任一层限速;两层都要看,只查一层容易把背压来源判错。
加密流量必须先解密才能使用这些字段;只解出 TLS 明文但未让 Wireshark 正确关联协议时,帧仍会显示为普通 TCP 载荷,需要检查解密配置与端口映射。

易错点

  • 用连接级指标给单个请求定责:同连接上所有请求共享拥塞影响,「某请求偶发慢」很可能是邻居流造成的
  • 看到 RST 就判断连接被断:HTTP/2 里的 RST_STREAM 只取消一条流,与整连接的复位含义完全不同
  • 在未解密流量上尝试按 streamid 过滤,结果为空后误判为没有 HTTP/2 流量
  • 只关注单条连接而忽略客户端同时开了多条连接,整体延迟由多条连接共同决定,单连接结论无法解释全局

数据来源与参考

  • RFC 9113(HTTP/2 流与连接)
  • Wireshark User's Guide
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌