Курс «Архитектура мессенджера» · Часть 6 · Звонки и реальное время

Раздел 22. Групповые звонки и шифрование

Mesh против SFU/MCU; групповое видео; E2EE в звонке.

Звонок 1-на-1 (Раздел 21) можно вести напрямую между устройствами. Но как только в звонке три, десять, пятьдесят человек, прямая схема разваливается, и приходится ставить сервер посередине. А сервер посередине, в свою очередь, конфликтует со сквозным шифрованием. Об этих двух вещах — раздел.

Почему нельзя «каждый шлёт всем»

Наивное решение группового звонка — полносвязная сеть (mesh): каждый участник отправляет свой поток напрямую каждому другому. Для группы из N человек каждое устройство должно:

  • отправлять свой поток N−1 раз (отдельно каждому);
  • принимать N−1 чужих потоков.

Узкое место — отдача (upload). У телефона канал на отдачу узкий, и процессор кодирует видео тоже не бесплатно. Отдать своё видео одному собеседнику — легко. Отдавать его же отдельно ещё девятерым — это девятикратная отдача и девятикратное кодирование: канал и батарея не тянут.

Поэтому полносвязная схема работает только для крошечных групп (3–4 человека). Дальше нужен сервер посередине, который снимет с устройств эту нагрузку. Есть два таких сервера — SFU и MCU.

SFU — пересылка потоков

SFU (Selective Forwarding Unit — «сервер выборочной пересылки потоков»). Каждый участник отправляет свой поток один раз — на SFU, а сервер копирует и пересылает этот поток всем остальным.

Полносвязная сеть (mesh):          SFU:
  A → B, A → C, A → D               A ──┐
  (каждый шлёт всем,                B ──┤── [SFU] ──→ раздаёт каждому
   отдача растёт с группой)         C ──┤            чужие потоки
                                    D ──┘

Что это даёт:

  • устройство отдаёт один поток независимо от размера группы (отдача больше не взрывается);
  • приём остаётся N−1 потоков, но канал на приём (download) обычно гораздо шире, чем на отдачу, так что это терпимо;
  • SFU не декодирует и не смешивает — он только маршрутизирует, поэтому работает легко и может быть умным: слать слабому участнику пониженное качество, передавать видео только активных говорящих и т. п.

Это основной подход для современных групповых видеозвонков.

MCU — микширование потоков

MCU (Multipoint Control Unit — «сервер-микшер потоков»). Он принимает потоки всех участников, декодирует их, смешивает в один общий поток (единая «сетка» видео + сведённый звук), заново кодирует и отправляет каждому участнику только один готовый поток.

  • Плюс: устройство скачивает один поток при любом размере группы — это спасает слабые устройства и узкие каналы.
  • Минус: сервер делает очень тяжёлую работу (декодировать + смешать + заново закодировать для всех) — это дорого по процессору, добавляет задержку, а готовая «сетка» негибкая (нельзя переставить раскладку на стороне клиента).

Что выбрать

mesh (каждый со всеми) SFU (пересылка) MCU (микширование)
Сервер не нужен лёгкий (только раздаёт) тяжёлый (декодирует + микширует)
Отдача устройства растёт с группой один поток один поток
Приём устройства N−1 потоков N−1 потоков один поток
Когда 3–4 человека стандарт для групп слабые устройства/каналы

Сквозное шифрование в групповом звонке

Теперь главный конфликт. Сервер посередине должен работать с медиа — а сквозное шифрование, E2EE (End-to-End Encryption — «шифрование от конца до конца»), требует, чтобы сервер содержимое не видел. Эти два желания тянут в разные стороны.

MCU и E2EE несовместимы. Чтобы смешать потоки, MCU обязан их декодировать — то есть увидеть в открытом виде. Микширующий сервер по своей природе ломает сквозное шифрование. Совместить настоящее E2EE и серверное микширование нельзя.

SFU и E2EE — можно, но сложнее. SFU только пересылает пакеты, ему не нужно декодировать само содержимое. Поэтому медиа в принципе может оставаться зашифрованным от участника к участнику, пока SFU маршрутизирует зашифрованные пакеты. Тонкость: обычное шифрование в WebRTC — «по участкам» (устройство ↔ SFU зашифровано, но на самом SFU данные открыты, чтобы он мог делать свои трюки с качеством). Для настоящего E2EE добавляют дополнительный слой шифрования: содержимое шифруют ключом, который знают только участники, поверх транспортного шифрования, — и тогда SFU раздаёт потоки, не видя содержимого.

И знакомая по Разделу 18 проблема: всем участникам нужен общий ключ для шифрования медиа, а смена состава звонка (кто-то подключился или вышел) требует перевыдачи ключа — то же самое, что с групповым шифрованием сообщений, только в реальном времени.

Практический итог: многие «зашифрованные» групповые звонки зашифрованы лишь по участкам (сервер технически видит медиа); настоящие сквозные групповые звонки сложнее и реже, особенно на большом масштабе.

Вопросы интервьюера (с разбором)

«Почему групповой звонок нельзя сделать просто „каждый со всеми"?» Образец: «Потому что в полносвязной схеме каждое устройство отдаёт свой поток отдельно каждому участнику. Узкое место — отдача и кодирование: на группу в десять человек это девятикратная отдача и нагрузка на процессор, чего телефон не тянет. Поэтому такая схема годится только для трёх-четырёх человек, а дальше ставят сервер посередине.»

«Чем SFU отличается от MCU и когда что выбирать?» Образец: «SFU только пересылает: каждый отдаёт один поток на сервер, тот раздаёт его остальным. Сервер лёгкий, схема гибкая — это стандарт для группового видео. MCU смешивает все потоки в один и отдаёт каждому один готовый поток: устройство скачивает только его, что хорошо для слабых устройств и узких каналов, но сервер делает тяжёлую работу и добавляет задержку. SFU беру по умолчанию, MCU — когда упираюсь в слабые клиентские устройства или каналы.»

«Почему сквозное шифрование в групповом звонке сложнее, и где оно вообще невозможно?» Образец: «С MCU оно невозможно: чтобы смешать потоки, сервер обязан их декодировать, то есть увидеть открытыми, — это ломает сквозное шифрование. С SFU оно возможно, потому что сервер только пересылает пакеты и может не видеть содержимого, но для этого нужен дополнительный слой шифрования под ключ, известный только участникам, поверх транспортного. Плюс остаётся задача общего ключа: при подключении и выходе участников ключ приходится перевыдавать — как и в групповом шифровании сообщений, только в реальном времени.»


#мессенджер #звонки #групповые-звонки #sfu-mcu #e2ee #подготовка-к-интервью