使用 scapy 灵活生成流量

发布于 2024-12-05 09:44:55 字数 194 浏览 1 评论 0原文

我知道类似的问题以前已经被问过很多次了,但我认为这有细微的不同。

我正在尝试使用 scapy 在 Python 中编写一个灵活的流量生成器。生成数据包没问题,但当以足够快的速率发送流量时(根据我的需要,每秒 500-700 个数据包),我似乎在 20-30 pps 左右遇到了瓶颈。

我相信可能需要一些线程,或者我是否错过了一些更简单的东西?

I know questions like this have been asked plenty of times before, but I think this is subtley different.

I am attempting to write a flexible traffic generator in Python using scapy. Producing the packet is fine, but when it comes to sending traffic at a sufficiently fast rate (for my needs, somewhere in the range of 500-700 packets per second), I seem to have hit a wall at around 20-30 pps.

I believe that there may be some need for threading, or am I missing something easier?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

余生再见 2024-12-12 09:44:55

在我的系统上,与使用 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() 移到循环中会大大降低速度,这表明实际的数据包构建需要时间。

On my system I get much better performance sending ethernet frames with sendp compared to sending IP packets using send.

# 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)

But sending (precreated) packet on the socket manually is way faster:

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)

But moving the pe.build() into the loop drastically reduces speed, hinting that it is the actual packet building that takes time.

终难愈 2024-12-12 09:44:55

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)

会做:-)

FTR, while the above answer is correct, it can also be implemented at level 2 using a Scapy socket:

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

Though if sending packets in loop is your objective:

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

Will do :-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文