28

我遇到了问题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);

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

4

3 回答 3

33
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(可选)由 WebRTC 应用程序在 iceServers 配置对象中指定,该对象是 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:port。此过程使 WebRTC 对等点能够为自己获取一个可公开访问的地址,然后通过信令机制将其传递给另一个对等点,以建立直接链接。(实际中不同的NAT工作方式不同,可能有多个NAT层,但原理还是一样的。)

TURN : TURN RTCPeerConnection 尝试在对等方之间通过 UDP 建立直接通信。如果失败,RTCPeerConnection 将求助于 TCP。如果失败,TURN 服务器可以用作后备,在端点之间中继数据。

重申一下:TURN 用于在对等点之间中继音频/视频/数据流,而不是信令数据!

TURN 服务器具有公共地址,因此即使对等点位于防火墙或代理之后,它们也可以被对等点联系。TURN 服务器有一个概念上简单的任务——中继流——但是,与 STUN 服务器不同,它们本质上会消耗大量带宽。换句话说,TURN 服务器需要更强大。

看到这个

于 2014-04-26T06:38:04.363 回答
11

对于 STUN,WebRTC 会向所有人发送 Binding Requests ,并将结果合并。(注意,在旧版本的 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

于 2015-12-24T12:33:17.200 回答
4

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

于 2019-05-24T04:13:59.337 回答