Tuesday, 8 December 2009

Juletip 8: Faster, Pussycat! Kill! Kill!

« Juletip 7: Vi sender sender sender pakker pakker pakker | Main | Juletip 9: Scapy sendpfast'er than anything else »

Ups, tiden flyver - og idag skete der andre ting som kom i vejen. Men jeg vil aligevel lige forsøge at smide et blogindlæg i pakkekalenderen.

Dagens indlæg omhandler hastighed, med en tam reference til Russ Meyer - men hastighed er nøgleordet idag. Jeg har forøvrigt set et par Russ Meyer film og de er sjove/underlige. Lidt ligesom Orgazmo.

De sidste par dage (undtagen igår :-( ) har vi jo snakket om pakker der blev lavet med python, og det er jo meget sjovt - men måske lidt for langsomt hvis man ikke tænker sig om. Alt efter formålet er der jo nogle gange man gerne vil have lidt smæk på, eksempelvis ligesom med ping -f:

hlk@bigfoot:network$ time sudo ping -f -c 10000 10.0.42.1 
PING 10.0.42.1 (10.0.42.1): 56 data bytes
..Request timeout for icmp_seq 7648
.
--- 10.0.42.1 ping statistics ---
10000 packets transmitted, 10000 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.603/0.867/19.408/0.544 ms
    8.10s real     0.06s user     0.58s system

Ping med -f option er Flood ping, og kræver derfor superuser rettigheder. Det er en nem måde at teste en forbindelse, hurtigt. Men hvad så med vores python programmer? 100 pings?

hlk@bigfoot:network$ time for i in `jot 100`^Jdo^Jsudo python icmpv4test-hlk.py ^Jdone 

Found Darwin
Ethernet
dst: 0:40:63:c9:f3:11
src: 0:23:6c:9a:f5:2c
type: 0x800
IPv4
version 4
hlen 5
tos 0
length 28
id 1234
flags 0
offset 0
ttl 64
protocol 1
checksum 0
src 10.0.42.95
dst 10.0.42.1
options []

ICMPv4 Echo Request
type 8
code 0
checksum 0

ICMPv4 Echo
id 37123
sequence 0
... 100 gange
    8.46s real     0.06s user     0.06s system

Ikke vildt vel? 100 pakker på 8 sekunder - yay! Men også vildt unfair, jeg slår lige print sætningerne fra:

hlk@bigfoot:network$ time for i in `jot 100`^Jdo^Jsudo python icmpv4test-hlk.py ^Jdone 
    7.93s real     0.04s user     0.06s system
hlk@bigfoot:network$ 

Det gav sgu ikke meget? Men hvis vi så ændrer python programmet til at have en løkke internt:

hlk@bigfoot:network$ cat icmpv4test-hlk.py 
#!/usr/bin/env python
...
		for i in range(1, 101):
			e = ethernet()
			e.type = 0x0800
			e.src = "\x00\x23\x6c\x9a\xf5\x2c"
			e.dst = "\x00\x40\x63\xc9\xf3\x11"
			e.type = 0x0800
...
hlk@bigfoot:network$ time sudo python icmpv4test-hlk.py  
    0.30s real     0.24s user     0.04s system

Aha, det gav bonus! Min maskine skal ikke starte python 100 gange! Man kan endda flytte løkken ned til der hvor pakken sendes - hvis applikationen ikke kræver pakken ændres mellem hver afsendelse.

hlk@bigfoot:network$ cat icmpv4test-hlk.py 
#!/usr/bin/env python
...
		packet.encode()
		output = PcapConnector(devname)
		for i in range(1, 101):
			n_out = output.write(packet.bytes, 42)
hlk@bigfoot:network$ time sudo python icmpv4test-hlk.py  
    0.09s real     0.05s user     0.04s system

Godt, det giver altså en meget bedre hastighed og vi kan altså godt lave mange pakker med python - lad os prøve med lad os sige 10000 pakker?

hlk@bigfoot:network$ cat icmpv4test-hlk.py 
#!/usr/bin/env python
...
		output = PcapConnector(devname)
		for i in range(1, 10001):
			n_out = output.write(packet.bytes, 42)

		print "Packets sent: "+ str(i)

hlk = hlktest()
hlk.test_icmpv4_ping()
 
hlk@bigfoot:network$ time sudo python icmpv4test-hlk.py  
Packets sent: 10000
    0.26s real     0.06s user     0.10s system

OK, nu er vi jo meget hurtigere end ping programmet var! Men vi udførte heller ikke samme arbejde, så lad os prøve at opdatere med et enkelt felt, ECHO pakkens id:

hlk@bigfoot:network$ cat icmpv4test-hlk.py 
#!/usr/bin/env python
...
		for i in range(1, 10001):
			echo.id = i
			packet = Chain([e, ip, icmp, echo])
			packet.calc_checksums()
			packet.encode()
			output = PcapConnector(devname)
			n_out = output.write(packet.bytes, 42)

		print "Packets sent: "+ str(i)

hlk = hlktest()
hlk.test_icmpv4_ping()
 

hlk@bigfoot:network$ time sudo python icmpv4test-hlk.py  
Packets sent: 10000
    8.66s real     7.50s user     1.02s system

Så hvad er konklusionen idag?
Jo, den er at

  • en 2.8GHz Intel Core 2 Duo med 1067MHz DDR3 kan fylde et wireless netværk op med pakker *duuuh*
  • Python med lidt omtanke kan på en sådan en svend med lidt omtanke producere lige så meget som ping -f

Faktisk overraskede det mig lidt at python programmet er så effektivt, men vores moderne CPU ER åbenbart ret kraftige ;-) Det kunne være sjovt at gentage eksperimentet med min Thinkpad X31 og gigabit Ethernet kortet - så kan det være det bliver nødvendigt med "pcap replay" programmer.

Posted by hlk at CET 16:12 08/12/2009 in Toolbox entries

 

[Trackback URL for this entry]

Your comment:

(not displayed)
 
 
 

Live Comment Preview:

 
« september »
mationtofr
  12345
6789101112
13141516171819
20212223242526
27282930