Slyber SFU Server представляет собой автономный сервер селективной маршрутизации видео, аудио и данных реального времени, написанный на языке Go на базе стека Pion WebRTC v4. Эта статья объясняет простым языком, какую задачу решает сервер, как внутри него движутся пакеты и как выбрать нужный режим работы для вашего приложения.
Зачем нужен SFU сервер и почему прямое соединение браузеров не масштабируется
Когда вы делаете видеозвонок между двумя людьми напрямую через браузер, используется схема точка точка (Peer to Peer). Первый участник отправляет видео второму, а второй первому. Проблема возникает, когда в комнату заходят пять, десять или пятьдесят человек. При прямом соединении браузер каждого человека обязан закодировать и отправить отдельную копию своего видео каждому участнику встречи. Если в звонке участвуют десять человек, ваш смартфон или ноутбук одновременно выгружает в сеть девять тяжелых видеопотоков. Из за этого быстро перегревается процессор, садится батарея и полностью забивается исходящий интернет канал.
Архитектура SFU (Selective Forwarding Unit) решает эту проблему за счет центрального узла коммутации. Каждый участник отправляет свое видео и звук на Slyber SFU Server всего один раз. Сервер принимает эти пакеты и мгновенно копирует их остальным зрителям в комнате. При этом сервер не занимается тяжелым декодированием и склеиванием видеокартинки на своем процессоре, поэтому одна серверная нода способна одновременно обслуживать до 5000 активных комнат с минимальной задержкой.
Почему серверу достаточно одного сетевого порта 4443
Традиционные WebRTC серверы открывают отдельный случайный сетевой порт под каждого участника. Администраторам приходится открывать в настройках файрвола огромные диапазоны портов (например от 10000 до 60000), что усложняет настройку сети и работу в контейнерах Docker.
В Slyber SFU Server применяется режим ICE-Lite и встроенные мультиплексоры ICEUDPMux и ICETCPMux. Весь медиатрафик всех комнат и участников проходит через единый порт 4443 по протоколам UDP и TCP. Когда браузер подключается к серверу, он присылает проверочный пакет STUN с уникальным именем сессии. Сервер запоминает сетевой адрес клиента и направляет его зашифрованные медиапакеты в нужную комнату. Если у пользователя на работе заблокирован протокол UDP, браузер автоматически переключится на протокол TCP (стандарт RFC 4571) через тот же самый порт 4443. А для обмена командами управления и статистикой используется отдельный HTTP и WebSocket порт 8090.
Как устроена комната внутри сервера
Чтобы легко ориентироваться в API сервера, достаточно понимать три базовых термина его внутреннего ядра.
- UpTrack (входящий поток издателя). Когда участник включает камеру или микрофон, внутри комнаты создается объект
UpTrack. Он принимает пакеты от отправителя, сохраняет последние видеопакеты в специальный кольцевой буфер памяти на случай потерь в сети и раздает пакеты всем подписанным зрителям. - DownTrack (исходящий поток для конкретного зрителя). Когда другой участник хочет смотреть это видео, сервер создает для него персональный канал
DownTrackи прикрепляет его кUpTrack. КаждыйDownTrackработает независимо. Одному зрителю с быстрым интернетом он пересылает видео в максимальном качестве 1080p, а другому зрителю с плохим мобильным интернетом отдает уменьшенную копию 270p. - SlyberPacket и работа без нагрузки на память. Чтобы сервер не тормозил при пересылке сотен тысяч пакетов в секунду, он не создает в оперативной памяти новые переменные под каждый пакет. Все пакеты берутся из заранее подготовленного пула памяти
sync.Poolи возвращаются обратно сразу после отправки зрителям.
Как сервер подстраивается под плохой интернет
Участники видеозвонка находятся в разных условиях. Один сидит дома на домашнем оптоволокне, а другой едет в метро со слабым сигналом сотовой сети. Чтобы видео не зависало у второго участника, Slyber SFU Server поддерживает технологии Simulcast и SVC.
Браузер отправителя кодирует видео с камеры сразу в трех слоях качества. Слой 0 содержит легкую картинку для слабого интернета, слой 1 дает среднее разрешение, а слой 2 передает четкое видео высокой четкости. Модуль оценки канала SubscriberBWE внутри сервера постоянно следит за скоростью соединения и потерями пакетов каждого зрителя. Если у зрителя падает скорость, его персональный DownTrack автоматически переключается на слой 0, сохраняя плавный звук и видео. Подробное описание настройки слоев приведено в разделе Протокол сигналинга и управление качеством.
Пять готовых профилей комнат под разные продукты
Сервер поддерживает пять специализированных профилей комнат, которые задают оптимальное поведение маршрутизатора.
- Профиль
conference(групповые видеоконференции). Включает детектор активного спикера по заголовкам звука RFC 6464 и политику экономии трафика Last N. Сервер автоматически ставит на паузу видеокамеры молчащих участников и транслирует видео только от тех людей, которые говорят в данный момент. - Профиль
roulette_1v1(видеорулетки и чаты один на один). Ограничивает активное видео одним собеседником и включает функцию мгновенного переключенияFastSwapRouletteTrack. При нажатии кнопки следующего собеседника сервер меняет источник видео за доли миллисекунды без повторного обмена SDP и без черных экранов. - Профиль
broadcast(вебинары и прямые эфиры). Оптимизирован для приема потоков из студии OBS или браузера через протокол WHIP и одновременной раздачи сотням зрителей через WHEP и слои Simulcast. - Профиль
gaming(стриминг с минимальной задержкой). Настраивает буферы ретрансляции на минимальное время отклика для интерактивных приложений. - Профиль
ai_voice(голосовые диалоги с искусственным интеллектом). Активирует интеграцию со шлюзом/ai/ws, позволяя подключать в комнату одного или нескольких голосовых ИИ ботов через обычный WebSocket с поддержкой перебивания голосом человека.