WebRTC如何决定使用哪些TURN服务器

13

3
根据冰收集阶段指定的优先级集合,它组织了每个 ICE 候选者的收集结果。(这是针对具体实现而言的,我认为这意味着 FF 和 Chrome 更喜欢不同类型的候选者)。 - Benjamin Trent
@BenjaminTrent 非常感谢,我在RFC中没有发现过那个优先级值。如果您愿意,请将其添加为答案,我会接受它。 - Ternary
1个回答

15
每个ICE候选者在收集时都会被赋予一个优先级。它是几种因素的混合物,我相信每个平台(Chrome、FireFox等)都有自己的偏好。
这里有一个链接到RFC,解释了如何生成优先级。如果遵循RFC,每个优先级都保证是唯一的,因为候选ID应该是唯一的。因此,您永远不应该有优先级相同的情况。具有较高优先级的候选者首先尝试连接,如果无法与他们建立连接,则使用下一个候选者。
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的整数。它代表在代理程序具有多个IP地址的情况下获得候选项的特定IP地址的优先级。65535代表最高优先级,而0代表最低优先级。当只有一个IP地址时,应将此值设置为65535。更一般地,如果针对特定媒体流的特定组件存在多个相同类型的候选项,则每个候选项的本地优先级必须唯一。在本规范中,这仅适用于多宿主机。如果主机是双栈的,则本地优先级应设置为RFC 3484 [RFC3484]中描述的IP地址的优先级值。
组件ID是候选项的组件ID,必须介于1到256之间。
您可以在中继候选项中查看转发服务器的IP和端口。以下内容摘自RFC页面82webrtc 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

2
看起来Chrome(Blink)也会根据距离/延迟修改本地优先级。当使用多个转发服务器时,更近的通常具有更高的优先级。 - Mantriur
@Mantriur,你有没有找到更多相关信息?我尝试复制了那个行为,但是没有成功(也许在过去的7年里已经改变了!),并且在Chromium源代码的basic_port_allocator.cc中查找时,我无法看到在设置候选优先级时考虑延迟/ RTT的地方。 - jbg
除了Benjamin在问题上的评论,我一无所知。我们正在使用Websockets来估计延迟,然后只向浏览器提供最接近的两个。 - Mantriur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接