📌 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_XDPDPDK
ЯдроИспользуетсяОбходится
Zero-copyПоддерживаетсяПоддерживается
Поддержка сокетовЕсть (native API)Отсутствует
СложностьНижеВыше

✅ Преимущества

  • Высокая скорость без сторонних фреймворков

  • Использует стандартный kernel-интерфейс

  • Легко интегрируется с eBPF и XDP

❌ Недостатки

  • Требуется поддержка со стороны драйвера и ядра

  • Сложная низкоуровневая настройка (очереди, mmap, buffers)

  • Нет поддержки полной zero-copy на старых NIC