Scapy如何获得PING时间



我正在尝试编写一个SCAPY脚本,该脚本可以使PING时间平均,因此我需要在发送的ICMP Echo/回复数据包和收到回复数据包之间获得时间。现在,我有:

#! /usr/bin/env python
from scapy.all import *
from time import *
def QoS_ping(host, count=3):
  packet = Ether()/IP(dst=host)/ICMP()
  t=0.0
  for x in range(count):
      t1=time()
      ans=srp(packet,iface="eth0", verbose=0)
      t2=time()
      t+=t2-t1
  return (t/count)*1000

问题是,使用time()函数并不能增长良好的结果。例如,我在一个域上找到134毫秒,并且在同一域上的ping系统功能,我找到了30 ms(当然是平均)。

我的问题是:有没有一种方法可以使已发送的数据包和通过Scapy接收到的数据包的确切时间?我不想使用popen()函数或其他系统调用,因为我需要用于未来数据包管理的Scapy。

有没有一种方法可以使已发送的数据包和通过Scapy接收到的数据包的确切时间?

您可以使用pak.timepak.sent_time

我修改了您的脚本以使用它们...

import statistics
import os
from scapy.all import Ether, IP, ICMP, srp
if os.geteuid() > 0:
    raise OSError("This script must run as root")
ping_rtt_list = list()
def ping_addr(host, count=3):
    packet = Ether()/IP(dst=host)/ICMP()
    t=0.0
    for x in range(count):
        x += 1  # Start with x = 1 (not zero)
        ans, unans = srp(packet, iface="eth0", filter='icmp', verbose=0)
        rx = ans[0][1]
        tx = ans[0][0]
        delta = rx.time - tx.sent_time
        print("ping #{0} rtt: {1} second".format(x, round(delta, 6)))
        ping_rtt_list.append(round(delta, 6))
    return ping_rtt_list
if __name__=="__main__":
    ping_rtt_list = ping_addr('172.16.15.1')
    rtt_avg = round(statistics.mean(ping_rtt_list), 6)
    print("Avg ping rtt (seconds):", rtt_avg)

一个示例运行:

$ sudo /opt/virtual_env/py37_test/bin/python ./ping_w_scapy.py
ping #1 rtt: 0.002019 second
ping #2 rtt: 0.002347 second
ping #3 rtt: 0.001807 second
Avg ping rtt (seconds): 0.002058

btw,使用未封闭的python(python -u启动它)提高了时间准确性,因为Python不在等待缓冲区决定转储。使用您的上面脚本,它将我的结果从0.4 ms的关闭变为0.1-ish。

Mike,只是一个小修复,以获取平均时间,更改:

print "Average %0.3f" % float(match.group(1))

to:

 print "Average %0.3f" % float(match.group(2))

由于(match.group(1))将获得最小时间,而不是如上所述的AVG。

最新更新