webrtc的ICE符合rfc5245标准协议。该协议的链接为:https://tools.ietf.org/html/rfc5245
每个终端都有一系列传输地址(包括传输协议、IP地址和端口)的候选,可以用来和其他端点进行通信。其中可能包括:
1)直接和网络接口联系的传输地址(host address)
2)经过NAT转换的传输地址,即反射地址(server reflective address)
3)TURN服务器分配的中继地址(relay address)
虽然潜在要求任意一个主叫Client的候选地址都能用来和被叫Client的候选地址进行通信。但是实际中发现有许多组合是无法工作的。举例来说,如果主叫Client和被叫Client都在NAT之后而且不处于同一内网,他们的直接地址就无法进行通信。ICE的目的就是为了发现哪一对候选地址的组合可以工作,并且通过系统的方法对所有组合进行测试(用一种精心挑选的顺序)。
在rfc5245定义里面,实现ICE一共有六个步骤:收集候选地址、连通性测试、候选排序、冻结候选、检查的安全性、ICE结束。webrtc结合实际应用,优化这六步为如下五步:收集候选地址、在信令通道中交换候选选项、执行连接检查、选定并启动媒体。
1)实现收集候选地址核心函数:BasicPortAllocatorSession::DoAllocate。
2)在信令通道中交换候选选项:AddIceCandidate
3) P2PTransportChannel::SortConnectionsAndUpdateState
4)选定并启动媒体核心函数:P2PTransportChannel::OnReadyToSend
5) P2PTransportChannel::SwitchSelectedConnection