Гайды

Введение в WebRTC и P2P-коммуникации

STUN, TURN и сигнalling, SDP и ICE, mesh vs SFU, безопасность и готовые медиа-стеки.

~9 мин чтения

Введение в WebRTC и P2P-коммуникации

WebRTC (Web Real-Time Communication) — набор протоколов и API браузера для медиа (аудио/видео) и данных (DataChannel) между пирами с низкой задержкой. Часто нужен сигнальный сервер (обмен SDP/ICE по WebSocket) и TURN/STUN для прохождения NAT. Связь с WebSocket в приложении — WebSockets и чат на FastAPI.


1. Три типичных компонента

РольНазначение
STUNУзнать публичный адрес клиента (ICE candidate)
TURNРетрансляция медиа, если прямой P2P невозможен (симметричный NAT и т.д.)
СигналингОбмен SDP offer/answer и ICE кандидатами до установления сессии

Сигналинг не стандартизирован WebRTC — выбираете JSON поверх WS/SIP и т.д.


2. SDP и ICE

SDP (Session Description Protocol) описывает кодеки, порты, fingerprint для DTLS-SRTP.
ICE собирает кандидаты (host, srflx, relay); connectivity checks выбирают рабочую пару.

Trickle ICE — отправка кандидатов по мере появления, а не одним блоком после setLocalDescription. Снижает время до первого медиа-пакета; сигнальный протокол должен поддерживать инкрементальные сообщения.

mDNS в Chrome (*.local host-кандидаты) улучшает privacy в LAN, но ломает отладку, если ваш SFU/бэкенд не понимает такие адреса — при необходимости отключайте policy на dev-стенде осознанно.


3. Браузерный API (идея)

RTCPeerConnection, createOffer/setRemoteDescription, onicecandidate → отправка на сигнальный сервер → другой пир вызывает setRemoteDescription / addIceCandidate.


4. SFU vs mesh

  • Mesh — каждый с каждым; много потоков, плохо масштабируется.
  • SFU (Selective Forwarding Unit) — сервер пересылает потоки без транскодинга (типично для групповых звонков).
  • MCU — смешивание/транскодинг на сервере (дороже).

5. Безопасность

  • DTLS для шифрования медиа; контроль целостности ключей (fingerprints в SDP).
  • Защита сигнального канала (TLS).
  • Ограничение кто может инициировать звонок (аутентификация).

6. Серверные стеки

mediasoup, Janus, Jitsi, облачные Agora/Twilio — готовые SFU/инфраструктура. Писать свой полноценный SFU — большой проект.


7. ICE restart и мобильные сети

При смене сети (Wi‑Fi → LTE) соединение может «подвиснуть» — iceRestart в новом offer перезапускает сбор кандидатов. На мобильных закладывайте частые ICE disconnect и UX с быстрым reconnect.


8. DataChannel и бэкпрешер

Ordered / maxRetransmits настраивают надёжность vs latency для не-медиа данных. Большие бинарные пакеты дробите — MTU и буферы SCTP ограничивают размер; контролируйте bufferedAmount на отправителе.


9. Кодеки и качество

SDP negotiation выбирает VP8/VP9/H.264 — набор зависит от браузера и лицензий. Simulcast и SVC на SFU дают адаптивное качество; на mesh почти не применимо.


10. Чек-лист

  • Поднят свой TURN (coturn) или надёжный SaaS (UDP/TCP 3478, диапазон relay-портов задан и открыт в firewall).
  • Сигналинг stateless по возможности + id комнаты.
  • Метрики: процент успешных соединений, доля relay.
  • Не хранить медиа на сигнальном сервере без необходимости.
  • Rate limit на сигналинг (создание комнат, flood ICE).
  • Политика записи звонков (GDPR/consent), если пишете медиа.

Дальше: тег WebRTC