WebRTC Datachannel для приложений с высокой пропускной способностью - PullRequest
0 голосов
/ 27 мая 2019

Я хочу отправлять однонаправленные потоковые данные по каналу данных WebRTC, и ищу лучшие варианты конфигурации (высокая BW, низкая задержка / дрожание) и опыт других с ожидаемыми битрейтами в этом типе приложения.

Моя тестовая программа отправляет куски по 2 Кб с обратным вызовом события bufferedAmountLowThreshold в 2 КБ и повторяет вызовы до тех пор, пока bufferedAmount не превысит 16 КБ. Используя это в Chrome, я достигаю ~ 135 Мбит / с в локальной сети и ~ 20 Мбит / с из / в удаленное соединение, которое имеет 100 Мбит / с WAN-соединение на обоих концах.

Какой здесь ограничивающий фактор?

Как узнать, действительно ли данные будут одноранговыми напрямую или используется сервер TURN?

Мое конечное приложение будет использовать библиотеку google-webrtc на Android - я использую только JS для создания прототипов. Могу ли я установить параметры для ускорения битрейта в библиотеке, чего я не могу сделать в официальных JS API?

1 Ответ

3 голосов
/ 27 мая 2019

Есть много переменных, которые влияют на пропускную способность, и это также сильно зависит от того, как вы ее измерили.Но я перечислю несколько вещей, которые я настроил для увеличения пропускной способности каналов данных WebRTC.

Отказ от ответственности: я не делал эти корректировки для libwebrtc, но для моей собственной библиотеки каналов данных WebRTC под названием RAWRTC, который, кстати, также компилируется для Android.Однако оба используют одну и ту же библиотеку SCTP, оба используют некоторую библиотеку OpenSSL-ish и UDP-сокеты, поэтому все это должно быть применимо к libwebrtc.

Обратите внимание, что реализации канала данных WebRTC с использованием usrsctp обычно связаны с процессором, когда выполняются на одной машине, так что имейте это в виду при тестировании.С настройками RAWRTC по умолчанию я могу достичь ~ 520 Мбит / с на моем i7 5820k.Исходя из моих собственных тестов, и Chrom (e | ium), и Firefox смогли достичь ~ 350 Мбит / с с настройками по умолчанию.

Хорошо, так что давайте углубимся в настройки ...

UDPРазмер буфера отправки / получения

По умолчанию буфер отправки / получения UDP-сокетов в Linux довольно мал.Если вы можете, вы можете настроить его.

DTLS Cipher Suites

Большинство устройств Android имеют процессоры ARM без аппаратной поддержки AES.ChaCha20 обычно лучше работает в программном обеспечении, и поэтому вы можете предпочесть его.

(Это то, что RAWRTC согласовывает по умолчанию, поэтому я не включил его в конечные результаты.)

SCTP Send/ Размер буфера приема

Размер окна отправки / получения по умолчанию: usrsctp, стек SCTP, используемый libwebrtc, равен 256 КиБ , что слишком мало для достижения высокой пропускной способности при умеренной задержке.Теоретическая максимальная пропускная способность ограничена mbits = (window / (rtt_ms / 1000)) / 131072.Итак, с окном по умолчанию window=262144 и довольно умеренным RTT rtt_ms=20 вы получите теоретический максимум 100 Мбит / с.

Практический максимум ниже этого ... на самом деле, ниже теоретического максимума (см. мои результаты теста ).Это может быть ошибка в стеке usrsctp (см. sctplab / usrsctp # 245 ).

Размер буфера был увеличен в Firefox (см. bug 1051685 ), ноне в libwebrtc, используемом Chrom (e | ium).

Release Builds

Уровень оптимизации 3 имеет значение (дух!).

Размер сообщения

Вы, вероятно, хотите отправлять сообщения размером 256 КБ.

Если вам не нужна поддержка Chrome <???(извините, в настоящее время я не знаю, где он приземлился ...), тогда максимальный размер сообщения составляет 64 КБ (см. <a href="https://bugs.chromium.org/p/webrtc/issues/detail?id=7774" rel="nofollow noreferrer"> выпуск 7774 ).

Если вам не требуется поддержка Firefox<56, и в этом случае максимальный размер сообщения составляет 16 КиБ (см. <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=979417" rel="nofollow noreferrer"> ошибка 979417 ).

Это также зависит от того, сколько вы отправляете перед тем, как приостановить отправку (то есть буфер максимальная отметка воды ), и когда вы продолжаете отправку после того, как буфер опустошен (то есть, отметка минимальной отметки буфера ).Мои тесты показали, что нацеливание на отметку максимальной воды в 1 МБ и установление отметки низкой воды в 256 КиБ приводит к достаточной пропускной способности.

Это уменьшает количествоВызовы API и могут увеличить пропускную способность.

Конечные результаты

Использование уровня оптимизации 3 с настройками по умолчанию в RAWRTC привело меня к ~ 600 Мбит / с.

Исходя из этого, увеличение размеров буфера SCTP и UDP до 4 МБ позволило мне подняться еще до ~ 700 Мбит / с с одним ядром процессора при 100% нагрузке.

Однако я считаю, что еще есть местодля улучшений, но это вряд ли будет зависать.


Как я могу узнать, действительно ли данные будут одноранговыми напрямую, или используется сервер TURN?

Откройте about:webrtc в Firefox или chrome://webrtc-internals в Chrom (e | ium) и найдите выбранную пару кандидатов ICE.Или используйте Wireshark.

...