WebRTC(简单对等)+ 没有额外信号的 STUN?

WebRTC (simple-peer) + STUN Without Extra Signaling?

我正在尝试使用简单对等库来建立浏览器到浏览器的 WebRTC 连接(数据通道)。我的理解(也许我有一些误解)为了让两个浏览器通过 WebRTC 连接,它们必须交换 SDP 数据并执行 NAT 穿越。为此,可以实施 STUN 服务器。

在 simple-peer 库中,他们声明 simple-peer 没有实现信令协议,但它确实提供了一种提供 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 不交换必要的信令数据吗?但是,在查看他们的问题时,他们建议使用 websockets 来交换此类数据。那么我是否假设 STUN 只是为了让每个对等方可以首先收集 SDP 信息,然后必须使用 websockets 来交换它?然后,然后,浏览器之间就可以建立数据通道了?

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

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

It's my understanding (Maybe I have some misconception) that in order for two browsers to connect via WebRTC, they must exchange SDP data...

是的,这是正确的。

... and perform NAT traversal.

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

In order to do this, a STUN server can be implemented.

STUN 服务器所做的唯一一件事就是尝试找出 public 可访问的 IP 地址是什么。 NAT 后面的客户端知道它自己的本地地址,但可能不知道它的 public IP 地址,因为它在路由器的另一端进行 NAT。因此,一些外部服务器可以回复并告诉它客户端连接的 IP 地址。

Doesn't STUN exchange the necessary signaling data?

STUN 服务器根本不发送信号。 None。信号由您决定,通过您选择的任何方法实现。

Am I then to assume that STUN is only so that each peer can first gather the SDP information...

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

...and that websockets must then be used to exchange it?

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

The goal of course is to drop all central server communications asap in favor of browser-to-browser data channels.

是的,不幸的是,WebRTC 的当前状态远低于此。如果网络上的客户端可以相互交谈,那就太好了……通信的基础知识。可悲的是,事实并非如此。仍然需要集中式服务器来协调一切。点对点连接仅在其他地方建立连接后才建立。