使用Scapy灵活生成流量
我知道像这样的问题之前已经问过很多次了,但我觉得我的情况有点不同。
我正在尝试用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()放到循环里面就会大幅降低速度,这说明实际上是数据包的构建过程耗时。