2014-09-23 15 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