当将多个 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.";
}
}
...