WebRTC всегда использует TURN вне нашей локальной сети

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

Я написал приложение для видеочата на основе WebRTC. Когда два клиента подключаются внутри нашей локальной сети, они всегда получают одноранговое соединение. Но когда клиент из нашей локальной сети соединяется с клиентом за пределами нашей локальной сети, это всегда соединение Peer-to-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 подключен, и я останавливаю Coturn, видео останавливается - так что я думаю, что мои отзывы о приложениях верны.

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

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

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

Я надеюсь:

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

0 ответов

Другие вопросы по тегам