WebRTC - 我需要指定多少个STUN / TURN服务器?

时间:2014-04-25 12:00:17

标签: javascript webrtc stun

我遇到NAT traversalWebRTC时遇到问题。视频流可以与某些人合作,但与在学生宿舍路由器后面的人无关。

我认为这应该通过使用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服务器?如果可能,我应该这样做,那代码会是什么样的?

3 个答案:

答案 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,并且该端口为被学校防火墙阻止。