winpcap/libpcap против необработанных сокетов

Я начал проект, который требует использования пакетов сетевого уровня, таких как пакеты IP/ICMP/UDP/TCP.

Есть два основных подхода к этому: необработанные сокеты и Winpcap/libpcap.

Я знаю, что pcap устанавливает драйвер в ОС и позволяет программисту захватывать и отправлять пакеты. С другой стороны, есть необработанные сокеты, которые имеют некоторые ограничения в Windows 7 или выше.

Проекту необходимо отправить несколько пакетов IP/ICMP/UDP/TCP на маршрутизатор и проанализировать ответы, такие как IP-Identifier, TTL, ... . Также я хочу, чтобы он работал в Linux и Windows.

Можете ли вы привести сравнение этих двух подходов?


person masoud    schedule 20.02.2012    source источник
comment
Недостаточно для ответа, но необработанные сокеты недоступно в несерверных версиях Windows после XP SP2 (при определенных условиях), а не только в Windows 7.   -  person Scott Chamberlain    schedule 21.02.2012
comment
На самом деле я не знаю, может ли драйвер pcap отправлять данные, я думал, что он может только захватывать. Использование серверной ОС для Windows может быть требованием для возможности передачи пакетов. Это связано с тем, что вредоносные программы так долго злоупотребляли этим, что отключили его для всех, кроме серверов (поскольку конечному пользователю никогда не нужно подделывать необработанные пакеты).   -  person Scott Chamberlain    schedule 21.02.2012


Ответы (2)


Если вы хотите, чтобы код был переносимым, вы не можете использовать API необработанных сокетов (который сильно отличается в Linux и Windows). Winpcap, как правило, совместим с libpcap, а API pcap в целом разумен, учитывая то, что он делает.

person bdow    schedule 20.02.2012

в вашей ситуации сокеты RAW будут работать, но вы должны сделать что-то вроде sock_raw_tcp = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); sock_raw_udp = socket(AF_INET , SOCK_RAW , IPPROTO_UDP); sock_raw_icmp = socket(AF_INET , SOCK_RAW , IPPROTO_ICMP);

У вас нет такой опции, как IP_PROTO_IP. Теперь с сокетами RAW вы получите только заголовки IP + заголовки транспортного уровня, но не заголовки Ethernet. Итак, если вас интересуют только данные прикладного уровня и вы хотите использовать IP-заголовок для Ipaddress и TTL, а также транспортный заголовок для номеров портов и т. д., тогда все в порядке. Имейте в виду, что для TCP вам, возможно, придется выполнять контрольные суммы и повторную сборку. Для UDP также потребуются некоторые контрольные суммы.

Тем не менее, winpcap решает для вас многие проблемы управления, поскольку он использует драйвер устройства для подключения уровня канала передачи данных вашей сетевой карты ИЛИ уровня 2. Здесь вы также получите кадр Ethernet и вам не придется открывать различные типы сокетов RAW. Вам по-прежнему придется применять связанную с приложением логику работы с пакетами, как если бы вы делали это на сетевом уровне (уровень 3).

person Ashley    schedule 03.10.2013
comment
Если вы используете JAVA, вы можете использовать JPCAP для уровня 2 ИЛИ, если вы хотите использовать уровень 3, вы можете использовать библиотеку исходных сокетов savarese для захвата необработанных пакетов вместе с виртуальными службами savarese TCP IP для манипулирования данными. Однако еще одним преимуществом использования JPCAP является возможность получения MAC-адресов источника и получателя из заголовков Ethernet. С другой стороны, виртуальные сервисы savarese имеют преимущество более совершенного API с точки зрения, скажем, вычисления контрольной суммы TCP, чего нет в JPCAP. Для jpcap используйте библиотеку Keita Fuji, так как в ней нет утечек памяти. - person Ashley; 03.10.2013
comment
На самом деле вы можете использовать их оба вместе. - person Ashley; 03.10.2013