Гайды
Введение в 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