我正在尝试使用简单对等库来建立浏览器到浏览器的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似乎有点多余。当然,目标是尽快放弃所有中央服务器通信,转而使用浏览器到浏览器的数据通道。
一个好的答案可能会回答这些问题并修改示例。
答案 0 :(得分:1)
根据我的理解(也许我有些误解),为了使两个浏览器通过WebRTC连接,它们必须交换SDP数据...
是的,这是正确的。
...并执行NAT遍历。
是的,他们必须通过ICE建立连接,这可能涉及NAT遍历。
为此,可以实现STUN服务器。
STUN服务器唯一要做的就是尝试弄清楚公共可访问的IP地址是什么。 NAT后的客户端知道其自己的本地地址,但可能不知道其公共IP地址,因为它位于进行NAT的路由器的另一侧。因此,某些外部服务器可以回复并告知客户端连接的IP地址。
STUN不交换必要的信令数据吗?
STUN服务器完全不发送信号。没有。信号取决于您,可以通过您选择的任何方法来实现。
然后我以为STUN只是为了让每个对等方都可以首先收集SDP信息...
主要是针对ICE候选人(基本上是IP地址和其他一些信息)。 SDP信息主要由客户端的功能组成。 (支持哪些编解码器,以什么速率等)
...然后必须使用websocket进行交换?
它不一定是网络套接字。可以使用任何双向通信方法,但通常使用Web套接字。
当然,目标是尽快放弃所有中央服务器通信,转而使用浏览器到浏览器的数据通道。
是的,不幸的是,WebRTC的当前状态远未达到此水平。如果网络上的客户可以互相交谈,那将是很棒的……通信的基础。可悲的是,事实并非如此。仍然需要集中式服务器来协调一切。对等连接仅在其他地方进行连接设置后才能建立。