Современные видеочаты и анонимные мессенджеры построены на стеке технологий WebRTC (Web Real-Time Communication). Это открытый стандарт, обеспечивающий передачу аудио, видео и данных в реальном времени напрямую между браузерами или устройствами пользователей без необходимости установки плагинов; В основе всего процесса лежит сессия — временной интервал, в течение которого происходит установление соединения, обмен медиапотоками и разрыв связи.
Ниже подробно разобраны этапы жизненного цикла сессии, протоколы прохождения NAT, архитектурные паттерны и особенности анонимных чатов.
Архитектура сессии: P2P vs SFU/MCU
Выбор топологии определяет, как именно будут маршрутизироваться медиапотоки во время сессии.
Peer-to-Peer (P2P) — Прямое соединение
Идеальный сценарий для 1-на-1 вызовов. После прохождения сигнализации и ICE-negoциации браузеры устанавливают прямой UDP-канал между собой. Данные не проходят через медиасервер, что минимизирует задержку (latency) и нагрузку на инфраструктуру разработчика.
- Плюсы: Минимальная латентность, отсутствие затрат на пропускную способность сервера, максимальная приватность (нет промежуточного узла).
- Минусы: Не масштабируется на группы > 3-4 человек (требуется N2 соединений), сложно обойти симметричные NAT без TURN.
SFU (Selective Forwarding Unit) — Выборочная пересылка
Стандарт де-факто для групповых вызовов и современных анонимных чатов (например, Clubhouse, Discord, Telegram Calls). SFU-сервер принимает входящие потоки от каждого участника и пересылает их остальным без перекодирования (транскодинга).
- Участник отправляет 1 исходящий поток и получает N-1 входящих.
- Сервер может присылать разные качества видео (Simulcast / SVC) в зависимости от канала получателя.
- Нагрузка на CPU сервера низкая (нет кодирования), основная нагрузка — на сетевую карту (bandwidth).
MCU (Multipoint Control Unit) — Смешивание
Устаревший, но все еще используемый в некоторых корпоративных системах подход. Сервер декодирует все потоки, смешивает их в один композитный (например, «сетка» 4х4) и кодирует обратно для каждого участника.
- Плюсы: Клиент получает всего 1 поток (экономия полосы клиента).
- Минусы: Огромная нагрузка на CPU/GPU сервера, добавляемая задержка на кодирование, фиксированный лейаут.
Фаза сигнализации (Signaling): «Договорная встреча»
WebRTC не определяет протокол сигнализации — это задача приложения (обычно WebSocket, HTTP/2, MQTT или gRPC). До того как медиапотоки потекут, пиры должны обменяться метаданными.
SDP (Session Description Protocol)
SDP, это протокол переговоров между узлами. Он содержит:
- Список доступных аудио- и видеокодеков (VP8, VP9, H.264, H.265, AV1, Opus, G.711).
- ICE-кандидаты (IP-адреса и порты для подключения).
- Информацию о топологии сети и полосе пропускания;
- Отпечатки DTLS-сертификатов для шифрования.
- Параметры SCTP (для Data Channels).
Процесс Offer/Answer
- Initiator (Caller) создает
RTCPeerConnection, добавляет треки (камера/микрофон), генерирует Offer (SDP) и отправляет через сигнальный сервер. - Receiver (Callee) получает Offer, устанавливает его как
RemoteDescription, создает Answer (SDP) со своими кодеками и ICE-кандидатами, отправляет обратно. - Обе стороны устанавливают
LocalDescriptionиRemoteDescription. Начинается ICE-negoциация.
ICE Framework: Пробивание NAT и Firewall
ICE (Interactive Connectivity Establishment), это фреймворк, задача которого — найти рабочий путь между двумя узлами за NAT/Firewall. Это критически важный этап для анонимных чатов, где пользователи часто за корпоративными фаерволами или симметричными NAT.
Типы ICE-кандидатов
- Host Candidate: Локальный IP/порт интерфейса (Wi-Fi, Ethernet, VPN). Работает только в одной LAN.
- Server Reflexive (srflx): Публичный IP/порт, полученный через STUN-сервер. Показывает, как внешний мир видит клиента.
- Relay Candidate (TURN): IP/порт на TURN-сервере. Медиа трафик идет через сервер. Используется как fallback.
STUN (Session Traversal Utilities for NAT)
Легковесный протокол (RFC 5389). Клиент шлет запрос на STUN-сервер, сервер отвечает: «Ты виден мне как IP:Port». Это позволяет клиенту узнать свой внешний адрес и сгенерировать srflx-кандидаты. STUN не проксирует трафик.
TURN (Traversal Using Relays around NAT)
Тяжелая артиллерия (RFC 5766). Если прямое соединение (P2P) не удалось (симметричный NAT, блокировка UDP), клиент устанавливает TCP/TLS-соединение с TURN-сервером и просит выделить порт для ретрансляции.
- TURN over TLS (TURNS): Шифрованный канал управления и данными (порт 443), проходит почти любые корпоративные прокси и DPI.
- Цена: Весь медиа-трафик идет через сервер. Требует мощных каналов и оплаты трафика.
ICE Nomination & Controlling/Controlled
Стороны проверяют пары кандидатов (Connectivity Checks — STUN Binding Requests) по приоритету. Роль Controlling (обычно Caller) делает финальный выбор (Nominated) пары, которую будут использовать обе стороны.
Транспортный уровень: Безопасность и Надежность
После успешного ICE соединение установлено на уровне UDP. Но WebRTC требует шифрования и контроля перегрузки.
DTLS (Datagram Transport Layer Security)
Рукопожатие происходит поверх UDP до передачи медиа. Используются отпечатки сертификатов, обменянные в SDP (функция a=fingerprint:sha-256 ...). Обе стороны проверяют отпечатки — это защита от MITM (Man-in-the-Middle). Ключи, выработанные в DTLS, экспортируются в SRTP.
SRTP (Secure Real-time Transport Protocol)
Сам медиа-трафик (аудио/видео) шифруется по ключам из DTLS (DTLS-SRTP). Используются шифры AES_CM_128_HMAC_SHA1_80 или AEAD_AES_256_GCM. Защищает конфиденциальность и целостность пакетов;
SCTP over DTLS (Data Channels)
Для текстового чата, файлов, сигнализации внутри сессии (например, переключение камеры) используется SCTP (Stream Control Transmission Protocol), инкапсулированный в DTLS.
- Поддерживает надежную (как TCP) и ненадежную (как UDP, но с порядком) доставку.
- Мультиплексирование: много логических потоков внутри одного UDP-порта (порт 50000 по умолчанию).
- В анонимных чатах Data Channels часто используются для E2E-шифрованного текста (Signal Protocol / MLS), не доверяя серверу сигнализации.
Контроль перегрузки (Congestion Control)
WebRTC использует GCC (Google Congestion Control) / NADA / SCReAM. Анализируется задержка (OWD, One Way Delay) и потеря пакетов (REMB / Transport-wide CC). Энкодер динамически меняет битрейт/разрешение видео в реальном времени.
Особенности сессии в Анонимных чатах
Анонимность накладывает отпечаток на всю архитектуру сессии.
Защита IP-адреса (IP Leak Prevention)
- Проблема: ICE собирает все локальные IP (включая VPN, Docker, IPv6), которые уходят в SDP и могут утечь собеседнику до принятия вызова.
- Решение: Политика
iceTransportPolicy: "relay"(принудительное использование только TURN-кандидатов). Это скрывает реальный IP, но увеличивает задержку и нагрузку на TURN. - mDNS ICE candidates: В браузерах (Chrome/Firefox) локальные IP маскируются в виде
a8b3c2d1.localдо момента согласия пользователя на звонок.
E2EE (End-to-End Encryption) для медиа
В SFU-архитектуре сервер видит SRTP-пакеты (заголовки RTP, SSRC, sequence numbers), но не может их расшифровать без DTLS-ключей. Для полной анонимности:
- Используется Insertable Streams API (WebRTC Encoded Transform) для шифрования фреймов до отправки в
RTCPeerConnection(SFrame / MLS). - SFU становится «слепым» переключателем (blind forwarder).
Сигнализация без идентификации
- WebSocket-соединение к сигнальному серверу проходит через Tor / VPN / Domain Fronting;
- Аутентификация — через одноразовые токены или Zero-Knowledge Proofs, без логина/пароля.
- Metadata minimization: в SDP не передаются device names, user agents, версии ОС.
Data Channels для текста
Текстовые сообщения в анонимном чате лучше идти через Data Channels (SCTP) с собственным слоем E2EE (Double Ratchet / MLS), а не через сигнальный сервер. Это исключает логирование переписки на бэкенде.
Жизненный цикл сессии: Пошаговый сценарий
- Init: Пользователь А нажимает «Вызвать». Создается
RTCPeerConnection(конфиг: STUN/TURN URLs,iceTransportPolicy, bundle policy). - Media Capture:
getUserMedia запрашивает камеру/микрофон. Треки добавляются в PC (addTrack). - Signaling (Offer):
createOffer -> setLocalDescription. SDP Offer уходит по WebSocket (сигнализация). - Signaling (Answer): Пользователь Б получает Offer,
setRemoteDescription,getUserMedia,createAnswer -> setLocalDescription. Answer уходит обратно. - ICE Gathering: Обе стороны собирают кандидатов (host, srflx via STUN, relay via TURN). Кандидаты триклят (trickle ICE) через сигнализацию в реальном времени.
- ICE Connectivity Checks: STUN Binding Requests/Responses между парами кандидатов. Состояние
iceConnectionState: checking -> connected / completed. - DTLS Handshake: Рукопожатие поверх выбранной пары UDP. Проверка отпечатков сертификатов. Состояние
connectionState: connected. - Media Flow: Начинается обмен SRTP пакетами. RTCP Sender/Receiver Reports для мониторинга QoS. PLI/FIR/NACK для восстановления потерь.
- Mid-session Changes: Renegotiation (add/remove track, change codec, simulcast layers) -> новый Offer/Answer. ICE Restart при смене сети (WiFi -> LTE).
- Termination:
pc.close. Отправка BYE по сигнализации. Освобождение портов TURN, остановка треков.
Ключевые метрики качества сессии (QoS/QoE)
Для мониторинга в продакшене (getStats API):
- RTT (Round Trip Time): Задержка туда-обратно. < 150ms — отлично, > 400ms — плохо.
- Jitter: Разброс задержки. Критично для аудио; Буферизация (jitter buffer) сглаживает.
- Packet Loss: Потери пакетов. > 1-2% заметно деградирует видео, > 5% ломает аудио (без FEC/RED).
- Bitrate / Resolution / Framerate: Адаптивность энкодера под доступный канал.
- ICE State / DTLS State: Диагностика проблем подключения (failed, disconnected, closed).
Сессия в современном видеочате, это сложный оркестр из сигнализации (SDP), пробивания NAT (ICE/STUN/TURN), криптографии (DTLS/SRTP) и адаптивного медиатранспорта (RTP/RTCP/SCTP).
Для обычных видеочатов приоритет, низкая латентность и качество (P2P или SFU с Simulcast). Для анонимных чатов приоритет смещается к приватности: принудительный TURN (ICE relay policy), E2EE на уровне фреймов (Insertable Streams), минимизация метаданных в сигнализации и использование Data Channels для текста. Понимание этих нюансов позволяет строить надежные, масштабируемые и безопасные системы реального времени.