WebRTC всегда использует TURN вне нашей локальной сети - PullRequest
0 голосов
/ 18 октября 2018

Моя проблема:

Я написал приложение для видеочата на основе WebRTC.Когда два клиента подключаются внутри нашей локальной сети, они всегда получают одноранговое соединение.Но когда клиент из нашей локальной сети соединяется с клиентом за пределами нашей локальной сети, это всегда соединение Peer-to-TURN.Когда мобильные устройства соединяются друг с другом, это часто TURN-TURN.

Что я ожидаю:

Я знаю о симметричных проблемах NAT и ожидаю от 20% до 30%всех соединений, требующих TURN-соединения.Но до сих пор я никогда не находил двух клиентов за пределами нашей локальной сети, чтобы получить одноранговое соединение - это кажется неправильным.

Мои настройки:

Я тестировална устройствах Chrome, Firefox, Electron, Android и iOS.

Я использую сервер Coturn в качестве сервера STUN / TURN.Сервер доступен через Интернет.

Я проверяю через peerConnection.getStats() пункт с item.type === 'googCandidatePair' && item.googActiveConnection === 'true' и смотрю его item.googLocalCandidateType и item.googRemoteCandidateType.Если тип похож на relay, это соединение TURN.

Мой анализ:

Когда моя система сообщает, что сервер TURN задействован, и я останавливаю Coturn , видео останавливается - так что я думаю, что мои отзывы об аппликациях верны.

Я вижу host, srflx и relay кандидатов ICE с обеих сторон.Таким образом, конфигурация STUN / TURN моего приложения кажется правильной.

Я даже встроил тестовую настройку в свое приложение, которое пытается подключиться к назначенному одноранговому роботу, с отключенным видео и аудио, и пытается отправить данные по каналу данных peerConnection туда и обратно.Затем я проверяю статистику, как указано выше, но она ведет себя так же: Peer-to-Peer в нашей локальной сети.Всегда включайте вовне.

Во время моих тестов я обнаружил, что peerConnection.oniceconnectionstatechange потребовалось много времени (около 12 секунд), чтобы измениться с connected на completed.Но опять же только со сверстниками вне локальной сети, а не внутри.Однако канал данных открывается раньше и работает.Ожидание completed перед вызовом getStats() не меняет моего результата.AFAIK только вызывающий абонент имеет состояние completed.

Моя надежда:

Кто-нибудь намекнет на то, что я могу изменить или как я могу улучшить или расширить мой чек?Какой компонент может быть проблемой (код приложения, сеть, сервер STUN, сервер TURN)?

...