簡體   English   中英

Scapy如何獲得ping時間?

[英]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_timetime ...在解析之前填充了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.timePacket.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM