Как работает буферизация pcap unix?
Гипотетический сценарий:
Поток пакетов udp поступает на машину X, на которой запущены две программы - одна, которая прослушивает пакеты с recv(), а другая - pcap.
В этом случае, как я понимаю, пакеты хранятся в интерфейсе до тех пор, пока он не будет опрошен ядром, который затем переместит их в буфер в памяти ядер и скопирует пакеты в два других буфера - один буфер для прослушивания программы с помощью recv и одного буфера для прослушивания программы с помощью pcap. Пакеты удаляются из соответствующего буфера при их чтении - либо pcap_next(), либо recv(), при следующем запуске планировщика процесса (я предполагаю, что в этом случае они блокируются). Это верно? Существуют ли действительно 4 буфера, или они обрабатываются каким-то другим способом?
Я ищу описание, насколько это возможно, относительно того, какие буферы действительно задействованы в этом случае, и как пакеты перемещаются от одного к другому (например, пакет копируется в буфер pcaps, прежде чем он перейдет к буфер recv, after или undefined?).
Я знаю, что это похоже на большой вопрос, но все, что мне действительно волнует, это то, где пакет хранится и как долго он остается там. Точки пули прекрасны. В идеале я бы хотел получить общий ответ, но если это зависит от ОС, меня больше всего интересует Linux.
Ответы
Ответ 1
Случай Linux (BSD, вероятно, несколько схожи, используя mbuf
вместо skbuff
s):
Linux использует skbuffs (буферы сокетов) для буферизации сетевых данных. В skbuff есть метаданные о некоторых сетевых данных и некоторые указатели на эти данные.
Отводы (пользователи pcap) создают клоны skbuff. Клон - это новый skbuff, но он указывает на одни и те же данные. Когда кому-то нужно модифицировать данные, разделяемые несколькими skbuff (исходный skbuff и его клоны), сначала нужно создать новую копию (copy-on-write).
Когда кому-то больше не нужен skbuff, он kfree_skb()
его. kfree_skb()
уменьшает счетчик ссылок, и когда этот счетчик ссылок достигает нуля, skbuff освобождается. Это немного сложнее для учета клонов, но это общая идея.