winpcap / libpcap против сырых сокетов - PullRequest
2 голосов
/ 21 февраля 2012

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

Существует два основных подхода к решению этой проблемы: необработанные сокеты и Winpcap / libpcap.

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

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

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

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

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

0 голосов
/ 03 октября 2013

в вашей ситуации, 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).

...