Подтвердить что ты не робот

Как работает буферизация pcap unix?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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