WebRTC - Сколько серверов STUN/TURN нужно указать?

У меня возникают проблемы с NAT traversal и WebRTC. Videostreaming работает с некоторыми людьми, но не с кем-то, кто стоит за студенческим общежитием.

Я думаю, что это нужно решить, используя сервер TURN. Я сделал это, он все еще не работает, и теперь мне интересно, работает ли TURN-сервер вообще. Вследствие этого я задаюсь вопросом, могу ли я или должен установить несколько серверов TURN, и если да, то как.

Я нашел этот список серверов STUN/TURN в другом потоке. Прямо сейчас я устанавливаю их как это

var STUN = {
    'url': 'stun:stun.l.google.com:19302',
};

var TURN = {
    url: 'turn:[email protected]:80',
    credential: 'homeo'
};

var iceServers = 
{
    iceServers: [STUN, TURN]
};

var pc = new RTCPeerConnection(iceServers);

Итак, мой вопрос в основном: возможно ли установить несколько серверов STUN/TURN? Должен ли я делать это, если это возможно, и как будет выглядеть этот код?

Ответы

Ответ 1

A STUN server is used to get an external network address.
TURN servers are used to relay traffic if direct (peer to peer) connection fails.

URL-адреса для серверов STUN и/или TURN (необязательно), заданные приложением WebRTC в объекте конфигурации iceServers, который является первым аргументом для конструктора RTCPeerConnection.

пример использования большего количества этого сервера:

var ICE_config= {
  'iceServers': [
    {
      'url': 'stun:stun.l.google.com:19302'
    },
    {
      'url': 'turn:192.158.29.39:3478?transport=udp',
      'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
      'username': '28224511:1379330808'
    },
    {
      'url': 'turn:192.158.29.39:3478?transport=tcp',
      'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
      'username': '28224511:1379330808'
    }
  ]
}
pc = new RTCPeerConnection(ICE_config);

Как только RTCPeerConnection имеет эту информацию, волшебство ICE происходит автоматически: RTCPeerConnection использует инфраструктуру ICE для разработки наилучшего пути между одноранговыми узлами, при необходимости работая с серверами STUN и TURN.

STUN: STUN-серверы живут в общедоступном Интернете и имеют одну простую задачу: проверьте IP-адрес порта входящего запроса (из приложения, работающего за NAT), и отправьте этот адрес в ответ. Другими словами, приложение использует STUN-сервер для обнаружения своего IP-порта с публичной точки зрения. Этот процесс позволяет одноранговому узлу WebRTC получить общедоступный адрес для себя, а затем передать его другому одноранговому узлу через механизм сигнализации, чтобы настроить прямую ссылку. (На практике разные NAT работают по-разному, и могут быть несколько слоев NAT, но принцип все тот же.)

TURN: TURN RTCPeerConnection пытается настроить прямую связь между одноранговыми узлами по протоколу UDP. Если это не удастся, RTCPeerConnection прибегает к TCP. Если это не удается, серверы TURN могут использоваться как резервные, ретранслирующие данные между конечными точками.

Просто повторить: TURN используется для ретрансляции аудио/видео/передачи данных между одноранговыми узлами, а не сигнальными данными!

Серверы TURN имеют общедоступные адреса, поэтому к ним могут быть подключены одноранговые узлы, даже если сверстники находятся за брандмауэрами или прокси. У серверов TURN есть концептуально простая задача - передать поток, но, в отличие от серверов STUN, они по своей сути потребляют большую полосу пропускания. Другими словами, серверы TURN должны быть более жесткими.

см. этот

Ответ 2

Что касается STUN, WebRTC отправит Binding Requests всем, и результаты будут объединены. (Обратите внимание, что в старых версиях кода WebRTC используется только первый STUN-сервер)

Я бы рекомендовал использовать более одного сервера STUN, так как вы сократите время соединения в среднем. Точное число зависит от надежности ваших STUN-серверов. В целом 2 достаточно.

Что касается TURN, проблема сложнее, потому что эти серверы будут передавать ваш трафик, когда соединения P2P невозможны. Если у вас много клиентов, один TURN-сервер, вероятно, достигнет максимальной пропускной способности. В этом случае поможет установка нескольких серверов TURN.

Как? Во время фазы проверки связи WebRTC выберет реле TURN с наименьшим временем прохождения туда-обратно. Таким образом, установка нескольких серверов TURN позволяет вашему приложению масштабироваться с точки зрения пропускной способности и количества пользователей.

Если вы не разрабатываете крупномасштабное приложение, обычно 1 или 2 сервера TURN.

Вы можете просмотреть код WebRTC на https://chromium.googlesource.com/external/webrtc/+/master

Я рекомендую заглянуть внутрь: webrtc/p2p/client/basicportallocator.cc, webrtc/p2p/base/stunport.cc и webrtc/p2p/base/turnport.cc

Ответ 3

Вероятно, проблема заключается в том, что брандмауэр университетов блокирует порт 19302. Общедоступные брандмауэры Wi-Fi обычно разрешают трафик только через порты 80 и 443. Другими словами, не используйте сервер Google STUN, поскольку он пытается использовать порт 19302, и этот порт блокируется сервером. межсетевой экран школ.