Почему видео конференция через WebRTC не работает, если участники находятся в разных сетях?

Как можно обеспечить работу видеосвязи через WebRTC между устройствами, находящимися в разных сетях (например, одно из них подключено к Wi-Fi, а другое работает через мобильный интернет), используя пример с GitHub (https://github.com/fireship-io/webrtc-firebase-demo)? Наблюдаю проблемы с установлением соединения и получением ответа с ошибкой connectionstatechange = failed в браузере Chrome при тестировании проекта на GitHub Pages. Возможно ли обеспечить работу видеосвязи без использования дополнительных серверов?
  • 26 января 2024 г. 13:58
Ответы на вопрос 1
WebRTC предназначен для того, чтобы позволить устройствам устанавливать прямые соединения для передачи аудио, видео и данных, но когда участники находятся в разных сетях, особенно если эти сети используют NAT (сетевой адресный перевод), подключение через WebRTC может оказаться невозможным. Такие сети меняют публичный IP-адрес устройства, что может затруднить установление соединения между двумя участниками.

Чтобы преодолеть эти ограничения, обычно используются следующие компоненты:

1. **ICE (Interactive Connectivity Establishment)** - Фреймворк, который позволяет WebRTC клиентам находить наилучший способ для соединения. ICE использует серию тестов для определения доступных методов связи, которые включают прямые связи (в случае использования одной и той же локальной сети) или связи через сервера посредники.

2. **STUN сервера (Session Traversal Utilities for NAT)** - Сервера, которые помогают устройствам обнаружить свой публичный IP-адрес и порт, которые будут видны другим устройствам в интернете, несмотря на NAT.

3. **TURN сервера (Traversal Using Relays around NAT)** - Серверы, которые действуют как промежуточные посредники, переправляя трафик между двумя сторонами в том случае, когда прямое соединение невозможно, например, из-за жёстких ограничений файрвола или NAT.

Если вы наблюдаете проблемы с установлением соединения и получаете ошибку `connectionstatechange = failed`, причиной, скорее всего, является невозможность установления прямого соединения из-за NAT или файрвола в сетях участников.

Решение состоит в использовании как минимум STUN сервера, который поможет выполнять NAT Traversal. Google предоставляет бесплатный STUN сервер, который можно использовать в тестовых целях:

```javascript
const config = {
  'iceServers': [
    { 'urls': 'stun:stun.l.google.com:19302' }
  ]
};
```

Если использование STUN сервера не решит проблему, то вам понадобится TURN сервер, который будет перенаправлять трафик через себя. TURN серверы обычно платные, так как требуют значительных ресурсов для транзита трафика.

Посетив GitHub-репозиторий `fireship-io/webrtc-firebase-demo`, можно увидеть, что в примере конфигурации WebRTC уже использован публичный STUN сервер Google. Если это не обеспечивает установление соединения, возможно, потребуется добавление TURN сервера в конфигурацию.

Обратите внимание, что использование TURN сервера является крайней мерой и требует затрат, так как TURN сервер будет транслировать весь видео и аудио трафик, что может быть дорогостоящим. Если вы хотите построить систему без дополнительных серверов, вы ограничены возможностями прямого соединения через STUN и не сможете обеспечить 100% соединяемость, особенно в
Похожие вопросы