音视频流媒体开发WebRTC 基础知识 -- ICE 交互总结( 二 )


如果 checklist 中存在 relay candidate,则必须先为 relay candidate 创建 permission;permission 就是一个许可,如果没有创建许可,发送的包将被丢弃 (针对 TURN 时使用)
ICE 使用 STUN binding request/response,包含 Fingerprint 检验校验机制
如果 A 收到 B 的 response 则代表连通性检查成功,否则需要进行重传直到超时,在建立连接时,如果没有响应,则会以 RTO 时间进行重传,每次翻倍,直到最大重传次数;
STUN 请求采用 STUN short-term credential 方式认证,即一段时间如果没有 stun 包发送时,该连接会过期失效,因此需要不断地发送 stun 包并收到回复的 stun 包,用来保持连接有效性;刚开始建联时,以 50ms 间隔频率发送,后期稳定后是以 2.5s 的间隔频率发送,维持连接的有效性
STUN USERNAME 属性 ”RemoteUsername : localUsername”
两端在 SDP 协商时交换 ice-pwd 和 ice-ufrag,以得对端用户名和密码,计算 stun 包中的 MESSAGE-INTEGRITY 时,需要自己本地的 ice-pwd 去计算 Hmac-SHA1,生成对应的属性值串,用来检查消息的完整性
生成 validlist
将连通性检查成功的 candidate pair 按优先级排序加入 validlist,此时本地 candidate 填写的是公网映射地址,remote candidate 填写的是对端发送的 STUN binding request 地址
提名 candidate pair
由 controlling 提名哪对 candidate pair 为 valid pair
提名方式分为普通提名和进取型提名
普通提名方式会做两次连通性检查,在第一次做连通性检查时不会带上 USE-CANDIDATE 属性,而是在生成的 validlist 中选择 pair 再进行一次连通性检查,这时会带上 USE-CANDIDATE 属性,并且置位 nominated flag (ICE 提名地址对)
进取型方式则是每次发送连通性检查时都会带上 USE-CANDIDATE 属性,并且置位 nominated flag (ICE 提名地址对),不会再去做第二次连通性检查
选择最终传输地址
ICE 在提名的 valid pair 中选择优先级最高的那对作为本次 ICE 流程传输地址,然后开始建立 DTLS 连接,开始握手,交换证书
【3】ICE 交互示例解析如果 A 收到 B 的 response,则代表连通性检查成功,否则需要进行重传直到超时
在建立连接时,如果没有响应,则会以 RTO 时间进行重传,每次翻倍,直到最大重传次数
STUN 请求,采用 STUN short-term credential 方式认证
STUN USERNAME 属性 ”
RemoteUsername:localUsername”
两端在 SDP 协商时交换 ice-pwd 和 ice-ufrag,以得对端用户名和密码
STUN 检查请求中需要检查地址的对称性,请求的源地址是响应的目的地址,请求的目的地址是响应的源地址,否则都设置状态为 Failed
ICE 的完整实现过程
1. 为中继候选地址生成许可 (Permissions)
2. 从本地候选往远端候选发送 Binding Request
在 Binding 请求中通常需要包含特殊的属性,以在 ICE 进行连接性检查的时候提供必要信息
PRIORITY 和 USE-CANDIDATE
终端必须在其 request 中包含 PRIORITY 属性,指明其优先级,优先级由公式计算获得;如果有需要也可以给出特别指定的候选 (即 USE-CANDIDATE 属性)
ICE-CONTROLLED 和 ICE-CONTROLLING
在每次会话中,每个终端都有一个身份,存在两种身份,即受控方(controlled role) 和主控方(controlling role),主控方负责选择最终用来通讯的候选地址对,受控方被告知哪个候选地址对用来进行哪次媒体流传输,并且不生成更新过的 offer 来提示此次告知;发起 ICE 处理进程 (即生成 offer)的一方必须是主控方,而另一方则是受控方;如果终端是受控方,那么在 request 中就必须加上 ICE-CONTROLLED 属性;如果终端是主控方,就需要 ICE-CONTROLLING 属性
生成 Credential
作为连接性检查的 Binding Request 必须使用 STUN 的短期身份验证;验证的用户名被格式化为一系列 username 段的联结,包含了发送请求的所有对等端的用户名,以冒号隔开;密码就是对等端的密码
3. 处理 Response
当收到 Binding Response 时,终端会将其与 Binding Request 相联系,通常通过事务 ID;随后将会将此事务 ID 与候选地址对进行绑定
终端收到成功响应之后,先检查其 mApped address 是否与本地记录的地址对有匹配,如果没有则生成一个新的候选地址,即对等端的反射地址;如果有匹配,则终端会构造一个可用候选地址对 (valid pair);
通常很可能地址对不存在于任何检查列表中,此时检索检查列表中没有被服务器反射的本地地址,将这些地址的本地候选转换成服务器反射地址的基地址并把冗余的地址去除掉;
失败响应


推荐阅读