Как работает традиционная VoIP

В большинстве корпоративных мессенджеров — Zoom, Teams, Google Meet — звонки работают через медиасерверы провайдера. Схема выглядит так:

// традиционная VoIP архитектура
Алиса ──────► Медиасервер ──────► Боб
              (Zoom/Teams/etc)

  Ваш голос → сервер → голос Боба
  Голос Боба → сервер → к вам

Медиасервер принимает, обрабатывает и пересылает аудио/видео потоки. Это означает несколько вещей: провайдер технически имеет доступ к вашим звонкам, задержка выше (трафик делает дополнительный прыжок), а нагрузка на серверы провайдера растёт с каждым участником.

Для групповых звонков такая архитектура вынуждена — нельзя установить P2P-соединение между 50 участниками. Но для разговора двух человек это излишне.

Что такое WebRTC

WebRTC (Web Real-Time Communication) — открытый стандарт для прямой передачи аудио, видео и данных между браузерами без промежуточных серверов. Разработан Google, стандартизован W3C и IETF, поддерживается во всех современных браузерах.

// WebRTC P2P архитектура
Алиса ─────────────────────────► Боб
         (прямое соединение)

  Ваш голос → напрямую к Бобу
  Никаких серверов между вами

WebRTC включает несколько компонентов:

  • RTCPeerConnection — управление P2P-соединением, кодеки, пропускная способность
  • MediaStream — захват микрофона и камеры
  • RTCDataChannel — передача произвольных данных по P2P

Важно: WebRTC шифрует все медиапотоки с помощью DTLS + SRTP — это обязательная часть стандарта. Незашифрованный WebRTC-звонок невозможен.

ICE, STUN и TURN: как устанавливается соединение

Главная проблема P2P — NAT (Network Address Translation). За большинством домашних и корпоративных роутеров устройства скрыты за общим IP-адресом. Напрямую подключиться к устройству за NAT невозможно без помощи.

Для решения этой проблемы WebRTC использует механизм ICE (Interactive Connectivity Establishment).

STUN-сервер

STUN (Session Traversal Utilities for NAT) — лёгкий сервер, который помогает устройству узнать свой внешний IP-адрес и тип NAT. Трафик звонка через STUN не проходит — он только помогает установить, как связаться.

// как работает STUN
Алиса → STUN: "какой у меня внешний IP?"
STUN → Алиса: "93.184.216.34:49152"

Боб → STUN: "какой у меня внешний IP?"
STUN → Боб: "198.51.100.42:52341"

Алиса ←→ Боб: прямое P2P соединение

TURN-сервер (запасной вариант)

Если NAT слишком строгий и прямое P2P установить не получается, используется TURN (Traversal Using Relays around NAT). TURN-сервер ретранслирует трафик, но при этом зашифрованный через DTLS — сервер не может его расшифровать.

В SecureChat STUN/TURN-серверы входят в комплект поставки и разворачиваются на вашем же сервере. Даже в худшем случае (TURN relay) трафик идёт через ваш сервер, а не сервер разработчика.

Почему P2P безопаснее

При P2P-звонке через WebRTC:

  • Нет доступа провайдера — голос и видео передаются напрямую, зашифрованными. Даже если сервер скомпрометирован, записей звонков там нет
  • DTLS handshake — каждое соединение использует уникальный ключ, согласованный напрямую между участниками
  • SRTP шифрование — медиа зашифровано стандартом Secure RTP на всём пути
  • Нет централизованного хранилища записей — записать звонок без ведома участников технически сложнее

Сравните с традиционной VoIP: провайдер теоретически может записывать и анализировать все звонки через свои медиасерверы. Для корпоративных переговоров, где обсуждается коммерческая тайна, это серьёзный риск.

Нагрузка на сервер и качество связи

P2P даёт конкретные технические преимущества помимо безопасности.

Нагрузка на сервер

При классической архитектуре каждый звонок нагружает медиасервер: нужно принять, декодировать, перекодировать и отправить аудио/видео. При P2P сервер не участвует в передаче медиа — только помог установить соединение через STUN.

// нагрузка на сервер
// Классическая VoIP: 100 одновременных звонков
server_bandwidth = 100 × 2 × (audio + video) ≈ 100+ Мбит/с

// WebRTC P2P: 100 одновременных звонков
server_bandwidth ≈ 0 (STUN трафик — несколько байт)

Задержка

Прямое соединение на 1–2 прыжка короче маршрута через медиасервер. Практически это означает меньшую задержку (latency) и лучшее качество голоса при одинаковом интернет-канале.

Как это реализовано в SecureChat

SecureChat использует WebRTC для всех личных звонков — голосовых и видео. Серверная часть участвует только в трёх случаях:

  • Сигналинг — обмен SDP-описаниями для установки соединения (несколько килобайт)
  • STUN — определение внешнего адреса (несколько пакетов)
  • TURN relay — только если P2P невозможен из-за NAT (трафик зашифрован)

Для групповых звонков (3+ участника) используется архитектура SFU (Selective Forwarding Unit) — минимальный сервер маршрутизации, который не декодирует медиапотоки, а лишь перенаправляет зашифрованные пакеты нужным участникам.

В итоге: для личных звонков ваш сервер вообще не видит медиапоток. Для групповых — видит зашифрованные байты без возможности расшифровать. В обоих случаях содержимое разговора доступно только участникам.