Удаляет ли recv пакеты из буфера pcaps? - PullRequest
4 голосов
/ 24 февраля 2011

Скажем, на компьютере запущены две программы (для простоты, единственные пользовательские программы, работающие на linux), одна из которых вызывает recv (), а другая использует pcap для обнаружения входящих пакетов.Пакет приходит, и он обнаруживается как программой, использующей pcap, так и программой, использующей recv.Но есть ли какой-либо случай (например, recv (), возвращающийся между вызовами pcap_next ()), в котором один из этих двух не получит пакет?

Я действительно не понимаю, как здесь работает система буферизацииИтак, чем более подробное объяснение, тем лучше - есть ли возможный случай, когда одна из этих программ увидит пакет, а другая - нет?И если да, что это такое и как я могу предотвратить это?

1 Ответ

2 голосов
/ 24 февраля 2011

AFAIK, существуют случаи, когда один получал данные, а другой - нет (в обе стороны). Вполне возможно, что я неправильно понял некоторые детали, но я уверен, что кто-то меня поправит.

Pcap использует различные механизмы для прослушивания интерфейсов, но вот как работает общий случай:

  • Сетевая карта получает пакет (водитель получает уведомление через прерывание)
  • Ядро помещает этот пакет в соответствующие очереди прослушивания: например,
    • Стек TCP.
    • Драйвер моста, если интерфейс соединен мостом.
    • Интерфейс, который использует PCAP (необработанное сокетное соединение).
  • Эти буферы сбрасываются независимо друг от друга:
    • Как собираются потоки TCP и данные передаются в процессы.
    • Поскольку мост отправляет пакет в соответствующие подключенные интерфейсы.
    • Как PCAP читает полученные пакеты.

Я полагаю, что нет жесткого способа гарантировать, что обе программы получат оба пакета. Это потребует блокировки буфера, когда он заполнен (и это может привести к голоданию, тупику, всевозможным проблемам). Это может быть возможно с межсоединениями, отличными от Ethernet, но общая философия - это лучшее из возможного.

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

Если вам нужны жесткие гарантии, я думаю, что нужна более мощная модель сети. Я слышал замечательные вещи о Netgraph для такого рода задач. Вы также можете просто установить физическую коробку, которая проверяет пакеты (самая трудная гарантия, которую вы можете получить).

...