Оригинальный автор(ы) | Бренден Бланко, Том Герберт |
---|---|
Разработчик(и) | Сообщество разработчиков ПО с открытым исходным кодом, Google , Amazon , Intel , Microsoft [1] |
Первоначальный выпуск | 2016 ( 2016 ) |
Написано в | С |
Операционная система | Linux , Windows |
Тип | Фильтрация пакетов |
Лицензия | Linux: GPL Windows: Лицензия MIT |
XDP ( eXpress Data Path ) — это высокопроизводительный путь передачи данных на основе eBPF, используемый для отправки и получения сетевых пакетов на высоких скоростях в обход большей части сетевого стека операционной системы . Он включен в ядро Linux с версии 4.8. [2] Эта реализация лицензирована по GPL . Крупные технологические компании, включая Amazon, Google и Intel, поддерживают ее разработку. Microsoft выпустила свою бесплатную и открытую реализацию XDP для Windows в мае 2022 года. [1] Он лицензирован по лицензии MIT . [3]
Идея XDP заключается в том, чтобы добавить ранний хук в путь RX ядра и позволить программе eBPF, предоставленной пользователем, решить судьбу пакета. Хук помещается в драйвер сетевого контроллера (NIC) сразу после обработки прерывания и до любого выделения памяти, необходимого самому сетевому стеку , поскольку выделение памяти может быть дорогостоящей операцией. Благодаря такой конструкции XDP может отбрасывать 26 миллионов пакетов в секунду на ядро с помощью стандартного оборудования. [4]
Программа eBPF должна пройти тест preverifier [5] перед загрузкой, чтобы избежать выполнения вредоносного кода в пространстве ядра. Preverifier проверяет, что программа не содержит доступов за пределами диапазона, циклов или глобальных переменных.
Программе разрешено редактировать данные пакета, и после возврата программы eBPF код действия определяет, что делать с пакетом:
XDP_PASS
: позволить пакету продолжить прохождение через сетевой стекXDP_DROP
: молча отбросить пакетXDP_ABORTED
: отбросить пакет с исключением точки трассировкиXDP_TX
: возвращает пакет обратно на тот же сетевой адаптер, на который он прибылXDP_REDIRECT
: перенаправить пакет на другой сетевой адаптер или сокет пользовательского пространства через семейство адресов AF_XDPXDP требует поддержки в драйвере сетевой карты, но поскольку не все драйверы поддерживают ее, можно использовать универсальную реализацию, которая выполняет обработку eBPF в сетевом стеке, хотя и с более низкой производительностью. [6]
XDP имеет инфраструктуру для выгрузки программы eBPF на сетевой контроллер интерфейса, который ее поддерживает, снижая нагрузку на ЦП. В 2023 году ее будут поддерживать только карты Netronome [7] .
Microsoft сотрудничает с другими компаниями и добавляет поддержку XDP в свою реализацию MsQuic протокола QUIC . [1]
Наряду с XDP, новое семейство адресов вошло в ядро Linux, начиная с версии 4.18. [8] AF_XDP, ранее известный как AF_PACKETv4 (который никогда не был включен в основное ядро), [9] представляет собой сырой сокет, оптимизированный для высокопроизводительной обработки пакетов и допускающий нулевое копирование между ядром и приложениями. Поскольку сокет может использоваться как для приема, так и для передачи, он поддерживает высокопроизводительные сетевые приложения исключительно в пользовательском пространстве. [10]