Python nbns数据包的发送速率

时间:2014-09-23 13:14:48

标签: python performance scapy

大家好,首先这是我在StackOverflow上的第一篇文章\ o /

嗯,对于我的工作,我必须建立一个" nbnsStrom"用脚本来研究他对FWs的反应。 原始(已编译)病毒以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"

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

1 个答案:

答案 0 :(得分:0)

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

另一个错误是创建第2层数据包并尝试通过第3层功能发送它。 sendsendpsrsrp之间的Note the difference

此外,我建议事先计算数据包并仅调用scapy的函数一次(其大部分函数接受数据包列表)。

值得一提的是使用tcpreplay发送数据包的sendpfast函数(这首先创建一个传递给pcap的临时tcpreplay文件。 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