📌 AF_XDP
Address Family XDP AF_XDP — интерфейс сокетов в Linux kernel, предназначенный для высокоскоростной передачи сетевых пакетов между XDP и пользовательским пространством с минимальными накладными расходами.
🧠 Как работает
AF_XDP реализует zero-copy путь из драйвера NIC напрямую в userspace через механизм XDP и umem
(user memory). Работает без DPDK и не требует внешних библиотек.
Особенности:
- Использует обычный Socket API (
AF_XDP
,SOCK_RAW
) - Драйвер сетевой карты должен поддерживать
xdp_zc
(zero-copy) - Программа обрабатывает RX/TX-пакеты напрямую через mmap’нутую память
- Возможна интеграция с eBPF-фильтрами в XDP hook
⚙️ Где применяется
Контекст | Применение |
---|---|
Userspace firewall | Замена iptables для высокой скорости |
Traffic capture | Аналог PF_RING, libpcap без overhead |
Load Balancer | Обработка пакетов без DPDK |
Intrusion Detection | Лёгкий IPS на базе eBPF + AF_XDP |
💻 Пример (настройка сокета AF_XDP)
int sock = socket(AF_XDP, SOCK_RAW, 0);
bind(sock, ...); // привязка к интерфейсу
recv(sock, buf, ...); // приём пакетов
Настройка umem
(memory region), fill queue
, completion queue
, rx queue
и tx queue
— выполняется через xsk_socket__create()
в libbpf.
📐 Схема обмена
[NIC] ⇄ [XDP Hook] ⇄ [AF_XDP umem] ⇄ [User Process]
↖ eBPF фильтрация
🧩 Отличия от DPDK
Характеристика | AF_XDP | DPDK |
---|---|---|
Ядро | Используется | Обходится |
Zero-copy | Поддерживается | Поддерживается |
Поддержка сокетов | Есть (native API) | Отсутствует |
Сложность | Ниже | Выше |
✅ Преимущества
-
Высокая скорость без сторонних фреймворков
-
Использует стандартный kernel-интерфейс
❌ Недостатки
-
Требуется поддержка со стороны драйвера и ядра
-
Сложная низкоуровневая настройка (очереди, mmap, buffers)
-
Нет поддержки полной zero-copy на старых NIC