1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/anolis-libxudp

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Readme-cn.md 7.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 07:49 1fe2c37

Express UDP

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

Привязка выполняется путем фильтрации всех сетевых карт и привязки всех подходящих по 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.

Просмотр состояния XDP

Новая версионная 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/anolis-libxudp.git
git@api.gitlife.ru:oschina-mirror/anolis-libxudp.git
oschina-mirror
anolis-libxudp
anolis-libxudp
master