![如果有多个选项,Chrome/webRTC 如何选择使用哪个 TURN 服务器?](https://linux22.com/image/631903/%E5%A6%82%E6%9E%9C%E6%9C%89%E5%A4%9A%E4%B8%AA%E9%80%89%E9%A1%B9%EF%BC%8CChrome%2FwebRTC%20%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E4%BD%BF%E7%94%A8%E5%93%AA%E4%B8%AA%20TURN%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
当将多个 TURN 选项传递给 RTCPeerConnection 并假设其中几个在技术上可用时,实际服务器是如何选择的?
网络性能到底起到什么作用呢?
答案1
冰请求函数没有指定当有多个 TURN 服务器可用时会发生什么:
本规范仅考虑使用单个 STUN 或 TURN 服务器。当该单个 STUN 或 TURN 服务器有多个选择时(例如,当它们通过 DNS 记录获知并返回多个结果时),代理应为特定会话的所有候选服务器使用单个 STUN 或 TURN 服务器(基于其 IP 地址)。这可以提高 ICE 的性能。结果是一组具有 STUN 或 TURN 服务器的主机候选对。然后,代理选择一对,并向该主机候选服务器发送绑定或分配请求。
因此,不应期待任何特殊行为。
目前,WebRTC 选择符合给定条件的第一个服务器。例如,第一个支持 UDP 连接的 UDP 服务器。
void AllocationSequence::CreateUDPPorts() {
...
// If STUN is not disabled, setting stun server address to port.
if (!IsFlagSet(PORTALLOCATOR_DISABLE_STUN)) {
// If config has stun_address, use it to get server reflexive candidate
// otherwise use first TURN server which supports UDP.
if (config_ && !config_->stun_address.IsNil()) {
LOG(LS_INFO) << "AllocationSequence: UDPPort will be handling the "
<< "STUN candidate generation.";
port->set_server_addr(config_->stun_address);
} else if (config_ &&
config_->SupportsProtocol(RELAY_TURN, PROTO_UDP)) {
port->set_server_addr(config_->GetFirstRelayServerAddress(
RELAY_TURN, PROTO_UDP));
LOG(LS_INFO) << "AllocationSequence: TURN Server address will be "
<< " used for generating STUN candidate.";
}
}
...