我遇到NAT traversal
和WebRTC
时遇到问题。视频流可以与某些人合作,但与在学生宿舍路由器后面的人无关。
我认为这应该通过使用TURN服务器来解决。我已经做到了,它仍然无法工作,现在我想知道TURN服务器是否正常工作。因此,我想知道我是否可以或应该设置多个TURN服务器,如果是,那么如何。
我找到了this list of STUN/TURN servers in another thread。现在我正在设置它们
var STUN = {
'url': 'stun:stun.l.google.com:19302',
};
var TURN = {
url: 'turn:homeo@turn.bistri.com:80',
credential: 'homeo'
};
var iceServers =
{
iceServers: [STUN, TURN]
};
var pc = new RTCPeerConnection(iceServers);
所以我的问题基本上是:是否可以设置几个STUN / TURN服务器?如果可能,我应该这样做,那代码会是什么样的?
答案 0 :(得分:20)
A STUN server is used to get an external network address.
TURN servers are used to relay traffic if direct (peer to peer) connection fails.
STUN和/或TURN服务器的URL(可选)由iceServers配置对象中的WebRTC应用程序指定,该对象是RTCPeerConnection构造函数的第一个参数。
使用更多服务器的示例:
var ICE_config= {
'iceServers': [
{
'url': 'stun:stun.l.google.com:19302'
},
{
'url': 'turn:192.158.29.39:3478?transport=udp',
'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
'username': '28224511:1379330808'
},
{
'url': 'turn:192.158.29.39:3478?transport=tcp',
'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
'username': '28224511:1379330808'
}
]
}
pc = new RTCPeerConnection(ICE_config);
一旦RTCPeerConnection拥有该信息,ICE魔法就会自动发生:RTCPeerConnection使用ICE框架计算出对等体之间的最佳路径,并根据需要使用STUN和TURN服务器。
<强> STUN 强>: STUN服务器位于公共互联网上,只有一个简单的任务:检查传入请求的IP:端口地址(来自在NAT后面运行的应用程序)并将该地址作为响应发回。换句话说,应用程序使用STUN服务器从公共角度发现其IP:端口。此过程使WebRTC对等体能够为自己获取可公开访问的地址,然后通过信令机制将其传递给另一个对等体,以便建立直接链接。 (实际上,不同的NAT工作方式不同,可能有多个NAT层,但原理仍然相同。)
<强> TURN 强>: TURN RTCPeerConnection尝试通过UDP建立对等体之间的直接通信。如果失败,RTCPeerConnection将转向TCP。如果失败,可以将TURN服务器用作回退,在端点之间中继数据。
重申:TURN用于在对等体之间中继音频/视频/数据流,而不是信令数据!
TURN服务器具有公共地址,因此即使对等方位于防火墙或代理之后,也可以与对等方联系。 TURN服务器具有概念上简单的任务 - 中继流 - 但与STUN服务器不同,它们本身消耗大量带宽。换句话说,TURN服务器需要更强大。
请参阅this
答案 1 :(得分:6)
关于STUN ,WebRTC会向所有人发送绑定请求,并合并结果。 (请注意,在旧版本的WebRTC代码中,似乎只使用了第一个STUN服务器)
我建议使用多个STUN服务器,因为平均会减少连接时间。确切的数量取决于STUN服务器的可靠性。 一般2个就够了。
关于TURN ,问题更加复杂,因为这些服务器会在无法进行P2P连接时转发您的流量。如果您有许多客户端,单个TURN服务器可能会达到其最大带宽。在这种情况下,设置多个TURN服务器将有所帮助。
如何?在连接检查阶段,WebRTC将选择具有最低往返时间的TURN继电器。因此,设置多个TURN服务器可以使您的应用程序在带宽和用户数量方面进行扩展。
如果您没有开发大型应用程序, 1或2个TURN服务器通常就足够了。
您可以在https://chromium.googlesource.com/external/webrtc/+/master
浏览WebRTC代码我建议查看内部:webrtc / p2p / client / basicportallocator.cc,webrtc / p2p / base / stunport.cc和webrtc / p2p / base / turnport.cc
答案 2 :(得分:0)
问题很可能是大学防火墙阻止了端口19302。公共wifi防火墙通常只允许端口80和443上的流量。换句话说,请勿使用Google的STUN服务器,因为它试图使用端口19302,并且该端口为被学校防火墙阻止。