Моя проблема:
Я написал приложение для видеочата на основе 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)?