如何从Scapy的traceroute功能中获取正确的latency值?
如何从Scapy的traceroute功能中获取正确的latency值?
嘿,刚接触Python和Scapy完全不用慌!你遇到的问题其实很常见:你直接用的answer_packet.time只是数据包被Scapy接收的时间戳(从epoch开始计算的秒数),并不是你要的往返延迟(RTT)。而且延迟并不是网络数据包本身携带的字段,它是Scapy给每个数据包附加的元数据,所以用.show()看不到它很正常~
正确的延迟获取方式
Scapy会给发送的数据包(也就是你的query_packet)添加一个sent_time属性,记录数据包发出的时间戳。你只需要用接收时间减去发送时间,就能得到这个跳数的真实延迟了!
这里是调整后的完整代码,我加了新手友好的注释,还处理了可能的无响应、多回复场景:
from scapy.all import traceroute def perform_traceroute(target): # 执行traceroute,maxttl是最大探测跳数,verbose控制控制台输出细节 result, unanswered = traceroute(target, maxttl=50, verbose=True) # 遍历所有跳数的结果,result.res是存储(发送包, 接收包)对的列表 for snd_pkt, rcv_pkts in result.res: hop_number = snd_pkt.ttl # 部分路由节点可能返回多个ICMP回复(比如负载均衡场景) if isinstance(rcv_pkts, list): for rcv_pkt in rcv_pkts: if rcv_pkt: # 计算延迟:接收时间 - 发送时间,转成毫秒更易读 latency = (rcv_pkt.time - snd_pkt.sent_time) * 1000 hop_ip = rcv_pkt.src print(f"Hop {hop_number}: {hop_ip} | 延迟: {latency:.2f} ms") else: if rcv_pkts: latency = (rcv_pkts.time - snd_pkt.sent_time) * 1000 hop_ip = rcv_pkts.src print(f"Hop {hop_number}: {hop_ip} | 延迟: {latency:.2f} ms") else: print(f"Hop {hop_number}: 无响应") targets = ["101.191.135.146"] # 可以取消注释添加更多目标:# , "131.100.187.189", "100.42.240.1" perform_traceroute(targets)
几个关键细节补充
- 为什么用
result.res?:result本身是TracerouteResult对象,它的res属性才是真正存储所有发送/接收数据包对的列表,比直接遍历result更准确。 - 权限问题:运行Scapy的traceroute通常需要root权限(比如Linux下用
sudo python3 your_script.py),否则可能无法发送数据包或得到不完整结果。 - 延迟格式化:计算出的差值是秒,乘以1000转成毫秒后,用
:.2f保留两位小数,输出会更直观。
备注:内容来源于stack exchange,提问作者Wayne McNicol




