AFAIK, существуют случаи, когда один получал данные, а другой - нет (в обе стороны). Вполне возможно, что я неправильно понял некоторые детали, но я уверен, что кто-то меня поправит.
Pcap использует различные механизмы для прослушивания интерфейсов, но вот как работает общий случай:
- Сетевая карта получает пакет (водитель получает уведомление через прерывание)
- Ядро помещает этот пакет в соответствующие очереди прослушивания: например,
- Стек TCP.
- Драйвер моста, если интерфейс соединен мостом.
- Интерфейс, который использует PCAP (необработанное сокетное соединение).
- Эти буферы сбрасываются независимо друг от друга:
- Как собираются потоки TCP и данные передаются в процессы.
- Поскольку мост отправляет пакет в соответствующие подключенные интерфейсы.
- Как PCAP читает полученные пакеты.
Я полагаю, что нет жесткого способа гарантировать, что обе программы получат оба пакета. Это потребует блокировки буфера, когда он заполнен (и это может привести к голоданию, тупику, всевозможным проблемам). Это может быть возможно с межсоединениями, отличными от Ethernet, но общая философия - это лучшее из возможного.
Однако, если система не находится под большой нагрузкой, я бы сказал, что показатели потерь будут довольно низкими и что большинство пакетов будет получено всеми. Вы можете уменьшить риск потери, увеличив размеры буфера. Быстрый поиск в Google настроил на вверх, но я уверен, что есть еще миллион способов сделать это.
Если вам нужны жесткие гарантии, я думаю, что нужна более мощная модель сети. Я слышал замечательные вещи о Netgraph для такого рода задач. Вы также можете просто установить физическую коробку, которая проверяет пакеты (самая трудная гарантия, которую вы можете получить).