Гибкая генерация трафика со scapy - PullRequest
4 голосов
/ 20 сентября 2011

Я знаю, что подобные вопросы задавались много раз прежде, но я думаю, что это не так.

Я пытаюсь написать гибкий генератор трафика на Python, используя scapy.Создание пакета - это хорошо, но когда дело доходит до отправки трафика с достаточно высокой скоростью (для моих нужд, где-то в диапазоне 500–700 пакетов в секунду), я, кажется, столкнулся со скоростью около 20–30 pps.

Я полагаю, что может возникнуть необходимость в многопоточности, или я что-то упустил?

Ответы [ 2 ]

7 голосов
/ 23 сентября 2011

В моей системе я получаю намного лучшую производительность при отправке кадров Ethernet с помощью sendp по сравнению с отправкой IP-пакетов с помощью 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)

Но отправка (предварительно обработанный) пакета в сокет вручную происходит намного быстрее:

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 () в цикл резко снижает скорость, намекая на то, что для построения пакета требуется время.

0 голосов
/ 13 июля 2019

FTR, хотя приведенный выше ответ верен, его также можно реализовать на уровне 2 с использованием сокета 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)

Подойдет: -)

...