You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从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.resresult本身是TracerouteResult对象,它的res属性才是真正存储所有发送/接收数据包对的列表,比直接遍历result更准确。
  • 权限问题:运行Scapy的traceroute通常需要root权限(比如Linux下用sudo python3 your_script.py),否则可能无法发送数据包或得到不完整结果。
  • 延迟格式化:计算出的差值是秒,乘以1000转成毫秒后,用:.2f保留两位小数,输出会更直观。

备注:内容来源于stack exchange,提问作者Wayne McNicol

火山引擎 最新活动