我知道这样的问题之前已被问过很多次,但我认为这是微妙的不同。
我正在尝试使用scapy在Python中编写灵活的流量生成器。生成数据包很好,但是当以足够快的速度发送流量时(根据我的需要,在每秒500-700个数据包的范围内),我似乎已经达到了大约20-30 pps的速度。
我认为可能需要线程化,或者我更容易丢失一些东西?
答案 0 :(得分:6)
在我的系统上,与使用send发送IP数据包相比,使用sendp发送以太网帧的性能要好得多。
# 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()移动到循环中会大大降低速度,暗示这是实际的数据包构建需要时间。
答案 1 :(得分:0)
FTR,虽然上面的答案是正确的,但也可以使用Scapy套接字在2级实现:
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)
会做:-)