簡體   English   中英

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 似乎有點多余。 當然,目標是盡快放棄所有中央服務器通信,轉而使用瀏覽器到瀏覽器的數據通道。

一個好的答案可能會回答這些問題並修改示例。

這是我的理解(也許我有一些誤解),為了讓兩個瀏覽器通過 WebRTC 連接,它們必須交換 SDP 數據......

是的,這是正確的。

...並執行 NAT 遍歷。

他們必須通過 ICE 建立連接,這可能涉及 NAT 穿越,是的。

為了做到這一點,可以實現一個 STUN 服務器。

STUN 服務器所做的唯一一件事就是嘗試找出可公開訪問的 IP 地址是什么。 NAT 后面的客戶端知道自己的本地地址,但可能不知道其公共 IP 地址,因為它位於執行 NAT 的路由器的另一端。 因此,一些外部服務器可以回復並告訴它客戶端連接的 IP 地址。

STUN 不交換必要的信令數據嗎?

STUN 服務器根本不做信令。 沒有任何。 信號取決於您,可以通過您選擇的任何方法來實現。

那么我是否假設 STUN 只是為了讓每個對等方可以首先收集 SDP 信息......

主要是針對 ICE 候選人(主要是 IP 地址和其他一些信息)。 SDP信息主要由客戶端的能力組成。 (支持哪些編解碼器以及以什么速率等)

...然后必須使用 websockets 來交換它?

它不一定是網絡套接字。 可以使用任何雙向通信方法,但通常使用網絡套接字。

當然,目標是盡快放棄所有中央服務器通信,轉而使用瀏覽器到瀏覽器的數據通道。

是的,不幸的是,WebRTC 的當前狀態下降了,遠沒有達到這一點。 如果網絡上的客戶端可以相互交談,那就太棒了……溝通的基礎知識。 可悲的是,情況並非如此。 仍然需要集中式服務器來協調一切。 點對點連接僅在其他地方發生連接建立后才進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM