如何从解密后的QUIC pcap文件被动计算ACK包的RTT?
被动计算QUIC协议ACK包RTT的方法
核心逻辑
QUIC的包编号按包编号空间(初始化空间、握手空间、应用数据空间)独立维护,并非全局统一序列。因此计算ACK的RTT时,需先匹配ACK帧所属的编号空间,再定位对应空间内被确认的数据包,最终计算时间差。
具体操作步骤
第一步:识别ACK帧及所属编号空间
在解密后的pcap中,筛选出包含ACK帧的QUIC包(Wireshark中可通过quic.frame_type == 0x02过滤),同时记录该包的quic.packet_number_space字段值——ACK帧仅会确认同一编号空间内的数据包。第二步:定位被确认的最大编号数据包
提取ACK帧中的quic.ack.largest_acknowledged值,在反向流量中(比如服务器端收到的ACK,对应客户端此前发送的数据包),筛选出相同编号空间且包编号等于该最大确认值的数据包。注:同一编号空间内的QUIC包编号是单调递增的,不会出现重复编号。
第三步:计算RTT
用ACK帧所在数据包的捕获时间,减去被确认数据包的捕获时间,所得差值即为该ACK对应的RTT。
工具层面的实现技巧
Wireshark手动分析
- 过滤出所有ACK帧:
quic.frame_type == 0x02 - 选中目标ACK包,查看
quic.packet_number_space和quic.ack.largest_acknowledged参数 - 用过滤器反向查找对应数据包:
quic.packet_number_space == [对应空间值] && quic.packet_number == [最大确认编号] - 对比两个包的
frame.time_epoch字段计算时间差
- 过滤出所有ACK帧:
tshark批量处理
先导出关键字段到文本,再用脚本关联计算:# 导出包时间、编号空间、包编号、帧类型字段 tshark -r your_decrypted.pcapng -T fields -e frame.time_epoch -e quic.packet_number_space -e quic.packet_number -e quic.frame_type > quic_rtt_data.txt编写Python/Shell脚本遍历文本,对每条ACK记录匹配对应编号空间的目标数据包,自动计算RTT。
注意事项
- 必须确保pcap已完全解密,否则无法正确解析QUIC帧和包编号字段
- 针对批量ACK(确认多个包),通常取最大确认编号对应的数据包计算RTT,这是QUIC标准的RTT采样方式
- 若存在丢包或重传,需排除重传包干扰,仅匹配首次发送的数据包
内容的提问来源于stack exchange,提问作者Ankit Kumar
相关产品推荐
相关产品推荐

