【问题标题】:Python nbns packet's send ratePython nbns数据包的发送速率
【发布时间】:2014-09-23 13:14:48
【问题描述】:

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

好吧,为了我的工作,我必须构建一个“nbnsStrom”脚本来研究他在 FW 上的表现。 一个原始(编译的)病毒以 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"

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

【问题讨论】:

    标签: python performance scapy


    【解决方案1】:

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

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

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

    值得一提的是sendpfast 函数,它使用tcpreplay 发送数据包(这首先会创建一个临时的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
    

    【讨论】:

    • 感谢您的回答。关于 sr,我尝试了所有 scapy 发送功能,而 sr 是我最后一次尝试的;我粘贴到我的帖子的那个。无论如何,我没想过要发一份清单。通过那个“packet[IP].dst = ip then resend”并不需要资源。此外,我将调查没有临时文件的 sendpfast。
    • @mtthnn,我已经编辑了我的回复。请查看它并尝试只调用一次sendp(不是send)(不在循环内),然后再进一步优化代码。
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2018-01-06
    相关资源
    最近更新 更多