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)?