Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python nbns数据包';s发送速率_Python_Performance_Scapy - Fatal编程技术网

Python nbns数据包';s发送速率

Python nbns数据包';s发送速率,python,performance,scapy,Python,Performance,Scapy,大家好,首先这是我关于StackOverflow的第一篇帖子\o/ 嗯,为了我的工作,我必须建立一个“nbnsStrom”脚本来研究他在FWs上的表现。 一个原始的(编译的)病毒以25000包/秒的速度发送,而我的病毒费力地达到了1000包/秒。我尝试了多线程,但我的CPU已经在100%与我的原始脚本。 我是否需要将脚本移植到C语言中,或者我错过了python性能方面的一些东西 我的主要功能 def main(): packets_sent = 0 c_range = ip_ranges()

大家好,首先这是我关于StackOverflow的第一篇帖子\o/

嗯,为了我的工作,我必须建立一个“nbnsStrom”脚本来研究他在FWs上的表现。 一个原始的(编译的)病毒以25000包/秒的速度发送,而我的病毒费力地达到了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"

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

sr函数系列代表,因此循环在发送每个数据包后等待响应。如果您只是对发送数据包感兴趣,请使用以下选项之一

另一个错误是创建第2层数据包并试图通过第3层函数发送它。在
send
sendp
sr
srp
之间

此外,我建议预先计算数据包,只调用
scapy
的函数一次(它的大多数函数都接受数据包列表)

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

一些额外注意事项:

  • 有关
    scapy
    功能的更详细文档,请参阅
  • 用于对函数性能进行基准测试
编辑-@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

谢谢你的回答。关于sr,我尝试了所有的scapy发送功能,sr是我最后一次尝试;我贴在我的帖子上的那个。不管怎么说,我没想过要给你一份名单。通过这种方式,“packet[IP].dst=IP然后重新发送”并不需要资源。此外,我将调查没有临时文件的sendpfast。@mtthnn,我已经编辑了我的响应。请检查并尝试调用
sendp
(而不是
send
)一次(不在循环内),然后再返回到进一步优化代码。