Express UDP — это библиотека для работы с UDP-соединениями, реализованная на основе XDP Socket.
При помощи XDP осуществляется фильтрация пакетов на уровне сетевой карты, а затем пакеты с указанным ip:port передаются в XSK. Уровень приложения Express UDP получает пакеты из XSK.
Express UDP отправляет пакеты в XSK, где они преобразуются в skb и помещаются в очередь сетевой карты для отправки. В режиме XSK ZEROCOPY можно пропустить этап создания skb и непосредственно передать пакеты сетевой карте, что повышает производительность.
yum install libnl3-devel elfutils-libelf-devel clang llvm libcap-devel
make
Все выходные данные находятся в директории objs
. Также создаются файлы libxudp.a
и libxudp.so
, а также заголовочный файл xudp.h
.
Файл tools/xudp_echo_server.c
представляет собой простую реализацию сервиса эхо. Скомпилированный файл находится в директории objs
, команда запуска имеет следующий вид:
./xudp-echo-server <ip> <port>
Здесь <ip>
— это локальный адрес, который будет использоваться для привязки, если используется 0.0.0.0
, то сервер будет слушать все сетевые карты. После запуска сервера тестирование можно выполнить командой:
nc -u <ip> <port>
Отправляйте UDP-сообщение серверу, он выведет сообщение и вернет его обратно клиенту.Дополнительная информация доступна здесь: АлиБаба Облако Практика
Этап привязки заключается в связывании eBPF с сетевой картой и созданием XSK, которое затем связывается с eBPF.
Обратите внимание, что некоторые сетевые карты не поддерживают XDP, такие как lo
, поэтому Express UDP не работает на этих сетевых картах.
Привязка выполняется путем фильтрации всех сетевых карт и привязки всех подходящих по IP карт. Например, если использовать 0.0.0.0
, xudp попытается привязаться ко всем сетевым картам кроме lo
. Если хотя бы одна привязка завершится ошибкой, вся операция считается проваленной.
Можно указывать несколько struct sockaddr
, количество которых контролируется параметром num
, максимальное значение которого составляет 10.
int xudp_bind(xudp *x, struct sockaddr *a, socklen_t addrlen, int num);
Учитывая, что современные сетевые карты поддерживают многоуровневое распределение, рекомендуется использовать многопоточное или многопроцессорное программирование.
Интерфейсы recv
и send
имеют два варианта: по умолчанию они выполняют циклический прием и отправку данных по каналу. Интерфейсы с суффиксом _channel
работают только с конкретным каналом.В многопоточной или многопроцессорной среде каждый поток или процесс работает с отдельным каналом, что обеспечивает хорошую производительность.## epoll/poll/select
Каждый канал может получить соответствующий FD xsk с помощью xudp_channel_getfd
.
Этот FD поддерживает операции epoll и может использоваться для прослушивания событий чтения и записи в epoll/poll/select.
Пример использования epoll приведён в коде tools/xudp_echo_server.c
.
Новая версионная iproute позволяет непосредственно просматривать и конфигурировать XDP сетевые карты. На моей локальной машине iproute2-ss170501 уже поддерживает эту возможность.
Если сетевая карта была настроена на использование XDP, то это будет отображено как "xdp" в выводе команды ip link
.
Команда ip link set <dev> xdp off
позволяет выключить XDP для указанной сетевой карты.
Сейчас библиотека libxudp поддерживает маршрутизацию, что позволяет клиенту и серверу работать даже если они находятся в разных сегментах сети, а также использовать публичные сети.
Express UDP при запуске получает текущие маршруты машины и сохраняет их в памяти. В настоящее время изменения маршрутов и их синхронизация не поддерживаются.
Поиск маршрутов реализован с использованием хэшей, что обеспечивает высокую скорость, но требует больше места в памяти.## ARP
Существует простой вариант реализации ARP. Поскольку Alibaba Cloud поддерживает ARP Proxy, можно активировать опцию noarp в libxudp для нормального функционирования на Alibaba Cloud без дополнительных затрат на ARP.
В настоящее время рекомендуется активировать опцию noarp на Alibaba Cloud.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )