Как работает буферизация pcap unix? - PullRequest
11 голосов
/ 23 февраля 2011

Гипотетический сценарий: Поток пакетов udp поступает на компьютер X, на котором запущены две программы - одна для прослушивания пакетов с помощью recv (), а другая для pcap.

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

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

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

1 Ответ

8 голосов
/ 23 февраля 2011

случай Linux (BSD, вероятно, несколько похожи, используя mbuf s вместо skbuff s):

Linux использует skbuffs (буферы сокетов) для буферизации сетевых данных. У skbuff есть метаданные о некоторых сетевых данных и некоторые указатели на эти данные.

Taps (пользователи pcap) создают клоны skbuffs. Клон - это новый skbuff, но он указывает на те же данные. Когда кому-то нужно изменить данные, совместно используемые несколькими skbuffs (исходный skbuff и его клоны), он сначала должен создать новую копию (copy-on-write).

Когда кому-то больше не нужен skbuff, это kfree_skb(). kfree_skb() уменьшает счетчик ссылок, и когда этот счетчик ссылок достигает нуля, skbuff освобождается. Сложнее учитывать клоны, но это общая идея.

...