使用Scapy灵活生成流量

4 投票
2 回答
13062 浏览
提问于 2025-04-17 02:41

我知道像这样的问题之前已经问过很多次了,但我觉得我的情况有点不同。

我正在尝试用Python和scapy写一个灵活的流量生成器。生成数据包没问题,但当我想以足够快的速度发送流量时(对我来说,大约需要每秒发送500到700个数据包),我似乎遇到了瓶颈,最多只能达到每秒20到30个数据包。

我觉得可能需要用到线程,或者我是不是漏掉了什么更简单的方法呢?

2 个回答

0

顺便说一下,虽然上面的回答是对的,但也可以通过使用Scapy套接字在第二层实现:

from scapy.all import *
sock = conf.L2socket()
pe=Ether()/IP(dst="10.13.37.218")/ICMP()
data = pe.build()
while True:
    pe.send(data)

不过如果你的目标是循环发送数据包的话:

send(Ether()/IP(dst="10.13.37.218")/ICMP(), loop=1)

好的,明白了 :-)

7

在我的系统上,用sendp发送以太网帧的性能比用send发送IP数据包要好得多。

# this gives appox 500pps on my system
pe=Ether()/IP(dst="10.13.37.218")/ICMP()
sendp(pe, loop=True)

# this gives approx 100pps on my system
pi=IP(dst="10.13.37.218")/ICMP()
send(pi, loop=True)

不过,手动在套接字上发送(预先创建好的)数据包要快得多:

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
s.bind(("eth0", 0))
pe=Ether()/IP(dst="10.13.37.218")/ICMP()
data = pe.build()
while True:
    s.send(data)

但是把pe.build()放到循环里面就会大幅降低速度,这说明实际上是数据包的构建过程耗时。

撰写回答