Архитектура подсистемы WebRTC и WHEP
Подсистема WebRTC (internal/webrtc/) обеспечивает доставку видеопотоков в браузеры и мобильные приложения в реальном времени со сверхнизкой задержкой (< 500 мс) без плагинов и транскодирования.
1. Сигнализация по стандарту WHEP (WebRTC HTTP Egress Protocol)
RUSEON Core реализует спецификацию IETF WHEP на эндпоинте POST /stream/webrtc/whep/:id:
- Простота интеграции: Браузер инициирует воспроизведение стандартным HTTP
POSTзапросом с SDP Offer в теле (Content-Type: application/sdp). - RESTful ответ: Сервер возвращает
201 Createdс SDP Answer. - Мультиплексирование UDP: Все WebRTC-сессии работают через единый порт (
8555/UDPпо умолчанию) черезserver.webrtc.listen_port, что исключает необходимость открытия сотен портов в фаерволе.
2. Адаптивный сетевой батчинг sendmmsg ядра Linux
Для масштабирования на сотни одновременных зрителей RUSEON Core реализует уровень адаптивного батчинга UDP (internal/webrtc/batch_linux.go):
Принцип работы батчера:
- 64-шардовая таблица пиров (
peerShard): Сессии клиентов (netip.AddrPort) распределяются по 64 шардам с независимыми мьютексами, исключая взаимные блокировки при тысячах зрителей. - Мгновенный хендшейк: Управляющие пакеты (STUN, DTLS) отправляются немедленно без накопления в батче.
- Сброс по маркерному биту кадра ($M=1$): Видеопакеты RTP сбрасываются в сетевой стек через системный вызов
sendmmsgсразу при обнаружении бита завершения кадра ($M=1$ по RFC 6184) либо при заполнении буфера из 32 пакетов. - Экономия ресурсов CPU: Снижает число системных вызовов и переключений контекста ядра на 85–90%.
- Кроссплатформенность: На системах Windows и macOS автоматически используется стандартный I/O (
batch_generic.go).
3. WebRTC DataChannels для передачи метаданных ИИ
Каждое соединение WebRTC открывает канал SCTP DataChannel (label: "metadata"):
- Координаты рамок детекций, классы объектов и уверенность передаются в формате компактного JSON.
- Задержка доставки метаданных составляет
< 50 мс, они синхронизированы с видеокадрами на Canvas-слое плеера.
4. Конфигурация WebRTC в YAML
yaml
server:
webrtc:
listen_port: 8555
nat_1_to_1_ips:
- "203.0.113.50"
ice_servers:
- "stun:stun.l.google.com:19302"
ice_transport_policy: "all"