Третий компьютер захватывает, модифицирует и вводит пакеты с помощью libpcap до того, как компьютер dst получит пакеты от компьютера src.

Я новичок в libpcap. Прямо сейчас я пишу программу C для захвата, изменения и внедрения пакетов. У меня есть три компьютера: A, B, C. A отправляет ENIP-пакеты на B с интервалом 10 мс. C перехватывает пакеты, отправленные A, и модифицирует пакеты путем: 1) увеличения бита последовательности на 1; 2) изменение полезной нагрузки. Например, A отправляет пакеты с seq = 1. C перехватывает этот пакет, изменяет его бит seq на 2, изменяет полезную нагрузку и вводит ее в сеть. Я надеюсь, что компьютер B сможет получить этот пакет, отправленный C, прежде чем получит пакет с seq = 2, отправленный A.

Моя программа c использует pcap_loop для захвата пакетов и pcap_inject для внедрения пакета. Этот процесс занимает всего несколько микросекунд. Однако B не мог получить пакеты, отправленные C, до получения пакетов, отправленных B. Что я наблюдал на компьютере B, так это то, что B получает несколько пакетов, отправленных A (например, с seq = 1,2,3,... 30), затем B получает несколько пакетов, отправленных C (seq = 2,3,4,...,31), затем пакеты, отправленные A (seq = 31,32,...90), затем пакеты, отправленные C (seq = 32,...91)...

Если я изменю интервал A на 1 секунду, этой проблемы не будет...

Я думаю, может быть, есть какое-то время прерывания для pcap_loop? Может, pcap_loop перехватывает пакеты 0,5 секунды и потом пачкой отправляет их в сеть? Я не уверена...


person user3882944    schedule 28.07.2014    source источник


Ответы (1)


В некоторых операционных системах механизм захвата пакетов, используемый libpcap, осуществляет пакетную обработку. Вместо того, чтобы доставлять каждый пакет по мере его поступления, он собирает пакеты до тех пор, пока буфер пакетов в ядре не заполнится или не истечет время таймера, после чего он доставляет весь буфер пакетов, чтобы было меньше переключений контекста и меньше системных вызовов.

Это означает, что будет задержка между поступлением пакета и его доставкой на pcap_loop(); это нормально для захвата пакетов (особенно для захвата больших объемов пакетов, когда пакетная обработка может снизить нагрузку на ЦП при захвате и, таким образом, вероятность того, что пакеты будут отброшены), но не подходит для приложений «реального времени», когда приложение хочет чтобы увидеть пакет, как только он прибудет.

В новых версиях libpcap есть вызов pcap_set_immediate_mode(); если вы используете pcap_create() и pcap_activate() вместо pcap_open_live() и устанавливаете «немедленный режим», вызывая pcap_set_immediate_mode() на pcap_t со вторым аргументом 1, между вызовами pcap_create() и pcap_activate(), буферизация не будет выполняться - пакеты будут доставлены, как только они прибывают.

В более старых версиях libpcap вы могли либо установить тайм-аут на очень маленькое значение (1 миллисекунда), либо, на некоторых платформах, установить «немедленный режим» на некоторых платформах в зависимости от платформы. (Нам нужно знать используемую вами ОС и используемую версию libpcap, чтобы указать, можно ли это сделать и как это сделать.)

person Community    schedule 28.07.2014
comment
Большое спасибо! Я попробую это позже. =) - person user3882944; 31.07.2014