Scapy는 순수한 파이썬이 사용자 공간에서 전체 패킷을 구문 분석하기 때문에 느립니다 ... it is not all that unusual to hack around scapy's thoughput limitations.
사과와 사과 비교하기 ... 저는 인터넷에 직접 연결되는 이더넷 파이프가있는 제온 서버를 가지고 있지만 트래픽은 매우 가볍습니다. 나는 그것이, 내가 약 60 마이크로 초마다 평균 있어요에 붙어 시스코 라우터에 정상적인 핑 ... scapy ... 또한 밀리 초 단위로 측정에서
[[email protected] ~]$ 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
[[email protected] ~]$
같은 대상을 ... 실행하면
[[email protected] ~]$ sudo python new_ping_ip.py
Ping: 0.285587072372
Ping: 0.230889797211
Ping: 0.219928979874
AVERAGE 245.468616486
[[email protected] ~]$
Scapy의 결과는 거의 배시 프롬프트 (245.469/0.062)의 기본 핑보다 큽니다 ... 케이블을 직접 연결 했으므로 Cisco 라우터의 케이블 길이는 10 피트 미만입니다.
더 나은 결과를 얻으려면 어떻게해야합니까? 주석에서 언급했듯이, sent_time
과 time
... Packet.time
은 구문 분석 전에 채워집니다 ... 이것은 여전히 쉘의 ping보다 느리지 만 scapy에서 패킷을 캡처하려는 욕망에 도움이 될 수 있습니다.
[[email protected] ~]$ sudo python ping_ip.py
Ping: 0.000389099121094
Ping: 0.000531911849976
Ping: 0.000631093978882
TOTAL 0.51736831665
[[email protected] ~]$
심지어
Packet.time
및
Packet.sent_time
비록 쉘 호출에 비해 느린 사용하여 샘플을 실행
#! /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
...
>>> 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 핑의 요약 출력을 제공 개별 핑이 인쇄되지 않았다.
당신이 나중에 scapy
처리 (쉘 핑 (ping) 호출을 통해) 핑 패킷을 캡처하여 CLI 핑을 실행하기 전에 tcpdump -c <num-packets> -w <filename> icmp and host <host-addr> &
를 생성하려면
... 다음
tcpdump
에서 PCAP 파일을 읽을 수 scapy의
rdpcap()
를 사용합니다. pcap 파일에 캡처 할 패킷 수를 올바르게 계산하십시오.
'time.time()'대신'time.clock()'을 사용하면 더 운이 좋을 것입니다. –
'srp' 대신'srp1'을 사용하면 더 잘 작동 할 수도 있습니다. –
Nathan, 당신이 scapy에서하는 일은 대단히 느립니다 ... scapy는 파이썬에서 전체 패킷을 (사용자 공간에서) 파싱합니다. OS 시스템 호출을 사용하는 C 구현과 경쟁 할 수 없습니다. –