WebRTC (простой одноранговый) + STUN без дополнительной сигнализации?

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

В простой одноранговой библиотеке они заявляют, что простой одноранговый узел не реализует протокол сигнализации, но предоставляет метод предоставления серверов STUN / ICE. Рассмотрим следующие три файла HTML из их примера сетки:

peer1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Peer1</title>
</head>
<body>
<script src="../../js/simplepeer.min.js"></script>
<script>
    // These are peer1's connections to peer2 and peer3
    var peer2 = new SimplePeer({ initiator: true, config: {
            iceServers: [
                {urls: 'stun:stun.a-mm.tv:3478'}
            ]
        } })
    var peer3 = new SimplePeer({ initiator: true, config: {
            iceServers: [
                {urls: 'stun:stun.a-mm.tv:3478'}
            ]
        } })

    peer2.on('signal', data => {
        console.log(data)
    })

    peer2.on('connect', () => {
        peer2.send('hi peer2, this is peer1')
    })

    peer2.on('data', data => {
        console.log('got a message from peer2: ' + data)
    })

    peer3.on('signal', data => {
        console.log(data)
    })

    peer3.on('connect', () => {
        peer3.send('hi peer3, this is peer1')
    })

    peer3.on('data', data => {
        console.log('got a message from peer3: ' + data)
    })
</script>
</body>
</html>```

peer2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Peer2</title>
</head>
<body>
<script src="../../js/simplepeer.min.js"></script>
<script>
    // These are peer2's connections to peer1 and peer3
    var peer1 = new SimplePeer({
        config: {
            iceServers: [
                {urls: 'stun:stun.a-mm.tv:3478'}
            ]
        }
    })
    var peer3 = new SimplePeer({ initiator: true, config: {
            iceServers: [
                {urls: 'stun:stun.a-mm.tv:3478'}
            ]
        } })

    peer1.on('signal', data => {
        console.log(data)
    })

    peer1.on('connect', () => {
        peer1.send('hi peer1, this is peer2')
    })

    peer1.on('data', data => {
        console.log('got a message from peer1: ' + data)
    })

    peer3.on('signal', data => {
        console.log(data)
    })

    peer3.on('connect', () => {
        peer3.send('hi peer3, this is peer2')
    })

    peer3.on('data', data => {
        console.log('got a message from peer3: ' + data)
    })
</script>
</body>
</html>

peer3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Peer3</title>
</head>
<body>
<script src="../../js/simplepeer.min.js"></script>
<script>
    // These are peer3's connections to peer1 and peer2
    var peer1 = new SimplePeer({
            config: {
                iceServers: [
                    {urls: 'stun:stun.a-mm.tv:3478'}
                ]
            }
        }
    )
    var peer2 = new SimplePeer({
        config: {
            iceServers: [
                {urls: 'stun:stun.a-mm.tv:3478'}
            ]
        }
    })

    peer1.on('signal', data => {
        console.log(data)
    })

    peer1.on('connect', () => {
        peer1.send('hi peer1, this is peer3')
    })

    peer1.on('data', data => {
        console.log('got a message from peer1: ' + data)
    })

    peer2.on('signal', data => {
        console.log(data)
    })

    peer2.on('connect', () => {
        peer2.send('hi peer2, this is peer3')
    })

    peer2.on('data', data => {
        console.log('got a message from peer2: ' + data)
    })
</script>
</body>
</html>

Как видите, я добавил туда два STUN-сервера. Не обменивается ли STUN необходимыми сигнальными данными? Однако, рассматривая свои проблемы, они рекомендуют использовать веб-сокеты для обмена такими данными. Могу ли я тогда предположить, что STUN предназначен только для того, чтобы каждый одноранговый узел мог сначала собрать информацию SDP, а затем использовать веб-узлы для обмена ею? И что тогда, после этого, браузеры могут устанавливать каналы данных друг с другом?

Почему я подумал, что с этим справился STUN? Кажется немного избыточным вводить веб-сокеты, когда STUN уже может предоставлять данные клиентам. Конечно, цель состоит в том, чтобы как можно скорее отказаться от всех коммуникаций с центральным сервером в пользу каналов данных между браузерами.

Хороший ответ может ответить на эти вопросы и изменить пример.


person xendi    schedule 15.07.2019    source источник
comment
Предположительно на вашем сайте одновременно будет более двух посетителей. Даже если STUN может сигнализировать, как передать, с какими двумя пользователями вы хотите разговаривать друг с другом? В STUN нет механизма для этого. И в любом случае вам придется обменять какой-нибудь общий идентификатор. Именно поэтому сигнализация оставлена ​​на ваше усмотрение, чтобы вы могли реализовать свою собственную бизнес-логику, как объединить этих двух людей.   -  person deceze♦    schedule 16.07.2019


Ответы (1)


Насколько я понимаю (возможно, у меня есть какое-то заблуждение), чтобы два браузера могли подключаться через WebRTC, они должны обмениваться данными SDP ...

Да, это правильно.

... и выполните обход NAT.

Они должны установить соединение через ICE, что может включать обход NAT, да.

Для этого может быть реализован STUN-сервер.

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

Не обменивается ли STUN необходимыми сигнальными данными?

Сервер STUN вообще не сигнализирует. Никто. Передача сигналов зависит от вас и может быть реализована любым методом, который вы выберете.

Могу ли я тогда предположить, что STUN предназначен только для того, чтобы каждый одноранговый узел мог сначала собрать информацию SDP ...

В основном для кандидатов на ICE (по сути, IP-адреса и некоторая другая информация). Информация SDP в основном состоит из возможностей клиента. (Какие кодеки поддерживаются, с какой скоростью и т. Д.)

... и что тогда веб-сокеты должны использоваться для его обмена?

Это не обязательно должны быть веб-сокеты. Можно использовать любой метод двунаправленной связи, но обычно используются веб-сокеты.

Конечно, цель состоит в том, чтобы как можно скорее отказаться от всех коммуникаций с центральным сервером в пользу каналов данных между браузерами.

Да, к сожалению, нынешнее состояние WebRTC сильно отличается от этого. Было бы замечательно, если бы клиенты в сети могли разговаривать друг с другом ... об основах общения. К сожалению, это не так. Централизованные серверы по-прежнему нужны, чтобы все координировать. Одноранговые соединения выполняются только после того, как установка соединения произошла в другом месте.

person Brad    schedule 15.07.2019