Привет 👋
В этой статье я подробно описал что такое SFU сервер и все что касается этой темы. Тема довольно сложная для понимания и перед тем как погрузиться в терминологию советую пройти этап визуализации ниже в 7 шагов! Обещаю если ты представишь все в деталях то эта тема покажется тебе очень простой и понятной!
Визуализация

Представь высокоскоростную пневмопочту (сеть прозрачных труб с капсулами), проложенную между двумя зданиями через весь город. Вся система решает одну физическую задачу каждую секунду переправлять из комнаты Отправителя в комнату Зрителя 50 объемных слепков кадра если мы говорим о 50fps так быстро, чтобы на том конце они сливались в живое движение на экране зрителя.
Комплекс аппаратуры, встроенный прямо в стены обоих зданий и отвечающий за отправку и прием этих капсул без внешнего оборудования - это WebRTC (а простые грузовые ворота по бокам для подключения внешних студийных камер и экранов одним запросом - это WHIP на вход и WHEP на выход).
Теперь идем вдоль трубы от первого миллиметра до последнего по строгой цепочке "Проблема → Решение".
Шаг 1. Почему кадр нельзя пустить по трубе целиком (RTP и SRTP)

Физическая проблема: Один четкий слепок видеокадра весит слишком много он просто шире диаметра стандартной городской трубы и не пролезет в нее целиком.
Решение: На старте станок разрезает каждый кадр на 50 мелких пронумерованных кубиков.
- Каждый кубик укладывается в стандартную цилиндрическую капсулу RTP, на корпусе которой выбиты порядковый номер и точное время вылета (чтобы у зрителя кубики собрались в правильном порядке).
- Снаружи на время полета по уличной трубе капсула закрывается дорожным кодовым замком SRTP, чтобы никто на улице не подменил кубик.
Шаг 2. Зачем в центре города стоит стрелка, а не цех пересборки (MCU против SFU)

Физическая проблема: Когда в разговоре участвуют 20 человек, твой домашний аппарат не может выстреливать по 20 одинаковых комплектов капсул каждому участнику лично твоя исходящая труба из дома мгновенно захлебнется. Значит, нужно отправить один поток капсул на центральный узел в городе, который размножит их для остальных.
Два поколения этого узла:
- Старый сборочный цех (MCU): Капсулы от всех 20 человек прилетали в большой зал. Рабочие открывали каждую капсулу, вынимали все кубики, склеивали из 20 лиц одно общее панно, снова распиливали его на кубики и заново паковали в капсулы для каждого зрителя. Это отнимало драгоценные доли секунды и требовало огромного цеха.
- Скоростная автоматическая стрелка (SFU): Современный узел - это компактная прозрачная развилка, где вообще не открывают капсулы со слепками. Капсула от тебя на полном ходу влетает в развилку SFU, датчик за миллисекунду считывает только адресную бирку снаружи, и автоматическая стрелка мгновенно выстреливает копии этой капсулы в трубы зрителей.
Шаг 3. Стрелка не умеет уменьшать груз, а труба в лифте узкая (Simulcast и SVC)

Физическая проблема: Отказ от сборочного цеха в пользу быстрой стрелки SFU сразу создал новый тупик. Из развилки SFU выходят две разные трубы: к первому зрителю идет широкая магистраль (домашний интернет), куда свободно влетают все 50 капсул кадра, а ко второму зрителю узкая трубка в шахту лифта, куда за раз пролезает максимум 5 капсул. Поскольку стрелка SFU не вскрывает капсулы и не умеет перепиливать кубики под узкую трубу, при попытке протолкнуть туда 50 капсул горловина забьется намертво.
Решение: Подготовить уменьшенный набор кубиков обязан сам отправитель еще у себя дома перед вылетом:
- Способ 1 - Три отдельные очереди (Simulcast): Аппарат отправителя дома делает сразу три независимые копии одного кадра большую (50 капсул), среднюю (15 капсул) и малую (5 капсул) и пускает все три потока до развилки SFU. Стрелке на станции остается просто направить крупный поток в широкую трубу, а малый в узкую трубку лифта.
- Способ 2 - Трехцветный модульный конструктор (SVC): Чтобы не гонять от дома до станции три отдельные копии и не тратить место в трубе впустую, отправитель шлет один набор капсул, но разделенный по цветам:
- 5 зеленых капсул несут базовый контур кадра (из них уже можно собрать картинку низкого разрешения);
- 10 желтых капсул добавляют поверх базового контура среднюю резкость;
- 35 синих капсул добавляют мелкие детали высокой четкости. Теперь, когда труба зрителя в лифте сужается, стрелка SFU одним движением заслонки отсекает синие и желтые капсулы, пропуская в узкую трубку только 5 зеленых!
Шаг 4. Как стрелке в центре города узнать, что за 50 км от нее труба в лифте начала забиваться (TWCC, GCC, BWE)

Физическая проблема: Автоматическая стрелка SFU стоит в дата-центре, а узкое горлышко возникает на самом последнем участке - перед входом в телефон зрителя в лифте. Если ждать, пока узкая труба переполнится и капсулы начнут биться и теряться, картинка на экране зрителя уже замрет (ведь без потерянных кубиков кадр не складывается). Стрелка должна узнать о сужении трубы до того, как потеряется хотя бы одна капсула.
Решение: Вдоль трубы от развилки SFU к зрителю ставится замкнутая измерительная петля из трех связанных приборов:
- Счетчик интервалов на финише (TWCC): На вылете из развилки SFU на каждую капсулу наносится сквозной номер (1, 2, 3...). А прямо перед входом в телефон зрителя стоит оптическое кольцо с секундомером. Оно засекает точное время прилета каждой капсулы и каждые полсекунды отправляет обратно к станции короткую сводку TWCC: "Капсулы №101, 102 и 103 вылетели со станции с дистанцией в 5 миллисекунд, а ко мне на финиш прилетели с растянутой дистанцией в 25 миллисекунд!"
- Датчик накопления очереди (GCC): Вычислительный блок GCC на станции SFU читает эту сводку и видит простую механику: если расстояние по времени между капсулами на выходе увеличилось, значит, они начали притормаживать в очереди перед узким горлышком роутера или сотовой вышки. Капсулы еще целы, но затор в трубе уже растет.
- Вентиль пропускной способности (BWE): Получив сигнал от датчика GCC, регулятор BWE вычисляет реальный диаметр трубы в эту секунду и сразу поворачивает заслонку на стрелке SFU: "Пропускная способность упала отсекай синий и желтый слои SVC, подавай в трубу только зеленый базовый слой!"
Шаг 5. Как спрятать кубики от самой станции SFU, не ослепив стрелку (Insertable Streams и MLS)

Физическая проблема: Вспомним шаг 2 уличный замок SRTP запирает капсулу только на пути от дома до развилки SFU. На самой развилке этот уличный замок снимается, чтобы автоматика прочитала цвет капсулы, переписала номер под конкретного зрителя и повесила новый уличный замок. Но это значит, что внутри самой развилки SFU кубики кадра на долю секунды оказываются открытыми (владелец сервера может заглянуть внутрь). А если заварить всю капсулу RTP наглухо еще дома, стрелка SFU не увидит, где зеленый базовый слой, а где синий, и перестанет работать.
Решение:
- Внутренний непрозрачный футляр (Insertable Streams): Прямо в комнате отправителя, перед тем как кубик кадра упадет в прозрачную капсулу RTP, боковой механизм запаивает сам кубик в непрозрачный внутренний футляр, запертый личным ключом участников комнаты. А снаружи на стенке самой капсулы RTP остается открытая цветная метка ("Зеленый слой SVC, кадр №10"). Теперь стрелка SFU прекрасно видит цветную метку и отсекает лишние слои для лифта, но сам кубик внутри футляра для станции остается черным ящиком.
- Пирамида раздачи ключей (MLS): Чтобы у 1000 человек в звонке был одинаковый ключ от этого внутреннего футляра и он мгновенно менялся при уходе любого участника (иначе ушедший сможет читать чужие капсулы), участников связывают в пирамиду пар (по 2, по 4, по 8 человек). Когда один человек выходит из комнаты, новый ключ передается всего через 10 этажей пирамиды снизу вверх вместо поочередного обхода всех 1000 участников.
Шаг 6. Как вывести трубу со своего закрытого двора и пройти блокпосты на улице (STUN, TURN, DPI, ICE, Happy Eyeballs)

Физическая проблема: Прежде чем капсулы вообще доберутся до городской развилки SFU, им нужно выбраться из здания отправителя. А здание стоит внутри закрытого двора за глухим забором домашнего роутера (NAT), плюс на городских улицах стоят проверочные посты провайдеров.
Решение:
- Внешний указатель ворот двора (STUN): Находясь внутри двора за забором роутера, твой аппарат знает только внутренний номер квартиры, но не видит, через какой именно внешний люк в стене двора твоя труба выходит на улицу. Аппарат пускает пробный шарик до уличного маяка STUN, и тот присылает ответ: "Твоя труба выходит на улицу через внешний люк №48200".
- Посты досмотра (DPI) и обходной рукав (TURN): На некоторых улицах стоят сканеры провайдеров DPI, которые просвечивают трубы и перекрывают заслонку, как только замечают внутри капсулы RTP. А в строгих офисных зданиях прямые люки на улицу вообще заварены. Тогда капсулы пускают через обходной транзитный узел TURN внутри стандартной непрозрачной оболочки обычного веб сайта (HTTPS на порту 443). Сканер DPI видит стандартный банковский трафик и пропускает его без остановки.
- Автоматический выбор рабочей трубы (ICE и Happy Eyeballs): Между домом и станцией SFU всегда есть несколько вариантов прокладки пути: прямая воздушная труба (UDP), наземная рельсовая труба (ICE-TCP), старый мост IPv4, новый мост IPv6 и обходной рукав TURN. Диспетчер ICE собирает список всех доступных люков (в режиме Trickle ICE он проверяет первый же люк мгновенно, не дожидаясь остальных, а сама станция SFU в режиме ICE-Lite просто ждет входящих шаров на своем фиксированном адресе). Чтобы пользователь не ждал поочередной проверки каждого моста, стартовый клапан Happy Eyeballs запускает пробные шары в параллельные трубы одновременно: из какой трубы первой вернулось эхо за сотые доли секунды та сразу открывается для основного потока.
Шаг 7. Финал: Почему на 1 000 000 зрителей одну трубу заменяют на многоствольную обойму и районные склады (QUIC и MoQ)

Физическая проблема: Вся построенная нами пневмотрасса (WebRTC + SFU) работает с минимальной задержкой, пока в комнате 10, 50 или 500 человек. Но что произойдет, если к прямому эфиру подключатся 1 000 000 зрителей?
- Если пустить миллион человек по старой одноколейной трубе (TCP), где все капсулы сцеплены в одну жесткую очередь, то первая же застрявшая капсула с видео заблокирует позади себя всю трубу вместе со звуком.
- А если пытаться раздать миллион потоков через классический WebRTC (RTP поверх UDP), то развилке SFU придется крутить миллион индивидуальных вентилей скорости и перешифровывать каждую капсулу лично под каждого зрителя потому что обычные городские склады (CDN) не умеют копировать безымянный поток RTP.
Решение :
- Шланг с десятками независимых внутренних стволов (QUIC): Вместо одной трубы между сервером и зрителем прокладывается широкий защищенный рукав QUIC. На его конце стоит плавающая муфта (Connection ID): когда человек выходит из дома и переключается с Wi-Fi на 5G, муфта за миллисекунду перещелкивается на новую трубу без остановки потока. А внутри самого рукава, как в барабане револьвера, проходят десятки отдельных гладких стволов. Если в одном стволе застряла капсула, по всем соседним стволам внутри этого же рукава груз продолжает лететь без малейшей заминки.
- Отдельный ствол под каждую секунду видео (MoQ): Диспетчер MoQ раскладывает медиапоток по этим внутренним стволам QUIC по трем простым правилам:
- Верхний ствол только под звук: голосовые капсулы всегда вылетают первыми в обход любых видео очередей.
- Каждая новая секунда видео заряжается в свой собственный соседний ствол! В начале ствола идет тяжелая стартовая капсула (полный опорный кадр секунды), а за ней по этому же стволу скользят 30 легких капсул движений этой секунды.
- Обгон пробки без ожидания: если зритель вошел в лифт и в Стволе 10-й секунды застряла капсула, система не ждет, пока она протолкнется! В ту же долю секунды по соседнему Стволу 11-й секунды в обход затора выстреливается свежая стартовая капсула новой секунды, а застрявший 10-й ствол просто отключается и сбрасывается.
- Копирование через обычные городские склады (MoQ Relays / CDN): Поскольку каждая секундная обойма в MoQ имеет четкую серийную маркировку снаружи ("Канал 1, Видео, Секунда №11"), центральной станции SFU больше не нужно тянуть миллион труб к зрителям. Она отправляет всего одну обойму на обычные районные склады вдоль трассы (серверы CDN), а те, вообще не открывая зашифрованные капсулы, просто клонируют готовые секундные обоймы со своих полок в сотни тысяч рукавов QUIC местных зрителей.
Справочник терминов и стандартов
WebRTC (Web Real Time Communication)
Открытый стек протоколов и браузерных интерфейсов (API) для прямой передачи звука, видео и произвольных данных без установки сторонних плагинов. Проект запущен компанией Google в мае 2011 года (на базе купленных и открытых разработок компаний GIPS и On2 Technologies), а в январе 2021 года консорциум W3C и инженерный совет IETF утвердили его как официальный стандарт WebRTC 1.0. Создан для того, чтобы любой браузер и мобильное приложение могли устанавливать защищенную аудио и видеосвязь.
MCU (Multipoint Control Unit)
Серверная архитектура первого поколения для групповых видеоконференций, где сервер декодирует видео от всех участников, склеивает их в общую картинку и заново кодирует для каждого зрителя. Появилась в 1990 х годах в стандартах сектора электросвязи ITU T сначала в семействе H.320 (1990–1993 годы, видеосвязь по цифровым линиям ISDN, спецификации H.231/H.243) при участии компаний PictureTel и Tandberg, а с 1996 года - в стандарте H.323 для IP сетей. Была создана потому, что слабые процессоры и узкие каналы связи абонентских устройств тех лет физически не могли принимать и декодировать более одного видеопотока одновременно.
SFU (Selective Forwarding Unit)
архитектура современного медиасервера, который принимает зашифрованные пакеты от участников и пересылает выбранные копии другим зрителям без декодирования и пересжатия видео. Подход впервые реализован в коммерческом продукте компанией Vidyo в 2008 году (на базе кодека H.264 SVC), а сам термин SFU закрепился в документах IETF и открытом проекте Jitsi VideoBridge в 2012–2015 годах. Создан для того, чтобы избавить серверы от тяжелого перекодирования видео, снизить задержку до десятков миллисекунд и удешевить обслуживание тысяч комнат.
RTP и SRTP (Real time Transport Protocol / Secure RTP)
базовый сетевой формат упаковки аудио и видеокадров с метками времени и порядковыми номерами. RTP разработан рабочей группой IETF под руководством Хеннинга Шульцринне (RFC 1889 в 1996 году, обновлен в RFC 3550 в 2003 году), а шифрующая надстройка SRTP создана инженерами Cisco и Ericsson в 2004 году (RFC 3711). Созданы для быстрой доставки медиапотоков по протоколу UDP с защитой от прослушивания и подмены пакетов.
Simulcast (Simultaneous Broadcast) - технология, при которой устройство отправителя параллельно сжимает и отправляет на сервер сразу две три независимые копии видео с камеры в разном разрешении (например, 1080p, 540p и 270p). Внедрена в WebRTC компаниями Google, Cisco и Mozilla в середине 2010 х и официально стандартизирована IETF в январе 2021 года (RFC 8853). Нужна для того, чтобы сервер SFU мог выдавать каждому зрителю поток по силам его интернета, не перекодируя картинку на самом сервере.
SVC (Scalable Video Coding)
технология кодирования видео в один поток, разделенный на зависимые слои базовый слой низкого качества и дополнительные слои пространственной детализации и частоты кадров. Стандарт H.264/SVC был принят ITU T и ISO/IEC в 2007 году, а в 2013–2019 годах компания Google и консорциум Alliance for Open Media (AOMedia) встроили его в кодеки VP9 и AV1 (спецификация W3C WebRTC SVC). Создана для гибкой адаптации качества на сервере отсечением верхних слоев с меньшим расходом исходящего трафика, чем у Simulcast.
BWE (Bandwidth Estimation)
модуль внутри медиасервера и браузера, который в реальном времени вычисляет максимальную безопасную скорость передачи данных для каждого соединения. Активно развивается в рамках проекта WebRTC с 2011 года инженерами Google и IETF. Создан для того, чтобы видеосвязь заранее подстраивалась под просадки мобильной или домашней сети и не доводила соединение до потери пакетов и зависания картинки.
TWCC (Transport Wide Congestion Control)
механизм обратной связи, при котором отправитель ставит сквозной номер на каждый уходящий RTP пакет, а получатель возвращает компактные квитанции о точном времени прибытия каждого пакета. Разработан инженерами Google (Стефан Холмер и коллеги) в 2015 году для рабочей группы IETF RMCAT на смену старому механизму REMB. Создан для того, чтобы перенести математику расчета скорости с принимающей стороны на отправляющую (Send side BWE на сервер при раздаче потоков зрителям и в браузер клиента при отправке видео с камеры) и мгновенно замечать малейший рост очереди в роутерах.
GCC (Google Congestion Control)
математический алгоритм управления битрейтом видео, сочетающий анализ изменения задержки между пакетами и процент потерь. Предложен компанией Google в 2012–2016 годах в рабочей группе IETF RMCAT (draft ietf rmcat gcc). Создан для удержания минимальной задержки в звонке, чтобы видеопоток не забивал буферы маршрутизаторов и не вытеснял другой трафик в сети пользователя.
STUN (Session Traversal Utilities for NAT)
легковесный протокол, позволяющий устройству за домашним роутером узнать свой внешний публичный IP адрес и порт. Разработан Джонатаном Розенбергом (Dynamicsoft / Cisco) и принят IETF в 2003 году (RFC 3489, обновлен в RFC 5389 в 2008 году и RFC 8489 в 2020 году). Создан для того, чтобы два узла в интернете могли обнаружить внешние адреса друг друга и установить прямое соединение.
TURN (Traversal Using Relays around NAT)
протокол принудительной пересылки медиатрафика через публичный сервер посредник, когда прямое соединение заблокировано строгим файрволом или симметричным NAT. Разработан Джонатаном Розенбергом, Роханом Махи и Филиппом Мэттьюзом и утвержден IETF в 2010 году (RFC 5766, обновлен в RFC 8656 в 2020 году). Создан как безотказный резервный транспорт для сложных корпоративных и мобильных сетей.
ICE, ICE Lite, Trickle ICE и ICE TCP
семейство протоколов для автоматического сбора всех возможных сетевых адресов (кандидатов) и проверки маршрутов между клиентом и сервером. Базовый стандарт принят IETF в 2010 году (RFC 5245, обновлен в RFC 8445 в 2018 году), расширение для работы поверх TCP выпущено в 2012 году (RFC 6544), а ускоренный "капельный" режим Trickle ICE официально опубликован в январе 2021 года (RFC 8838). Создан для того, чтобы программа автоматически находила самый быстрый и короткий рабочий путь для звонка.
DPI (Deep Packet Inspection)
технология проверки сетевого трафика на оборудовании интернет провайдеров и корпоративных шлюзов, анализирующая не только IP адреса и порты, но и внутреннюю структуру и сигнатуры протоколов. Массово внедряется с середины 2000 х годов телеком вендорами (Cisco, Sandvine, Huawei). Изначально создавалась для защиты корпоративных сетей и приоритизации трафика, но также применяется для ограничения или блокировки голосовых и видеопротоколов.
Insertable Streams (WebRTC Encoded Transform)
программный интерфейс (API) браузера, открывающий разработчику доступ к сжатым видео и аудиокадрам непосредственно перед их упаковкой в сетевые пакеты. Спроектирован инженерами Google и Apple в рабочей группе W3C WebRTC в 2020 году. Создан в первую очередь для внедрения сквозного шифрования (E2EE) в групповых браузерных звонках через SFU, а также для добавления пользовательских метаданных к кадрам.
MLS (Messaging Layer Security)
криптографический протокол управления групповыми ключами шифрования на базе бинарных деревьев. Разработан рабочей группой IETF при участии Mozilla, Cisco, Cloudflare, Wire и Университета Оксфорда и официально утвержден как стандарт RFC 9420 в июле 2023 года. Создан для того, чтобы тысячи участников конференции могли безопасно менять общие ключи шифрования за миллисекунды при каждом входе или выходе человека из комнаты.
WHIP и WHEP (WebRTC HTTP Ingestion / Egress Protocol)
стандарты быстрого запуска трансляции в сервер (WHIP) и получения потока зрителем (WHEP) с помощью одного обычного HTTP POST запроса. Созданы Серхио Гарсией Мурильо (Millicast / Dolby) и Алексом Гуайяром в рабочей группе IETF WISH в 2021–2025 годах (WHIP официально принят как стандарт RFC 9725 в 2025 году, WHEP является парной спецификацией IETF). Созданы для устранения несовместимости между разными видеосерверами и замены устаревшего протокола RTMP в программах вроде OBS Studio.
QUIC (Quick UDP Internet Connections)
транспортный протокол нового поколения, работающий поверх UDP и объединяющий установку соединения с шифрованием TLS 1.3 и независимыми потоками данных. Создан Джимом Роскиндом в компании Google в 2012 году, а в мае 2021 года утвержден IETF как стандарт RFC 9000 (фундамент HTTP/3). Разработан для ускорения соединения, бесшовного переключения между Wi Fi и мобильной сетью и ликвидации блокировки очереди пакетов, присущей старому протоколу TCP.
MoQ (Media over QUIC)
единый протокол публикации и доставки живого видео и аудио поверх транспорта QUIC. Разрабатывается рабочей группой IETF MOQ с 2022 года инженерами Meta, Cisco, Cloudflare, Google и Twitch. Создан для того, чтобы совместить интерактивную задержку WebRTC (доли секунды) с дешевым масштабированием через обычные кэширующие серверы CDN на миллионы зрителей.
Happy Eyeballs (Fast Fallback)
механизм параллельной проверки сетевых путей, при котором приложение запускает подключения по разным маршрутам и выбирает тот, который ответил первым. Изначально разработан Дэном Уингом и Андреем Юрченко из Cisco и стандартизирован IETF в 2012 году (RFC 6555, обновлен в RFC 8305 в 2017 году) для параллельной гонки адресов IPv6 и IPv4, чтобы поломки маршрутизации IPv6 у провайдеров не вешали открытие сайтов. В дальнейшем этот же принцип лег в основу стандартов ICE Dual Stack Fairness (RFC 8421), HTTP/3 (RFC 9114) и Happy Eyeballs v3 для бесшовной гонки между протоколами UDP (QUIC/WebRTC) и TCP.
Зачем нужен SFU
Когда два человека созваниваются по видеосвязи, их устройства могут передавать картинку и звук напрямую друг другу. Но как только в комнату заходят пять, двадцать или тысяча участников, прямая связь "каждый с каждым" превращается в паутину телефон каждого участника вынужден одновременно сжимать и отправлять десятки исходящих потоков, что мгновенно забивает интернет канал и разряжает батарею. Чтобы решить эту проблему, в центре комнаты ставят специальный сервер SFU.
Старые видеосерверы работали по принципу MCU они принимали видео от всех участников, полностью декодировали каждое изображение в пиксели, склеивали их в одну общую сетку и заново кодировали видео для каждого зрителя. Такой подход требовал огромных вычислительных мощностей и дорогих процессоров или видеокарт на сервере, а также добавлял лишнюю задержку на двойное перекодирование.
Архитектура SFU устроена принципиально иначе сервер вообще не занимается декодированием или пересжатием картинки. Он работает как высокоскоростной сетевой диспетчер (коммутатор пакетов) принимает готовые зашифрованные фрагменты аудио и видео от одного человека и мгновенно пересылает их копии участникам комнаты. За счет отказа от тяжелой обработки изображения один сервер способен обслуживать тысячи видеопотоков одновременно.
Как сервер переваривает сотни тысяч пакетов в секунду
Через SFU каждую секунду проходят сотни тысяч мелких сетевых пакетов (по 1000–1200 байт каждый). Если писать такой сервер как обычный веб сайт, операционная система потратит все ресурсы процессора не на пересылку видео, а на переключение контекста и ожидание очередей. Поэтому внутри высокопроизводительного SFU работают три низкоуровневых механизма.
1. Пакетный асинхронный ввод вывод (Batching I/O)
Обычная программа делает отдельный системный вызов к ядру операционной системы (recvmsg или sendmsg) на каждый сетевой пакет. Каждый такой вызов требует переключения процессора из пользовательского режима (User Space) в привилегированный режим ядра (Kernel Space) и обратно, что отнимает сотни тактов процессора.
2. Архитектура без блокировок
В многопоточных программах главная проблема производительности - конкуренция за общую память. Если несколько потоков процессора одновременно пытаются записать данные в общий список участников комнаты, им приходится ставить блокировку. Пока один поток меняет данные, остальные потоки усыпляются планировщиком ОС и простаивают в очереди. При потоке в 500 000 пакетов в секунду блокировки (мьютексы) моментально парализуют сервер.
Под капотом в медиасерверах эту проблему решают двумя путями
- Изоляция рабочих процессов На каждом ядре запускается полностью независимый рабочий процесс или поток (Worker) со своим циклом обработки событий и собственной таблицей маршрутизации. В безсостоятельных ретрансляторах (например, в высоконагруженных TURN серверах) потоки могут делить один порт через опцию ядра Linux SO_REUSEPORT, где сетевая карта сама раскидывает пакеты по ядрам по хэшу адресов и портов (5 tuple). А в серверах вроде Mediasoup, где конкретная комната (Router) жестко живет внутри одного конкретного процесса Worker, каждый рабочий процесс слушает свой выделенный порт (WebRtcServer), либо перед ними ставится фильтр eBPF (SO_ATTACH_REUSEPORT_EBPF), направляющий пакеты сразу на нужное ядро по идентификатору сессии (ice ufrag). Потоки не делят память друг с другом, поэтому мьютексы им не нужны.
- Неблокирующиеся кольцевые буферы Если одному потоку все же нужно передать пакет другому (например, когда отправитель и зритель обслуживаются разными ядрами), используется кольцевая очередь в памяти. Для пары "один писатель - один читатель" блокировки вообще не требуются один поток меняет только индекс записи, а другой - только индекс чтения с помощью быстрых атомарных операций и барьеров памяти (Acquire / Release) за считанные такты процессора. Если же в очередь пишут сразу несколько потоков (MPSC / MPMC), указатели сдвигаются аппаратными атомарными инструкциями сравнения с обменом (CAS - Compare And Swap, занимающими 15–40 тактов) без системных вызовов и остановки потоков.
3. Жесткая привязка к ядрам процессора
По умолчанию планировщик задач операционной системы постоянно перебрасывает рабочие потоки программы с одного ядра процессора на другое для равномерного распределения нагрузки. Для медиасервера реального времени такой "переезд" потока между ядрами крайне вреден по трем причинам
- Потеря горячего кэша L1 и L2 У каждого физического ядра процессора есть сверхбыстрая собственная память - кэш L1 и L2 (время доступа - около 1–4 наносекунд против 60–100 наносекунд у оперативной памяти RAM). Пока поток работает на одном ядре, код обработки RTP пакетов и контексты шифрования SRTP лежат прямо в кэше L1/L2. Как только поток переезжает на соседнее ядро, его кэш оказывается пустым, и процессор простаивает сотни тактов, подтягивая данные из медленной оперативной памяти (Cache Miss).
- Холодный буфер адресов На новом физическом ядре кэш трансляции виртуальных адресов памяти в физические (TLB) оказывается незаполненным для страниц памяти этого потока, что вызывает серию дорогих промахов TLB Miss при обращении к сетевым буферам.
- Штрафы архитектуры NUMA На многопроцессорных серверах переезд потока на ядро другого процессорного сокета заставляет его тянуть сетевые буферы из "чужой" памяти через межпроцессорную шину с повышенной задержкой.
Чтобы исключить это, при старте SFU вызывает системную функцию sched_setaffinity() (или pthread_setaffinity_np) и жестко закрепляет за каждым рабочим потоком конкретное физическое ядро процессора (например Поток №1 - только на Ядре №1). В результате инструкции и сетевые буферы постоянно крутятся в горячем кэше L1/L2 своего ядра, увеличивая пропускную способность сервера на 30–50%.
Что происходит с видео в лифте и как работают BWE, TWCC и GCC
В одном звонке часто встречаются люди с разным интернетом один сидит дома на гигабитном оптоволокне, а другой едет в лифте со слабой сотовой связью. Если сервер без оглядки попытается отправить тяжелую картинку высокой четкости (3 Мбит/с) человеку в лифте, чей канал просел до 100 Кбит/с, видеоряд у него на экране замрет в режиме стоп кадра (при этом сам смартфон не зависнет, и даже звук собеседника продолжит пробиваться).
Физически и программно эта остановка видеокартинки происходит по цепочке
- Разбиение кадра на десятки пакетов Один кадр видео 1080p (особенно полный опорный кадр - I frame) весит от 30 до 100 КБ. Поскольку максимальный размер одного сетевого пакета в интернете (MTU) составляет около 1200–1500 байт, один видеокадр нарезается на 30–80 отдельных RTP пакетов.
- Переполнение буфера сотовой вышки и сброс пакетов Когда поток из десятков пакетов ударяется в узкое горлышко радиоканала в лифте, очередь памяти на базовой станции переполняется за доли секунды (Bufferbloat), и маршрутизатор оператора начинает принудительно выбрасывать невлезающие пакеты (Packet Loss).
- Остановка декодера и шторм перезапросов (PLI Storm) Видеодекодер в телефоне не может собрать кадр, если из 50 его пакетов потерялись хотя бы несколько штук. Более того, следующие за опорным кадром разностные кадры (P frames) хранят только математические изменения относительно предыдущего кадра. Потеряв опору, декодер оставляет на экране последнюю целую картинку и шлет на сервер аварийный сигнал PLI (Picture Loss Indication) - "пришли новый полный опорный кадр". Если сервер в ответ вышлет в лифт новый тяжелый ключевой кадр, он окончательно забьет узкий канал.
Чтобы не доводить сеть до потерь и стоп кадров, в WebRTC работает система непрерывной оценки пропускной способности BWE (Bandwidth Estimation) на базе протокола обратной связи TWCC и алгоритма GCC. Когда видео идет от сервера к зрителю (Downlink), скорость считает сервер SFU, а когда видео идет от камеры клиента к серверу (Uplink) - тот же самый алгоритм крутится внутри браузера отправителя.
Как устроен протокол сбора данных TWCC
- Сквозная маркировка на выходе Отправитель (например, SFU при раздаче потока зрителю) добавляет в заголовок каждого уходящего RTP пакета специальное расширение - единый возрастающий номер пакета (Transport Wide Sequence Number 1, 2, 3, 4...), а у себя в памяти записывает точное время отправки каждого номера с точностью до микросекунд.
- Журнал приема на телефоне Смартфон получателя принимает эти пакеты и фиксирует по своим внутренним часам точное время прихода каждого номера.
- Квитанция обратной связи Каждые 50–100 миллисекунд получатель упаковывает эти замеры в компактный служебный пакет RTCP (TransportLayerFeedback) и отправляет обратно "Пакеты №101–120 получены, интервалы прибытия между ними составили столько то четвертей миллисекунды (шаг 250 мкс), а пакет №115 не дошел".
Как алгоритм GCC вычисляет скорость канала по данным TWCC
Получив квитанцию TWCC, модуль GCC (Google Congestion Control) пропускает данные через два независимых контроллера
- Контроллер на основе задержки (Delay based controller - главный) Он сравнивает интервалы времени, с которыми пакеты выходили от отправителя (tsend), с интервалами, с которыми они приходили к получателю (trecv). Разница между ними называется вариацией межпакетной задержки (One Way Delay Gradient). Если сервер отправил два пакета с разницей в 5 мс, а на телефон они пришли с разницей в 8 мс, потом 12 мс, потом 18 мс - математический фильтр тренда (Trendline filter или фильтр Калмана) внутри GCC сразу подает сигнал тревоги очередь в буфере роутера перед телефоном начала расти. Пакеты еще не теряются, картинка еще плавная, но канал уже перегружен. GCC немедленно дает команду снизить битрейт, предотвращая зависание видео заранее.
- Контроллер на основе потерь (Loss based controller - страховочный) Он смотрит на долю потерянных пакетов в квитанции TWCC. Если потерь менее 2% - алгоритм разрешает плавно повышать битрейт, нащупывая потолок канала. Если потери составляют от 2% до 10% - скорость удерживается на текущем уровне. Если потеряно более 10% пакетов - битрейт экстренно урезается пропорционально доле потерь.
Итоговая оценка скорости BWE выбирается как минимальное значение из расчетов этих двух контроллеров.
Simulcast и SVC как уменьшить картинку без перекодирования
Когда алгоритм BWE вычислил, что интернет у человека в лифте просел с 3 Мбит/с до 150 Кбит/с, серверу нужно срочно уменьшить вес видеопотока. Поскольку сам SFU не умеет пережимать видео, подготовить облегченные варианты заранее должен отправитель с помощью одной из двух технологий.
Simulcast (три отдельных конвейера)
Устройство отправителя одновременно кодирует и шлет на сервер три независимые копии одного и того же видео с камеры высокую (1080p), среднюю (540p) и маленькую (270p). Собеседнику на оптоволокне SFU пересылает пакеты из высокой копии, а человеку в лифте переключает пересылку на маленькую.
У этого подхода есть два недостатка отправитель тратит примерно на 30–35% больше исходящего интернета на отправку дублей, а для любого переключения зрителя с одного независимого потока на другой серверу приходится ждать прихода полного опорного кадра (I frame), что занимает доли секунды.
SVC (принцип слоеной матрешки)
В современных кодеках VP9 и AV1 видео передается единым потоком, но раскладывается на зависимые слои по разрешению (Spatial layers) и частоте кадров (Temporal layers). Внутри лежит легкий базовый слой (например, 270p при 15 кадрах/с), второй слой добавляет детали для сборки 540p и 30 кадров/с, а третий доводит картинку до 1080p.
Если у зрителя падает скорость интернета, SFU просто перестает пересылать пакеты верхних слоев прямо на лету - декодер зрителя продолжает без пауз показывать базовый слой, вообще не требуя опорного кадра при понижении качества или смене частоты кадров. Опорный или синхронизирующий кадр в стандартном для WebRTC режиме K SVC понадобится только в обратную сторону - когда человек выйдет из лифта и сервер захочет обратно подключить ему верхний пространственный слой 1080p (Spatial up switch).
Семейство протоколов ICE и работа с TURN сервером
Чтобы браузер и сервер вообще смогли обменяться видеопакетами через домашние роутеры и сотовых операторов, используется стек протоколов ICE (Interactive Connectivity Establishment).
Разбор всех режимов ICE простым языком
- Full ICE (Полный ICE, RFC 8445) Стандартный режим, в котором работают браузеры и мобильные приложения при звонке друг другу. Оба устройства сначала собирают все свои возможные адреса (кандидаты) локальный адрес в домашней сети (Host candidate), внешний адрес роутера, узнанный через STUN сервер (Server Reflexive candidate), и резервный адрес на ретрансляторе TURN (Relayed candidate). Затем оба устройства начинают взаимно простукивать все пары адресов проверочными пакетами, пока не найдут самый короткий рабочий маршрут.
- ICE Lite (Облегченный серверный ICE) Упрощенный режим специально для медиасерверов SFU. Поскольку SFU всегда стоит в дата центре на фиксированном публичном ("белом") IP адресе и не прячется за домашним роутером, ему не нужно опрашивать STUN серверы и первым рассылать проверочные пакеты клиентам. В режиме ICE Lite сервер просто публикует свой IP и порт и отвечает на входящие проверки от браузера. Это экономит процессорное время сервера и ускоряет подключение.
- Trickle ICE (Капельный ICE, RFC 8838) В старом режиме ICE браузер сначала несколько секунд собирал абсолютно все свои адреса (опрашивал сетевые карты, STUN и TURN) и только потом одним большим списком отправлял их серверу. В режиме Trickle ICE браузер передает кандидатов "по капле" параллельно по мере их обнаружения в первую же миллисекунду отсылает локальный адрес, через 20 мс - адрес от STUN. В итоге соединение с SFU устанавливается почти мгновенно.
- ICE TCP (Прямой ICE поверх TCP, RFC 6544) В некоторых общественных сетях Wi Fi и офисах системные администраторы блокируют протокол UDP. Стандарт ICE TCP позволяет SFU открыть обычный TCP порт и принимать медиапакеты напрямую от браузера без участия TURN сервера (каждый RTP пакет при этом предваряется двухбайтовым заголовком длины по стандарту RFC 4571). Он бывает трех подтипов passive (сервер ждет входящее соединение - основной режим для SFU), active (клиент сам открывает соединение) и so (simultaneous open - одновременный встречный пробой).
- ICE Restart (Перезапуск ICE) Механизм быстрого восстановления связи при смене сети. Когда человек во время звонка выходит из дома и телефон переключается с Wi Fi на 4G/5G, его IP адрес меняется. Чтобы не сбрасывать весь звонок и не пересоздавать сессию в комнате, браузер генерирует новые пароли ICE (ice ufrag и ice pwd), за доли секунды прокладывает новый маршрут к SFU и продолжает передавать видео в тот же самый поток.
Зачем перед SFU нужен TURN сервер, если есть ICE Lite и ICE TCP?
Благодаря ICE Lite и ICE TCP около 90–95% пользователей подключаются к SFU напрямую. TURN сервер необходим для оставшихся 5–10% пользователей в самых жестких сетях, где работают строгие корпоративные брандмауэры, банковские прокси и провайдерские системы глубокой фильтрации DPI
- Маскировка под HTTPS (TURN over TLS) На прямом соединении с SFU по ICE TCP рукопожатие начинается с открытых нешифрованных пакетов STUN. Система фильтрации DPI на порту 443 видит, что внутри идет не настоящий веб трафик TLS, и обрывает связь. И только при подключении к TURN серверу по схеме turns443 браузер сначала устанавливает полноценное криптографическое соединение TLS (точно такое же, как при входе в интернет банк), внутрь которого уже прячет все пакеты WebRTC.
- Проход через офисные HTTP прокси В закрытых корпоративных сетях, где компьютеры вообще не имеют прямого выхода в интернет, браузер умеет пробивать туннель до TURN сервера через штатный корпоративный прокси сервер методом HTTP CONNECT.
- Мультиплексирование на одном порту В современной архитектуре на внешнем порту 443 ставят умный балансировщик (или встроенный в SFU TURN модуль), который принимает замаскированный TLS поток, снимает внешнюю оболочку TLS в памяти сервера и сразу передает пакеты в ядро SFU без задержек на пересылку по сети.
Гео каскадирование серверов
Когда в одной конференции собираются люди из Ташкента, Франкфурта и Нью Йорка или на трансляцию приходят десятки тысяч зрителей, одного сервера становится недостаточно. В этом случае применяется гео каскадирование - объединение нескольких SFU в разных дата центрах в общую сеть.
Участники из каждого региона подключаются к ближайшему местному серверу с минимальным пингом (10–20 мс). При этом между городами и континентами по выделенным магистральным каналам дата центров пересылается всего одна копия потока, которую принимающий региональный SFU размножает для своих местных зрителей.
Сквозное шифрование в групповых звонках Insertable Streams и MLS
В обычном WebRTC используется шифрование DTLS SRTP, которое защищает поток только на участке от браузера до сервера (Hop by Hop). Классический SFU обязан расшифровать входящий пакет в своей оперативной памяти, чтобы прочитать служебные заголовки, переписать номера пакетов под конкретного зрителя и заново зашифровать поток ключом этого зрителя. Это означает, что владелец сервера технически имеет доступ к звуку и видео внутри памяти SFU.
Чтобы защитить разговор даже от владельца сервера, применяется сквозное шифрование (E2EE - End to End Encryption) на базе связки Insertable Streams и протокола MLS.
Как работают Insertable Streams (WebRTC Encoded Transform)
Обычный конвейер браузера работает как закрытый черный ящик Камера → Видеокодек → Упаковка в RTP и шифрование SRTP → Сеть. Если зашифровать весь RTP пакет целиком на стороне клиента, сервер SFU ослепнет и не сможет прочитать, где тут опорный кадр, какой это слой качества (Simulcast/SVC) и кому его пересылать.
Механизм Insertable Streams (WebRTC Encoded Transform) врезается ровно посередине этого конвейера - после видеокодека, но до упаковки в RTP пакеты
- Когда видеокодек (например, VP9 или AV1) сжал кадр видео, браузер передает массив байтов этого кадра в специальный фоновый скрипт (Web Worker).
- Скрипт шифрует только саму картинку (полезную нагрузку) по стандарту SFrame (Secure Frame, RFC 9605) секретным групповым ключом, которого нет у сервера.
- Зашифрованный кадр возвращается обратно в браузер, который упаковывает его в стандартные RTP пакеты и прикрепляет открытую внешнюю этикетку - незашифрованный заголовок RTP и дескриптор зависимостей (Dependency Descriptor).
- В результате SFU видит открытую этикетку ("это кадр №540, средний слой 540p, не опорный"), свободно переключает слои качества под интернет зрителей, но внутри самой "шкатулки" видит только зашифрованный шум.
Как работает протокол MLS (Messaging Layer Security, RFC 9420)
Главная проблема сквозного шифрования в больших группах - раздача и смена ключей. Чтобы новый участник не мог прочитать прошлое звонка (Forward Secrecy), а вышедший участник тут же терял доступ к текущему разговору (Post Compromise Security), общий секретный ключ нужно менять при каждом входе и выходе человека.
В старых системах при смене ключа каждый участник шифровал новый ключ поочередно для каждого соседа в комнате. Для 10 человек это 100 операций, но для комнаты на 1000 человек количество операций при каждом входе или выходе вырастает до миллиона - квадратичная сложность O(N2), что моментально вешает браузеры.
Протокол MLS (Messaging Layer Security, RFC 9420) решил эту задачу с помощью криптографической структуры TreeKEM (бинарное дерево ключей)
- Все участники комнаты размещаются в нижних узлах (листьях) виртуального бинарного дерева, а на самой вершине (в корне дерева) находится общий групповой ключ шифрования медиапотока.
- Каждый участник знает секретные ключи только вдоль своей прямой ветки от своего листа до корня дерева.
- Когда один человек выходит из комнаты на 1024 участника, системе не нужно рассылать 1024 индивидуальных сообщения - достаточно обновить всего 10 узлов вдоль одной ветки дерева 2(1024)=10. Благодаря логарифмической сложности O(N) ротация ключей в огромных конференциях происходит за считанные миллисекунды.
Универсальные шлюзы WHIP и WHEP и подключение ИИ
Создатели WebRTC детально стандартизировали передачу медиапотоков, но намеренно не описали единого протокола первоначальной договоренности о звонке (сигналинга). В результате у каждого медиасервера (Mediasoup, LiveKit, Janus) появился свой собственный формат JSON сообщений поверх WebSocket, из за чего студийные программы вроде OBS Studio или аппаратные энкодеры годами не могли работать с WebRTC напрямую и использовали устаревший протокол RTMP с задержкой в 3–5 секунд.
Эту проблему решили два стандарта переходника от IETF
- WHIP (WebRTC HTTP Ingestion Protocol, RFC 9725 - на вход в сервер) Позволяет любой программе для стриминга (включая OBS Studio и FFmpeg) начать вещание в любой SFU за долю секунды, отправив параметры сессии (SDP Offer) одним стандартным запросом HTTP POST на веб адрес сервера и получив ответ 201 Created (SDP Answer).
- WHEP (WebRTC HTTP Egress Protocol - на выход к зрителю) Позволяет любому легковесному плееру в браузере, мобильном приложении или Smart TV забрать живой поток из SFU по обычной веб ссылке одним HTTP запросом без подключения тяжелых проприетарных библиотек конкретного сервера.
- Внутренние шлюзы для ИИ Современные SFU имеют прямые серверные интерфейсы для подключения нейросетей (моделей распознавания и синтеза речи или мультимодальных голосовых ассистентов). Нейросеть подключается к комнате на уровне памяти сервера как виртуальный участник, получает чистый аудиопоток без интернет задержек и мгновенно возвращает сгенерированный голосовой ответ.
Подробный разбор QUIC и MoQ будущее доставки видео
Классический стек WebRTC создавался более пятнадцати лет назад как сложный многослойный пирог из разных протоколов (SDP + ICE + STUN/TURN + DTLS + SRTP + SCTP). У него есть две фундаментальные проблемы при масштабировании
- Сложное и долгое подключение Чтобы запустить звонок, устройству нужно провести цепочку отдельных рукопожатий (проверка ICE, затем криптографическое рукопожатие DTLS, затем настройка SRTP).
- Несовместимость с дешевыми сетями доставки контента (CDN) В WebRTC каждый зритель поддерживает индивидуальную зашифрованную сессию с сервером SFU. Если трансляцию смотрят 100 000 человек, вам придется арендовать сотню мощных SFU серверов, потому что обычные кэширующие серверы CDN (Cloudflare, Akamai, Fastly) умеют раздавать только статические файлы (как в HLS/DASH с задержкой 5–15 секунд) и не понимают потоковый WebRTC.
Чтобы объединить мгновенную скорость WebRTC с копеечным масштабированием через CDN, индустрия переходит на связку транспортного протокола QUIC и медиапротокола MoQ (Media over QUIC).
Как устроен протокол QUIC (RFC 9000)
QUIC (RFC 9000) - это транспортный протокол поверх UDP, который заменяет собой сразу связку TCP + TLS и решает главные проблемы передачи данных в реальном времени
- Мгновенный старт (1 RTT и 0 RTT) В QUIC шифрование TLS 1.3 встроено прямо в сам транспортный протокол. Установка соединения и обмен ключами происходят одновременно за один оборот пакета (1 RTT), а при повторном подключении к знакомому серверу данные летят с первой же миллисекунды (0 RTT).
- Независимые потоки без блокировки очереди (No Head of Line Blocking) Если передавать аудио и видео через обычный протокол TCP, потеря одного пакета с тяжелым видеокадром заставляет операционную систему остановить чтение всего TCP соединения, пока потерянный пакет не перешлют заново. Из за этого вместе с видео заикается и звук, который уже давно дошел до телефона. В QUIC внутри одного соединения создаются десятки легких независимых логических потоков (QUIC Streams) и быстрых датаграмм (QUIC Datagrams, RFC 9221). Если в потоке с видео потерялся пакет, соседний поток с голосом продолжает воспроизводиться без единой запинки.
- Бесшовная миграция соединения (Connection Migration) В старых протоколах соединение жестко привязано к паре "IP адрес + порт". Когда вы выходите из дома и смартфон переключается с Wi Fi на 5G, IP адрес меняется и связь рвется (требуя перезапуска ICE Restart). В QUIC каждое соединение идентифицируется криптографическим номером Connection ID (CID) в заголовке пакета. Когда телефон меняет сеть на 5G, он просто продолжает слать пакеты со старым Connection ID с нового IP адреса, и сервер узнает его на лету без потери ни одного кадра.
Как работает стандарт MoQ (Media over QUIC)
MoQ (Media over QUIC) - это протокол уровня приложения поверх QUIC, который описывает, как именно упаковывать, приоритизировать и кэшировать живой звук и видео
- Объектная модель данных (Tracks → Groups → Objects) Вместо бесконечного неразрывного потока пакетов (как в RTP) MoQ организует трансляцию в четкую иерархию именованных объектов. Канал вещания делится на дорожки (Tracks) отдельно аудио, отдельно видео 1080p, отдельно видео 360p, отдельно субтитры. Каждая видеодорожка нарезается на группы (Groups) - это короткие независимые отрезки видео (обычно GOP - Group of Pictures длительностью 1–2 секунды, начинающиеся с полного опорного кадра). Внутри группы лежат отдельные объекты (Objects) - конкретные видеокадры, которые стримятся кадр за кадром по мере их выхода из камеры с задержкой в десятки миллисекунд.
- Отдельный QUIC поток на каждую группу кадров и умные приоритеты Каждая новая группа кадров (GOP) отправляется в собственном независимом QUIC потоке с явно заданным приоритетом (Delivery Priority). Если человек зашел в лифт и старая группа видеокадров застряла при передаче, сервер не пытается бесконечно досылать устаревшее видео - он дает максимальный приоритет 1) звуку, 2) самой свежей группе кадров, а старый застрявший поток просто закрывает командой STOP_SENDING. Благодаря этому видео никогда не отстает от живого разговора.
- Дешевое масштабирование через кэширующие реле (MoQ Relays / CDN) Поскольку каждый кадр в MoQ имеет уникальное имя (ID трансляции + ID дорожки + номер группы + номер кадра), промежуточным серверам больше не нужно понимать устройство видеокодеков или расшифровывать медиаданные. Обычный пограничный сервер CDN (MoQ Relay) получает один поток от автора с задержкой 100 мс, складывает именованные кусочки в быструю оперативную память и раздает их сотням тысяч зрителей по модели подписки (Pub/Sub), одновременно позволяя перематывать эфир назад на несколько секунд.
Почему блокировки UDP не страшны
Некоторые интернет провайдеры, корпоративные сети и старые домашние роутеры блокируют или искусственно замедляют протокол UDP, на котором работают как WebRTC, так и QUIC. Чтобы пользователь никогда не сталкивался с ошибкой подключения, клиенты используют механизм Happy Eyeballs ("гонка подключений") - принцип, изначально созданный в RFC 6555 / RFC 8305 для параллельной гонки между IPv6 и IPv4, а сегодня применяемый также для гонки между протоколами UDP и TCP (в рамках ICE RFC 8421, HTTP/3 RFC 9114 и Happy Eyeballs v3). Приложение пытается установить связь по скоростному UDP, но если за 150–200 миллисекунд ответ не пришел, параллельно и незаметно для человека переводит трафик на резервные рельсы поверх протокола TCP (для WebRTC это связка ICE TCP и TURN over TLS, а для QUIC/MoQ - автоматический откат WebTransport на HTTP/2 поверх TCP+TLS).
В результате сетевая архитектура современного медиасервера сводится к двум входным дверям на стандартном веб порту 443
- Дверь UDP443 Принимает около 90% всего медиатрафика на максимальной скорости и с минимальной задержкой. Умный сетевой демультиплексор на входе смотрит на первые байты пакета и за наносекунды распределяет трафик пакеты STUN/DTLS/SRTP направляет в движок классического WebRTC, а пакеты QUIC - в движок MoQ.
- Дверь TCP443 Принимает сигнальные команды управления, HTTP запросы WHIP и WHEP, прямые соединения ICE TCP, резервный поток HTTP/2 и замаскированный под обычный HTTPS сайт трафик TURN over TLS, гарантируя 100% проходимость звонков и трансляций в любых сетях мира.
Готовые платформы для создания видеосерверов
В зависимости от задачи разработчики выбирают в качестве ядра одну из проверенных открытых платформ
- Mediasoup (C++ и Rust) Сверхбыстрая низкоуровневая библиотека конструктор с архитектурой Shared Nothing для тех, кто хочет выжать максимум потоков из каждого ядра процессора и написать собственную бизнес логику управления комнатами на Node.js или Rust.
- Janus WebRTC Server © Легковесный модульный ветеран рынка с минимальным потреблением памяти, который отлично подходит для встраиваемых систем, стыковки браузеров с классической офисной телефонией SIP и IP камерами наблюдения (RTSP).
- Pion / Ion SFU (Go) Набор гибких библиотек протоколов WebRTC на языке Go, позволяющий быстро собрать собственный специализированный медиасервер, кастомный шлюз или серверный рекордер с нуля.
- Slyber SFU Server (Go) Готовый распределенный медиасервер "из коробки" со встроенным гео каскадированием, интегрированным TURN/TLS шлюзом на порту 443, поддержкой WHIP/WHEP и готовым фреймворком для подключения голосовых и видео агентов ИИ.