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

spa*_*ote 21 javascript stun webrtc

我遇到的麻烦NAT traversalWebRTC.视频流可以与某些人合作,但与在学生宿舍路由器后面的人不同.

我认为这应该通过使用TURN服务器来解决.我已经这样做了,它仍然无法工作,现在我想知道TURN服务器是否正常工作.因此,我想知道我是否可以或应该设置多个TURN服务器,如果是,如何.

在另一个线程中找到了这个STUN/TURN服务器列表.现在我正在设置它们

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);
Run Code Online (Sandbox Code Playgroud)

所以我的问题基本上是:是否可以设置几个STUN/TURN服务器?如果可能,我应该这样做,那代码会是什么样的?

Mua*_*ath 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.
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

一旦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服务器需要更强大.

看到这个

  • @Muath没有直接回答spacecoyote的问题,我认为这是一个有效的问题 - 指定多个TURN服务器的优点是什么?WebRTC实现将如何确定使用哪个? (3认同)
  • 谢谢你。具有多轮服务器的阵列结构正是我所寻找的。设置几个有用吗? (2认同)
  • 测试冰服务器的工作检查:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ (2认同)

小智 7

关于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


kiw*_*123 5

问题很可能是大学防火墙阻止了端口 19302。公共 WiFi 防火墙通常只允许端口 80 和 443 上的流量。换句话说,不要使用 google 的 STUN 服务器,因为它尝试使用端口 19302,而该端口被阻止学校防火墙。