Scapy работает медленно, потому что это чистый питон, анализирующий весь пакет в пользовательском пространстве ... обойти ограничения производительности scapy - не так уж и необычно.
Сравнивая яблоки с яблоками ... У меня есть Xeon-сервер с прямым гигабитным Ethernet-каналом в Интернет, но мой трафик очень слабый. Когда я запускаю обычный эхо-запрос к маршрутизатору Cisco, к которому он подключен, я получаю в среднем около 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 почти в 4000 раз больше, чем базовый пинг из командной строки bash (245,469 / 0,062) ... Я сам проложил кабель, это меньше десяти футов кабеля до маршрутизатора Cisco.
Что вы можете сделать, чтобы добиться лучших результатов? Как упоминалось в комментариях, посмотрите на sent_time
и _4 _... Packet.time
заполняется перед синтаксическим анализом ... это все еще медленнее, чем пинг из оболочки, но может помочь с вашим желанием захватывать пакеты в 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
медленнее по сравнению с вызовом оболочки ...
>>> 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 оболочки) для дальнейшей scapy
обработки, создайте tcpdump -c <num-packets> -w <filename> icmp and host <host-addr> &
перед запуском ping CLI ... затем используйте scapy's _ 14_, чтобы прочитать файл pcap из tcpdump
. Обязательно правильно рассчитайте количество пакетов, которые вы захватите в свой файл pcap.
person
This
schedule
01.11.2012
time.clock()
вместоtime.time()
. - person Nathan Villaescusa   schedule 31.10.2012srp1
вместоsrp
. - person Nathan Villaescusa   schedule 31.10.2012