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

Posted

技术标签:

【中文标题】WebRTC - 我需要指定多少 STUN/TURN 服务器?【英文标题】:WebRTC - How many STUN/TURN servers do I need to specify? 【发布时间】:2014-06-11 03:11:00 【问题描述】:

我在使用 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 服务器?如果可能的话,我应该这样做吗?该代码会是什么样子?

【问题讨论】:

我赞成您的回答,因为我认为这很有帮助,因为您向我展示了如何构建阵列以设置多个 STUN 或 TURN 服务器。但我已经知道什么是 STUN 和什么是 TURN 服务器。我想知道的是设置几个 TURN 服务器或几个 STUN 服务器是否有用(可能出于性能原因,我的程序会选择具有最低延迟的服务器,它是否能够判断 TURN 服务器何时离线并选择下一个,如果是的话,这需要多长时间..)。缺乏这些信息是我不接受的原因。也许我的问题太不具体了。 这些是您发布的实际凭据,我不确定它会对您造成多大伤害,但您应该更新它:P 【参考方案1】:
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 服务器存在于公共互联网上,并且有一个简单的任务:检查传入请求的 IP:端口地址(来自在 NAT 后面运行的应用程序)并将该地址作为响应发回。换句话说,应用程序使用 STUN 服务器从公共角度发现其 IP:port。此过程使 WebRTC 对等点能够为自己获取一个可公开访问的地址,然后通过信令机制将其传递给另一个对等点,以建立直接链接。 (实际中不同的NAT工作方式不同,可能有多个NAT层,但原理还是一样的。)

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

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

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

this

【讨论】:

谢谢。具有多轮服务器的阵列结构正是我所寻找的。设置几个有用吗? @spacecoyote STUN 服务器用于获取外部网络地址。如果直接(对等)连接失败,TURN 服务器用于中继流量。是的,它很有用。每一个都有一个用途 @Muath 没有直接回答 spacecoyote 的问题,我认为这是一个有效的问题 - 指定多个 TURN 服务器的优点是什么?WebRTC 实现将如何确定使用哪个?跨度> @Ternary 问题“WebRTC - 我需要指定多少 STUN/TURN 服务器?”不是“WebRTC 实现将如何确定使用哪个?”我们这里还有一个问题..你可以问,如果你想,或者你可以按照你的理解回答这个问题^_^ 测试ice服务器的工作检查:webrtc.github.io/samples/src/content/peerconnection/trickle-ice【参考方案2】:

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

【讨论】:

检查 ICE 服务器的工作检查:webrtc.github.io/samples/src/content/peerconnection/trickle-ice WebRTC 在代码中的哪个位置检查每个 TURN 候选的 RTT? firefox 上有警告和错误,允许使用多个 stun/turn 服务器。【参考方案3】:

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

【讨论】:

此外,如果您配置自己的 STUN 或 TURN 服务器,其中主端口绑定在 443 或 80 上会更好。这是我看到一些信令服务器所做的一个技巧。 是的,而且那里有开源库,这很容易做到。 我需要帮助。我被困住了。 ICE 我的所有请求都失败了。请问你能帮我解决转 ans stun url 吗?? 我可以帮忙。你需要什么? 这是我的 ICE 配置

以上是关于WebRTC - 我需要指定多少 STUN/TURN 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

webRTC 数据通道消息的最大大小是多少?

WebRTC 有多少个通道以及使用了哪些传输?

WebRTC Native M96 SDK接口封装--setDevice指定视频设备

WebRTC Native M96 SDK接口封装--setDevice指定视频设备

WebRTC Native M96 SDK接口封装--setDevice指定视频设备

什么会在没有指定 STUN 服务器的本地 webRTC 应用程序上生成 ICE 候选?