ICE全称Interactive Connectivity Establishment:交互式连通创建方式。算法
ICE参照RFC5245建议实现,是一组基于offer/answer模式解决NAT穿越的协议集合。
它综合利用现有的STUN,TURN等协议,以更有效的方式来创建会话。浏览器
客户端侧无需关心所处网络的位置以及NAT类型,而且可以动态的发现最优的传输路径。安全
Classic STUN 有着诸多局限性,例如:服务器
RFC5389是RFC3489的升级版网络
ICE利用STUN(RFC5389) Binding Request和Response,来获取公网映射地址和进行连通性检查。同时扩展了STUN的相关属性:架构
ICE使用TURN(RFC 5766)协议做为STUN的辅助,在点对点穿越失败的状况下,借助于TURN服务的转发功能,来实现互通。端口与STUN保持一致tcp
TURN消息都遵循 STUN 的消息格式,除了ChannelData消息。函数
TURN的流程:学习
l 建立Allocation:加密
client 使用allocation transaction建立relay 端口,并在allocation的响应中回复给client。
当allocation建立后须要使用refresh request来保活,默认lifetime为10分钟。
l 建立Permission:
由allocation建立Permission,每一个Permission 由 IP 地址 和lifetime组成。
有两种方法来建立和刷新Permission
l 收发数据:
分为 controlling和controlled。
Offer 一方为controlling角色,answer一方为controlled角色。
分为FULL ICE和Lite ICE:
FULL ICE:是双方都要进行连通性检查,完成的走一遍流程。
Lite ICE: 在FULL ICE和Lite ICE互通时,只须要FULL ICE一方进行连通性检查, Lite一方只需回应response消息。这种模式对于部署在公网的设备比较经常使用。
媒体传输的候选地址,组成candidate pair作连通性检查,肯定传输路径,有以下属性:
Type 类型有:
Host/Srvflx/Relay/Prflx
Componet ID
传输媒体的类型,1表明RTP;2表明 RTCP。
WebRTC采用Rtcp-mux方式,也就是RTP和RTCP在同一通道内传输,减小ICE的协商和通道的保活。
Priority
Candidate的优先级。
若是考虑延时,带宽资源,丢包的因素,Type优先级高低通常建议以下顺序:
host > srvflx > prflx > relay
Base
是指candidate 的基础地址。
Srvflx address 的base 是本地host address。
host address和 relayed address 的base 是自身。
由本端和远端candidate组成的pair,有本身的优先级。
pair优先级的计算是取决candidate的priority。
priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0)
G:controlling candidate 优先级
D:controlled candidate 优先级
ICE选择高优先级的candidate pair。
由candidate pair生成按优先级排序的链表,用于ICE连通性检查。
由连通性检查成功的candidate pair按优先级排序的链表,用于ICE提名和选择最终路径。
根据Componet ID:
获取本机host address.
从STUN服务器获取 srvflx address.
从TURN服务器获取 relay address.
同时生成foundation。
收集地址完成后,须要去掉重复的candidate,若是两个candidate的地址同样,而且Base地址也同样,则删除它。
ICE 使用offer/answer方式,双方经过SDP协商交换candidate信息.
Candidate信息包括type,foundation,base,component id,transport
SDP a行格式以下:
“a=candidate:1 1 UDP 9654321 212.223.223.223 12345 typ srflx raddr 10.216.33.9 rport 54321”
表示 foundation为1,媒体是RTP,采用UDP协议,公网映射地址为212.223.223.223:12345,优先级为9654321,type为srflx,base地址为10.216.33.9:54321
在本端收到远端candidates后,将Component ID和transport protocol相同的candidates组成pair。
修整candidate pair,若是是srvflx地址,则须要用其base地址替换。
对端也是一样的流程。
将candidate pairs按照优先级排序,生成checklist,供连通性检查使用。
Ordinary checks 两端都按照各自checklist分别进行检查。
Triggered checks 收到对端的检查时,也在对应的candidate pair上发起连通性检查,以提升效率
若是checklist里有relay candidate,则必须首先为relay candidate建立permission。
ICE 使用STUN binding request/response,包含Fingerprint检验校验机制。
若是A收到B的response,则表明连通性检查成功,不然须要进行重传直到超 时。
在创建链接时,若是没有响应,则会以RTO时间进行重传,每次翻倍,直到最大重传次数。
STUN请求 采用STUN short-term credential方式认证,
STUN USERNAME属性 ”RemoteUsername:localUsername”
两端在SDP协商时交换ice-pwd和ice-ufrag,以得对端用户名和密码。
STUN 检查请求中须要检查地址的对称性,请求的源地址是响应的目的地址,请求的目的地址是响应的源地址,不然都设置状态为 Failed。
将连通性检查成功的candidate pair并按优先级排序加入validlist,这时本地candidate填写的是公网映射地址,remote candidate填写的是对端发送的STUN binding request地址。
由controlling来提名哪对candidate pair为valid pair
提名方式又分为普通提名和进取型提名
普通提名方式会作两次连通性检查,在第一次作连通性检查时不会带上USE-CANDIDATE属性,而是在生成的validlist里选择pair再进行一次连通性检查,这时会带上USE-CANDIDATE属性,而且置位nominated flag。
进取型方式则是每次发送连通性检查时都会带上USE-CANDIDATE属性,而且置位nominated flag,不会再去作第二次连通性检查。
10. 选择最终传输地址
ICE在提名的valid pair里选择优先级最高那对做为本次ICE流程传输地址。
随着WebRTC的应用愈来愈广泛,不管是Native端仍是Web端,因为普遍的适应 能力以及对将来网络的支持,ICE做为一种综合的解决方案将有着很是广阔的应用前景。
网易云信翻译了W3C推荐标准WebRTC 1.0: Real-time CommunicationBetween Browsers,并提供《WebRTC1.0: 浏览器间实时通信》中文版免费下载。
限时免费下载,WebRTC开发者必备。
想要阅读更多技术干货、行业洞察,欢迎关注网易云信博客。
了解网易云信,来自网易核心架构的通讯与视频云服务。
网易云信(NeteaseYunXin)是集网易18年IM以及音视频技术打造的PaaS服务产品,来自网易核心技术架构的通讯与视频云服务,稳定易用且功能全面,致力于提供全球领先的技术能力和场景化解决方案。开发者经过集成客户端SDK和云端OPEN API,便可快速实现包含IM、音视频通话、直播、点播、互动白板、短信等功能。