📌 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