Раздел 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 #подготовка-к-интервью