Гибкая генерация трафика с помощью scapy

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

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

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


person DiscoTroy    schedule 20.09.2011    source источник
comment
Что это за платформа? Linux/osx/win/что-то еще?   -  person Anders Waldenborg    schedule 20.09.2011
comment
Андерс, мои извинения, я должен был сказать. Это приложение предназначено для использования в Linux, но я думал, что scapy не зависит от платформы.   -  person DiscoTroy    schedule 20.09.2011
comment
Да, так и должно быть, но внутренняя фактическая отправка пакетов, скорее всего, различается между платформами.   -  person Anders Waldenborg    schedule 23.09.2011


Ответы (2)


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

person Anders Waldenborg    schedule 23.09.2011
comment
Как вы рассчитываете (или оцениваете) PPS? - person stillanoob; 12.04.2018

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)

Сделаю :-)

person Cukic0d    schedule 13.07.2019