Мессенджер Signal выпустил обновление, в котором максимальное количество участников групповых аудио- и видеозвонков увеличилось с пяти до 40. Разработчики объяснили, как им удалось решить проблему поддержки групповых звонков с большим количеством участников и сквозным шифрованием одновременно.
По словам представителей мессенджера, они столкнулись с проблемой того, что, если все участники шлют свои аудио и видеофайлы каждому другому участнику по отдельности и так же получают их (full mesh), то сквозное шифрование работает, но многим участникам будет не хватать пропускной способности, так как в звонке на 40 человек надо поддерживать 39 соединений. Когда же каждый участник шлет свои аудио и видео на сервер, а сервер перенаправляет единственный аудио и видеопоток для каждого другого участника, то пропускной способности будет хватать, но не работает сквозное шифрование.
В итоге разработчики выбрали альтернативный вариант: Selective Forwarding Unit, когда каждый участник шлет свои аудио и видео на сервер, а сервер пересылает их остальным, не расшифровывая. Команда Signal самостоятельно создала службу обработки сигналов с открытым исходным кодом и выложила код на GitHub.
Упрощенная версия основного цикла в коде в SFU выглядит так:
Команда Signal оценила множество SFU с открытым исходным кодом, но только два из них, как отмечается, имели адекватный контроль перегрузки. Разработчики запустили групповые вызовы с использованием модифицированной версии одного из этих серверов, но вскоре обнаружили, что даже с серьезными модификациями не могут надежно масштабировать число участников, если оно больше восьми, из-за высокой загрузки ЦП. Тогда они написали SFU с нуля на Rust.
Самой сложной частью разработки SFU была организация пересылки видео с правильным разрешением каждому участнику вызова, в то время как условия сети постоянно меняются. Команда объединила несколько техник: Simulcast и Packet Rewriting позволяют переключаться между различными разрешениями видео, Congestion Control определяет правильный объем для отправки, а Rate Allocation определяет, что отправлять в рамках этого объема.
Реализация сквозного шифрования хранится в RingRTC, библиотеке видеозвонков с открытым исходным кодом, написанной на Rust. Содержимое каждого кадра пересылаемого видео зашифровывается перед разделением на пакеты, как в SFrame. Когда клиент присоединяется к вызову, он генерирует ключ и отправляет его всем другим участникам созвона в виде сообщения, которое уже защищено шифрованием Signal. Он использует этот ключ для шифрования носителя перед его отправкой в SFU. Каждый раз, когда какой-либо пользователь присоединяется к вызову, он генерирует новый ключ и отправляет его всем остальным участникам.
В ноябре Signal добавил блокировку спам-сообщений и отправку жалоб прямо на странице с перепиской. Теперь пользователи мессенджера могут блокировать и сообщать о спаме в один клик. При отправке жалобы на серверы мессенджера поступают только телефон и ID предполагаемого нарушителя. Эти данные соотносятся с другими обращениями. Если один и тот же телефонный номер и ID будут отмечены в нескольких жалобах или система обнаружит признаки того, что аккаунт используется для рассылки спама, Signal попросит пройти базовую проверку на «человечность». Среди одного из методов проверки указан CAPTCHA. Пользователь не сможет отправлять новые сообщения, пока не подтвердит, что он человек.