1. Архитектура srsRAN 4G и запуск базовой ZMQ-симуляции
Приветствую на курсе. Наша итоговая цель — научиться модифицировать исходный код MAC-планировщиков в srsRAN 4G, проводить эксперименты и анализировать метрики сети. Но прежде чем писать свой алгоритм BestCQI или профилировать Proportional Fair, нам нужен надежный, воспроизводимый и легко отлаживаемый испытательный стенд.
Работа с реальным SDR-оборудованием (например, USRP B200) вносит физические переменные: радиопомехи, затухание сигнала, аппаратные задержки. Для разработки логики планировщика на начальном этапе это лишний шум. Поэтому мы начнем с ZeroMQ (ZMQ) — библиотеки асинхронного обмена сообщениями, которая в srsRAN используется для симуляции радиоэфира на уровне I/Q-сэмплов.
Архитектура srsRAN 4G: где живет планировщик
Сеть LTE концептуально делится на три крупных узла:
Внутри eNodeB реализован стек протоколов радиоинтерфейса. Пакеты данных (IP) приходят из ядра сети и спускаются вниз по стеку: * PDCP (Packet Data Convergence Protocol) — сжатие заголовков и шифрование. * RLC (Radio Link Control) — сегментация пакетов и обеспечение надежной доставки (ARQ). * MAC (Medium Access Control) — мультиплексирование, гибридный автоматический запрос повтора (HARQ) и, самое главное для нас, планирование ресурсов (Scheduling). * PHY (Physical Layer) — кодирование, модуляция и формирование OFDM-символов.
!Схема архитектуры сети LTE и стека протоколов eNodeB
Планировщик MAC (MAC Scheduler) — это «мозг» базовой станции. Каждые 1 миллисекунду (один Transmission Time Interval, TTI) он должен решить: какому пользователю (UE) выделить частотные ресурсы (Resource Blocks, RB), какую схему модуляции и кодирования (MCS) применить, и сколько данных передать.
Концепция виртуального радиоэфира через ZeroMQ
В классической схеме уровень PHY передает цифровые I/Q-сэмплы на SDR-плату, которая преобразует их в аналоговый радиосигнал. В ZMQ-симуляции уровень PHY отправляет эти же I/Q-сэмплы через локальные TCP/IPC сокеты напрямую в процесс UE.
Объем данных, передаваемых между процессами, огромен. Его можно оценить по формуле:
Где — битрейт (бит/с), — частота дискретизации (например, 23.04 МГц для полосы LTE 20 МГц), — разрядность одного сэмпла (обычно 16 бит), а учитывает наличие синфазной (I) и квадратурной (Q) компонент.
При МГц мы получаем Мбит/с в одну сторону только для одного антенного порта. Поэтому ZMQ-симуляция требует высокой производительности CPU и памяти.
Сборка srsRAN 4G с поддержкой ZMQ
Для начала установим зависимости. На Ubuntu нам понадобятся библиотеки разработчика ZeroMQ:
Теперь клонируем репозиторий и собираем проект. Ключевой момент — убедиться, что CMake нашел библиотеку ZMQ.
Внимательно изучите вывод cmake. Вы должны увидеть строки, подтверждающие успешный поиск ZeroMQ:
> -- FINDING ZEROMQ.
> -- Found libZEROMQ: /usr/include, /usr/lib/x86_64-linux-gnu/libzmq.so
Если библиотека найдена, запускаем компиляцию:
Изоляция сети: зачем нужны Network Namespaces
Здесь кроется главный инженерный подвох запуска всей сети на одной Linux-машине.
Когда запускается srsepc, он создает виртуальный сетевой интерфейс srs_spgw_sgi (обычно с IP 172.16.0.1). Когда подключается srsue, он создает свой интерфейс tun_srsue и получает IP от ядра (например, 172.16.0.2).
Если оба интерфейса находятся в одном сетевом пространстве хоста, ядро Linux увидит, что пакет от 172.16.0.1 к 172.16.0.2 можно передать напрямую через внутреннюю таблицу маршрутизации (loopback). Трафик не пойдет через наши процессы srsepc -> srsenb -> srsue. Радиоэфир останется пустым, а планировщик MAC не получит данных для распределения.
Чтобы заставить трафик идти через стек LTE, мы поместим UE в отдельное сетевое пространство имен (Network Namespace, netns).
Создадим namespace с именем ue1:
Запуск базовой симуляции
Нам понадобятся три отдельных окна терминала. Мы будем использовать конфигурационные файлы по умолчанию, которые уже настроены на использование ZMQ.
Шаг 1: Запуск ядра сети (EPC)
В первом терминале запускаем ядро. Оно поднимет базу данных абонентов (HSS), шлюзы (SGW/PGW) и узел управления мобильностью (MME).Вывод покажет, что EPC слушает подключения от eNodeB на порту S1-MME (SCTP 36412).
Шаг 2: Запуск базовой станции (eNodeB)
Во втором терминале запускаем eNodeB. Мы явно указываем использовать конфигурацию для ZMQ.
Здесь tx_port и rx_port — это TCP-сокеты, через которые базовая станция будет «излучать» и «слушать» радиоэфир. После запуска eNodeB подключится к EPC (вы увидите сообщение S1 Setup Request в терминале EPC).
Шаг 3: Запуск абонентского устройства (UE)
В третьем терминале мы запускаем UE, но делаем это внутри созданного ранее namespaceue1 с помощью утилиты ip netns exec.
Обратите внимание на порты: tx_port у UE совпадает с rx_port у eNodeB, и наоборот. Это наш виртуальный радиоканал.
В терминале UE вы увидите процесс синхронизации (Cell Search), декодирование системной информации (MIB/SIB), процедуру случайного доступа (RACH) и, наконец, успешное подключение (RRC Connected). UE получит IP-адрес, например, 172.16.0.2.
Проверка прохождения трафика
Теперь проверим, что данные действительно идут через MAC-уровень. Откроем четвертый терминал (на хост-машине, вне namespace) и запустим пинг до UE:
Пинг должен успешно проходить. Задержка (latency) в ZMQ-симуляции обычно составляет 15-30 мс, что соответствует реальным показателям LTE.
Если вы посмотрите в терминал srsenb, то при нажатии клавиши t (включение метрик) вы увидите таблицу с текущим throughput (пропускной способностью) для downlink (DL) и uplink (UL). Пока идет только ICMP-трафик от пинга, значения будут небольшими (единицы килобит).
Чтобы нагрузить планировщик, запустим iperf3. В терминале хоста (EPC) запустим сервер:
А в терминале UE (внутри namespace) запустим клиент:
Теперь в консоли srsenb (по клавише t) вы увидите, как MAC-планировщик выделяет ресурсные блоки (PRB) и выбирает высокие индексы MCS (например, 28) для прокачки мегабит данных.
Мы успешно развернули изолированную лабораторию. В следующей статье мы откроем исходный код srsenb/src/mac/scheduler.cc, разберем call flow от получения данных из RLC до формирования MAC PDU, и найдем точки входа, где принимаются решения о распределении Resource Blocks.