WebRTC(简单对等)+ STUN无需额外信令?

时间:2019-07-15 00:24:57

标签: javascript websocket webrtc simple-peer

我正在尝试使用简单对等库来建立浏览器到浏览器的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不交换必要的信令数据吗?但是,在研究他们的问题时,他们建议使用websocket交换此类数据。那么,我是否可以假设STUN只是这样,以便每个对等方都可以首先收集SDP信息,然后必须使用网络套接字来交换它?然后,浏览器可以彼此建立数据通道了吗?

为什么我认为STUN处理了这个?当STUN已经能够向客户端提供数据时,引入websocket似乎有点多余。当然,目标是尽快放弃所有中央服务器通信,转而使用浏览器到浏览器的数据通道。

一个好的答案可能会回答这些问题并修改示例。

1 个答案:

答案 0 :(得分:1)

  

根据我的理解(也许我有些误解),为了使两个浏览器通过WebRTC连接,它们必须交换SDP数据...

是的,这是正确的。

  

...并执行NAT遍历。

是的,他们必须通过ICE建立连接,这可能涉及NAT遍历。

  

为此,可以实现STUN服务器。

STUN服务器唯一要做的就是尝试弄清楚公共可访问的IP地址是什么。 NAT后的客户端知道其自己的本地地址,但可能不知道其公共IP地址,因为它位于进行NAT的路由器的另一侧。因此,某些外部服务器可以回复并告知客户端连接的IP地址。

  

STUN不交换必要的信令数据吗?

STUN服务器完全不发送信号。没有。信号取决于您,可以通过您选择的任何方法来实现。

  

然后我以为STUN只是为了让每个对等方都可以首先收集SDP信息...

主要是针对ICE候选人(基本上是IP地址和其他一些信息)。 SDP信息主要由客户端的功能组成。 (支持哪些编解码器,以什么速率等)

  

...然后必须使用websocket进行交换?

它不一定是网络套接字。可以使用任何双向通信方法,但通常使用Web套接字。

  

当然,目标是尽快放弃所有中央服务器通信,转而使用浏览器到浏览器的数据通道。

是的,不幸的是,WebRTC的当前状态远未达到此水平。如果网络上的客户可以互相交谈,那将是很棒的……通信的基础。可悲的是,事实并非如此。仍然需要集中式服务器来协调一切。对等连接仅在其他地方进行连接设置后才能建立。