Candidate种类与优先级
要了解 ICE
的整个实现过程,我们还是要从 Candidate
的优先级说起。ICE
中使用的 Candidate
具有优先级次序,由高到低分别为 host
、srflx
、prflx
、relay
。WebRTC
进行一对一音视频通信时,就是按照这个次序尝试建立连接的,如图 6.1 所示。

在图 6.1 中,有 A、B、C 三个终端。下面看一下任意两个终端之间是如何建立连接的。假设 A 与 B 要进行通信,按照一对一通信的原则,两个终端都要先与信令服务器建立连接。之后双方通过媒体服务器交换信息进行媒体协商,并在媒体协商时收集各自的 Candidate
。根据 Candidate
的收集次序,WebRTC
会先收集 host
类型的 Candidate
,并通过信令服务器交换给对端。当收到对端的 Candidate
后,WebRTC
在其内部生成 CandidatePair
,这样终端就可以利用 CandidatePair
尝试建立 socket
连接了。在本例中,由于 A 和 B 是在同一局域网下,因此它们通过 host
类型的 Candidate
可以在内网建立起连接。当连接成功后,音视频数据就可以源源不断地从一方流向另一方了。
如果 A 与 C 通信,因为不在同一局域网内,双方尝试 host
型 Candidate
连接时会失败。不过,在 A 与 C 尝试连接时,各端 Candidate
的收集工作并未停止。Candidate
收集线程还在收集其他类型的 Candidate
,如从 STUN/TURN 服务器收集 srflx
和 relay
类型的 Candidate
(图 6.1 中的步骤❸);当收集到 srflx
类型的 Candidate
时,ICE
会尝试 NAT
打洞(关于 NAT
打洞的过程将在 6.3 节中做详细介绍),如果打洞成功,则 A 和 C 会通过 P2P
的方式传输数据;如果打洞失败,A 和 C 则会通过 TURN
服务器中转数据。
B 与 C 通信的逻辑同 A 与 C 通信的逻辑是一样的,这里就不再赘述了。从上面的描述中可以总结出以下两点信息:
-
WebRTC
的ICE
机制会选择最好的链路传输音视频数据,即如果通信的双方在同一网段内,则优先使用内网链路;如果通信的双方不在同一网段,则优先使用P2P
;当以上方式都无法连通时,则使用relay
服务进行中转。 -
ICE
的连通率几乎可以达到 100%。在内网和 P2P 无法连通的情况下,它还可以通用中继的方式让彼此连通,从而大大提高了WebRTC
的连通率。
通过上面的分析,你现在应该对 WebRTC
在网络处理方面的策略略知一二了。WebRTC
中的 ICE
既考虑了数据传输的效率,又考虑了网络的连通率,同时实现起来还很简单。