我正在尝试编写一个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.time
和pak.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。