WebRTC 如何决定使用哪些 TURN 服务器
Posted
技术标签:
【中文标题】WebRTC 如何决定使用哪些 TURN 服务器【英文标题】:How does WebRTC decide which TURN Servers to Use 【发布时间】:2014-12-08 04:06:52 【问题描述】:分支这个问题WebRTC - How many STUN/TURN servers do I need to specify?
当提供多个 TURN 服务器时,WebRTC 如何确定使用哪些 TURN 服务器?
【问题讨论】:
它根据priority set during the ice gathering stage 组织每个人收集的 ICE 候选者,我相信这是特定于实现的(意味着 FF 和 Chrome 更喜欢不同的候选者类型)。 @BenjaminTrent 非常感谢,我没有偶然发现 RFC 中的优先级值。如果您愿意,请将其添加为答案,我会接受。 【参考方案1】:每个 Ice 候选者在被收集时都会被赋予优先级。它是多种事物的混合体,我相信每个平台(Chrome、FireFox 等)都有自己的偏好。
这是link to the RFC 解释如何生成优先级。每个优先级都保证是唯一的,因为候选 ID 应该是唯一的(如果遵循 RFC)。所以,你永远不应该在优先事项上打成平手。先尝试优先级较高的,如果无法与它们建立连接,则使用下一个。
引用 RFC 关于优先级的内容:
使用公式时,代理通过确定 对每种类型的候选人的偏好(服务器自反,对等 自反、中继和托管),并且当代理是多宿主时, 为其 IP 地址选择首选项。这两个偏好 然后组合起来计算候选者的优先级。那 使用以下公式计算优先级:
priority = (2^24)*(type preference) +
(2^8)*(local preference) +
(2^0)*(256 - component ID)
类型偏好必须是从 0 到 126 的整数,并且 表示对候选人类型的偏好(其中 类型是本地、服务器自反、对等自反和中继)。一个 126 是最高偏好,0 是最低偏好。设置 值为 0 表示此类型的候选者将仅用作 最后的手段。所有的类型首选项必须相同 同一类型的候选人,并且对于的候选人必须不同 不同种类。对等反身候选人的类型偏好 必须高于服务器反身候选人。请注意 根据第 4.1.1 节的程序收集的候选人将 永远不要成为同伴反身候选人;这些类型的候选人是 从 ICE 执行的连接检查中学习。
本地首选项必须是 0 到 65535 之间的整数,包括 0 到 65535。 它表示对特定 IP 地址的偏好 在代理是多宿主的情况下,获得了候选人。 65535 代表最高偏好,0 代表最低。 当只有一个 IP 地址时,这个值应该设置为 65535. 更一般地说,如果对于特定媒体流的特定组件有多个候选者,它们具有相同的 类型,本地首选项必须是唯一的。在这 规范,这只发生在多宿主主机上。如果主机是 多宿主,因为它是双栈,本地偏好应该是 设置为 RFC 中描述的 IP 地址的优先级值 3484 [RFC3484]。
组件 ID 是候选人的组件 ID,并且必须是 介于 1 到 256 之间。
您可以看到转接服务器 ip 和端口显示在中继候选中。以下内容来源于the RFC page 82和webrtc hacks。
a=candidate:2157334355<ID> 2<Component> udp<NetType> 33562367<Prioirty> 180.6.6.6<NAT pub IP> 54278<NAT pub Port> typ relay<Means it needs to be relayed through Turn> raddr 46.2.2.2<Relay address of turn> rport 38135<relay port of turn> generation 0
【讨论】:
Chrome (Blink) 似乎也通过距离/延迟来修改本地偏好。当使用多个回合服务器时,距离较近的服务器通常具有更高的优先级。以上是关于WebRTC 如何决定使用哪些 TURN 服务器的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC:ICE、STUN 和 TURN,但我不能只使用我的 SignalR.NET 连接吗?
在 Ubuntu 上为 WebRTC 安装 TURN 服务器