1 收集主机候选者.收集的过程和传输协议有关,这儿特指UDP.agent对于媒体流的每一个component遍历主机的网络接口获得一个候选者.比如基于RTP的媒体流的话,RTP的componentID是1,RTCP是2.使用二者的agent,如果它主机有K个网络接口的话,那么它有2*K个
候选者.
主机候选者的base是它自己.
2 服务器转向和中继候选,这些是可选的,至于去不去取它们的话,取决于ICE提供者的变动,一般来说是一份config文件.举个例子,在封闭的局域网中可能就不需要这些地址.以为使用中继的代价是很昂贵的,中继一般只使用于对称NAT的情况.
agent接下来将主候选者和配置好的STUN server 配对.目前这一份草案仅仅考虑到唯一一个STUN的情况.在这种特定的情况,每Ta毫秒过后,agent选择另外一对这样子的配对,从主机候选者向STUN Server发送请求.如果agent使用转向和中继的地址.那么请求就是relay用法的STUN Allocate请求.如果agent only使用服务器转向候选者,这时候agent使用binding发现用法,发送一个STUN Binding请求.
Ta的值在ICE中推荐为20ms
这是第一个开始向外进行发送东西的STUN事物.重发规则以后再说.同样地,一个请求的重试取决于,可以恢复的错误比如说 authentication challenge,是在timer Ta过去以前发生,并立即返回的.由于每一个候选者都需要时间,这就涉及到时间预算的问题,所以有必要限制收集的候选者的个数.
agent将接受一个STUN binding或是 Allocate 响应.一次成功的Allocate响应的话,将要提供agent一个转向地址(从 mapped 地址 attr获得).如果Allocate遭到拒绝的话,那么意味着服务器缺少资源.agent可以改发Binding请求来获得服务器转向地址,如果中继候选者和主机候选者有重复,那么丢弃这个中继候选者.
3 清除冗余的候选者
如果候选者的传输地址和另一个候选者一样,而且他们的base也一样,这种情况,请清除它.
4 计算Foundation
这个取决于 type,base有不同的IP地址,或者用以获得他们的STUN服务器的IP地址不同.
5 保持候选者存活
一旦,服务器转向和中继地址被分配,他们的存活期必须是整个ICE的过程.
6 将候选者按优先级排序
推荐的公式:priority = (2^24)*(type preference) +
(2^8)*(local preference) + (2^0)*(256 - component ID)
可以看pjnath的ICE代码.
使用的就是这个.
7 选择type和local preference的方针
首先中继候选者和VPN网络接口的主机候选者,他们由于传送和接受数据存在中间人,这就增加了延迟和包丢失的概率.所以出于这种观念,type preference,host=126,server=100,
110=peer,0=relayed.而且如果agent有多个网络接口,VPN=0.
另外要考虑的local preference是IP类型,安全,拓扑.
8 选择默认候选者
默认候选者就是可以接收从没有ICE的一方发来的媒体数据.推荐是relay,否则reflexive,否则host.