对此rfc的翻译正确性不做任何保证。按照它而导致的任何问题后果自负。转载请注明原地址。
4发送初始offer
为了能在offer/answer交互中发初始offer,一个agent必须1收集候选地址2排序3删除重复4选择默认候选5制定并发送SDP。
4.1完整实现所需要的
4.1.1收集候选
一个agent在即将通信前做这件事。它可以由用户接口触发或者在会话初始中明确要求。所有候选是个传输层地址。候选还包括类型和BASE。类型有四种:主机地址,服务器自反地址,对端自反地址,中继地址。服务器自反地址由STUN或TURN获取,中继地址由TURN获取。对端自反地址在ICE连接性检测的阶段获取。BASE是agent发送数据时必须用的候选地址(译注?)。
4.1.1.1主机候选地址
主机地址由在IP上绑定端口获得。
agent要为每个媒体流组件获得候选地址。每个IP上的主机候选地址总和组件相绑定(译注:看例子)。每个组件有个组件ID,例如如RTP媒体流,RTP组件ID1,RCTP组件ID2。如果agent用RCTP,它必须为RCTP收集候选地址。如果agent用RTP+RCTP,最终会有2*K个主机候选地址,其中K是agent的IP数量。每个主机候选地址的BASE是它自己。
4.1.1.2服务自反候选地址和中继候选地址
agent应该能获得服务器自反地址和中继地址。这个具体取决于网络。比如纯内网环境下的多栈主机(多IP),只要获取它的主机地址就足够了,ICE只是用来选择用什么主机地址。
TURN的使用代价高昂,只有双终端在对称型NAT后才用。所以有些时候就不用TURN了。所以建议当agent不需要收集服务器自反地址和中继地址时,可以关闭这功能,需要时再打开。
当收集服务器自反地址和中继地址时用TURN服务器,只收集服务器自反地址时用STUN服务器。
agnet通过配置或DNS来确定TURN/STUN服务器的位置。建议用DNS。rfc5389描述DNS找STUN服务器,rfc5766描述DNS找TURN服务器。
上面只讲了单STUN和单TURN。如果有多个STUN或TURNserver,从同一个Server来获取候选地址。(多Server)的结果是有多个从Server传来的主机地址。agent选择一个,从上面向Server发送Binding or Allocate。绑定是没有验证的,备用服务器发回的响应也需忽略。agent必须为Binding请求实现rfc5389中的向后兼容模式。Allocate请求需要通过其他长期的验证方式验证。
Ta微秒后,agent能发起新的STUN/TURN事物。新事物可以是可恢复性故障的重试(如认证错误),或是为新的主机候选地址--Server对发起。agent发送频率不应该超过Ta,详细见16章如何设置Ta和STUN重传超时RTO
Agent会收到Binding or Allocate响应。成功的Allocate响应使agent获得了服务器自反地址(包含在映射地址中),和中继地址(在XOR-RELAYED-ADDRESS属性中)。如果服务器由于缺乏资源而拒绝了Allocate请求,agent应该发Binding请求,来获得服务器自反地址。Binding响应会给agent提供唯一一个服务器自反地址(包含在映射地址中)。服务器自反地址的BASE是Binding or Allocate发送的主机候选地址。中继地址的BASE是它自己。如果中继地址和主机候选地址相同,这个中继被忽略。
4.1.1.3计算"基础"
最后,agent给每个候选地址分配个"基础(Foundations)",它在一个会话中有效。两个候选地址在如下的情况下的“Foundations”必须一致:
1类型一致(主机、中继、服务器自反、对端自反)
2BASE的IP相同(端口可以不一样)
3获取自反和中继地址的STUN和TURN服务器IP必须一样。
4传输层协议相同(TCP/UDP)
如果上述条件有一条不满足,Foundations必须不同。
4.1.1.4保持候选有效
中继、服务器自反地址在ICE流程结束前必须保持有效(见8.3)。从Binding Request中获得的服务器自反地址还需要通过向服务器发额外的Binding Request来保持有效。更新(Refresh)通过更新事物来完成(rfc5766),Refresh请求也会刷新服务器自反地址。
4.1.2候选优先级计算
(待续)