ICE策略
在 WebRTC
中,ICE
的连接策略是可定制的。在 5.7.1 节中介绍 RTCPeerConnection
对象时,我们曾讲过可以给它传入一个 JSON
格式的参数但当时并没有对传入的参数做详细的介绍。现在我们来介绍该参数。
构造 RTCPeerConnection
对象时,其输入参数的类型为 RTCConfiguration
。RTCConfiguration
在 WebRTC
规范中的定义参见代码 6.1。
dictionary RTCConfiguration {
sequence<RTCIceServer> iceServers;
RTCIceTransportPolicy iceTransportPolicy;
RTCBundlePolicy bundlePolicy;
RTCRtcpMuxPolicy rtcpMuxPolicy;
sequence<RTCCertificate> certificates;
[EnforceRange] octet iceCandidatePoolSize = 0;
};
下面详细解释一下 RTCConfiguration
结构中各字段的含义,如表 6.1 所示。

通过表 6.1,我们已经对 RTCConfiguration
中各字段的含义了解得非常清楚了。不过,其中的 iceServers
字段还需要再解释一下。iceServers
是 RTCIceServer
类型的数组,RTCIceServer
结构定义参见代码 6.2。
dictionary RTCIceServer {
required (DOMString or sequence<DOMString>) urls;
DOMString username;
DOMString credential;
RTCIceCredentialType credentialType = "password";
};
该结构中各字段的含义如下:url
,指明了服务的地址;username
和 credential
,指明了访问 url
地址时使用的用户名和密码;credentialType
,指明授权方式为密码方式,也是目前唯一的授权方式。
了解了上面这些内容后,再来看一下具体的例子,看看在真实场景中是如何使用 RTCConfiguration
的,具体如代码 6.3 所示。
var pcConfig = {
iceServers: [
{
urls: 'turn:stun.learningrtc.cn:3478',
username: 'username1',
credential: 'password1'
},
{
urls: 'turn:stun.avdancedu.com:3478',
username: 'username2',
credential: 'password2'
}
],
iceTransportPolicy: 'all',
bundlePolicy: 'max-bundle',
rtcpMuxPolicy: 'require'
};
let pc = new RTCPeerConnection(pcConfig);
// ...
在上面的 RTCConfiguration
对象中,包含了两个 TURN
服务器,分别是 stun.learningrtc.cn
和 stun.avdancedu.com
,相当于为 WebRTC
增加了两个 relay
类型的 Candidate
。当内网和 P2P 无法连通时,RTCPeerConnection
会尝试与这两台中继服务器连接,如果其中一台连接成功,就不再尝试连接另一台。
示例中,除了设置多个 TURN 服务器外,在 RTCConfiguration
中还将 iceTransportPolicy
字段设置为 all
,表示按 Candidate
优先级次序尝试连接;bundlePolicy
设置为 max-bundle
,表示让所有媒体数据使用同一个 Candidate
,这样更有利于端口资源的利用;rtcpMuxPolicy
设置为 require
,表示 RTCP
与 RTP
数据共用同一个 Candidate
。