[英]Scapy how get ping time?
我正在嘗試編寫一個scapy腳本,它可以在ping時間上取平均值,因此我需要在發送的ICMP echo / reply數據包和收到的回復數據包之間得到時間。 現在,我有這個:
#! /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毫秒(當然是平均值)。
我的問題是:有沒有辦法通過scapy獲得發送的數據包和收到的數據包之間的確切時間? 我不想使用popen()函數或其他系統調用,因為我需要scapy來進行未來數據包管理。
Scapy很慢,因為它是純粹的python解析用戶空間中的整個數據包...... 圍繞scapy的輸出限制並不是那么不尋常 。
進行蘋果對蘋果比較...我有一個Xeon服務器,帶有直接的gig以太網管道到互聯網,但我的流量很輕。 當我對連接到的Cisco路由器運行正常ping時,我平均每個約60微秒......
[mpenning@Bucksnort ~]$ ping -W 1 -c 3 192.0.2.1
PING 192.0.2.1 (192.0.2.6) 56(84) bytes of data.
64 bytes from 192.0.2.1: icmp_req=1 ttl=64 time=0.078 ms
64 bytes from 192.0.2.1: icmp_req=2 ttl=64 time=0.062 ms
64 bytes from 192.0.2.1: icmp_req=3 ttl=64 time=0.062 ms
--- 192.0.2.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.062/0.067/0.078/0.010 ms
[mpenning@Bucksnort ~]$
scapy中的同一目的地...也以毫秒為單位測量......
[mpenning@Bucksnort ~]$ sudo python new_ping_ip.py
Ping: 0.285587072372
Ping: 0.230889797211
Ping: 0.219928979874
AVERAGE 245.468616486
[mpenning@Bucksnort ~]$
Scapy的結果比bash提示符(245.469 / 0.062)的基線ping大近4000倍......我自己運行了電纜,它距離Cisco路由器的電纜不到10英尺。
你能做些什么來獲得更好的結果? 正如評論中所提到的,看看sent_time
和time
...在解析之前填充了Packet.time
...這仍然比來自shell的ping慢,但可能有助於你想要在scapy中捕獲數據包。
#! /usr/bin/env python
from scapy.all import *
def QoS_ping(host, count=3):
packet = Ether()/IP(dst=host)/ICMP()
t=0.0
for x in range(count):
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:", delta
t+=delta
return (t/count)*1000
if __name__=="__main__":
total = QoS_ping('192.0.2.1')
print "TOTAL", total
樣品運行......
[mpenning@Bucksnort ~]$ sudo python ping_ip.py
Ping: 0.000389099121094
Ping: 0.000531911849976
Ping: 0.000631093978882
TOTAL 0.51736831665
[mpenning@Bucksnort ~]$
即使使用Packet.time
和Packet.sent_time
與shell調用相比也很慢......
>>> from subprocess import Popen, PIPE
>>> import re
>>> cmd = Popen('ping -q -c 3 192.0.2.1'.split(' '), stdout=PIPE)
>>> output = cmd.communicate()[0]
>>> match = re.search('(\d+\.\d+)\/(\d+\.\d+)\/(\d+\.\d+)\/(\d+\.\d+)\s+ms', output)
>>> if not (match is None):
... print "Average %0.3f" % float(match.group(1))
... else:
... print "Failure"
...
Average 0.073
>>>
ping -q -c 3
提供3個ping的摘要輸出,而不打印單個ping。
如果要捕獲ping數據包(通過shell ping調用)以便以后進行scapy
處理,請在運行CLI ping之前生成tcpdump -c <num-packets> -w <filename> icmp and host <host-addr> &
。然后使用scapy的rdpcap()
從tcpdump
讀取pcap文件。 請務必正確計算您將在pcap文件中捕獲的數據包數量。
順便說一句,使用unbuffered python(python -u啟動它)可以提高計時准確性,因為python不會等待緩沖區決定轉儲。 使用上面的腳本,它將我的結果從關閉0.4毫秒變為關閉0.1-ish。
邁克,為了獲得平均時間,只是一個小修補,改變:
print "Average %0.3f" % float(match.group(1))
至:
print "Average %0.3f" % float(match.group(2))
因為(match.group(1))將獲得最小時間而不是所提到的平均值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.