2014-09-23 16 views
-1

大家好,首先这是我在计算器上的第一篇文章\ O/Python的NBNS数据包的发送速率

嗯,我的工作,我要建立一个“nbnsStrom”的剧本,研究他的FWS comportement 。 原始(编译后的)病毒以25 000个数据包/秒的速度发送,当我们辛苦地达到1000个数据包/秒时。我尝试使用多线程,但我的CPU已经100%与我的原始脚本。 我是否需要在C中移植我的脚本,否则我错过了使用python性能的东西。

我的主要功能

def main(): 
packets_sent = 0 
c_range = ip_ranges() #return a list 
packet = Ether()/ IP()/UDP(sport=137,dport=137,len=58)/NBNSQueryRequest(FLAGS=0x0110, QUESTION_NAME='WPAD') 
start_time = time.time() 
for ip in c_range: 
    packet[IP].dst = ip 
    sr1(packet, verbose=False) 
    packets_sent +=1 
timer = time.time() - start_time 
print "ratio : "+` packets_sent/timer`+" p/s" 

感谢您的阅读,请原谅我的英语是不是我的母语,干杯!

回答

0

sr函数族代表send and receive,因此您的循环在发送每个数据包后等待响应。如果您只想发送数据包,请使用send functions之一。

另一个错误是创建第2层数据包并尝试通过第3层功能发送它。 Note the differencesendsendpsrsrp之间。此外,我建议事先计算数据包,并调用scapy的函数一次(大多数函数接受数据包列表)。

值得一提的sendpfast功能发送使用tcpreplay(这首先建立了一个被传递到tcpreplay临时pcap文件)的数据包。 Here is a related SO question,它试图通过绕过文件创建机制进一步提高其性能,但我不确定这与您的情况相关。

一些额外的注意事项:

  • 有关scapy的功能的更详细的文档看this
  • 使用timeit来测试功能性能。

编辑 - @mtthnn,关于你的评论,它不仅仅是在初始化每次循环迭代包多。这是在被调用的scapy函数内发生的未知启动和拆卸工具。为了说明这一点,请参阅一些基本测量:

def send1(c_range): 
    for ip in c_range: 
     packet = Ether()/ IP()/UDP(sport=137,dport=137,len=58)/NBNSQueryRequest(FLAGS=0x0110, QUESTION_NAME='WPAD') 
     packet[IP].dst = ip 
     scapy.all.sendp(packet, verbose = False) 

def send2(c_range): 
    packets = [] 
    for ip in c_range: 
     packet = Ether()/ IP()/UDP(sport=137,dport=137,len=58)/NBNSQueryRequest(FLAGS=0x0110, QUESTION_NAME='WPAD') 
     packet[IP].dst = ip 
     packets.append(packet) 
    scapy.all.sendp(packets, verbose = False) 

In [58]: timeit send1(ip_ranges()) 
1 loops, best of 3: 322 ms per loop 

In [59]: timeit send2(ip_ranges()) 
10 loops, best of 3: 45.2 ms per loop 
+0

谢谢回答。关于sr,我试过所有scapy发送函数,sr是我试过的最后一个;我粘贴到我的帖子。无论如何,我没有想过要发送一份清单。 通过“数据包[IP] .dst = ip然后重新发送”不是资源饥饿。 此外,我将调查没有临时文件的sendpfast。 – 2014-09-23 14:14:16

+0

@mtthnn,我编辑了我的回复。请回顾一下,并尝试调用'sendp'(而不是''send')一次(不在循环内部),然后再恢复以进一步优化代码。 – Yoel 2014-09-23 15:14:18

+0

非常感谢! 103020个数据包(9477840字节)在1.16秒内发送 – 2014-09-23 15:30:05