【网络通信 -- WebRTC】WebRTC 基础知识 -- ICE 交互总结
【1】ICE 的一般概念简介ICE 角色
offer (主动发起)的一方为 controlling 角色
answer (被动接受)的一方为 controlled 角色
full ice agent 必须是 controlling role,lite ice agent 是 controlled;srs 仅支持 lite ice
ICE 模式
FULL ICE,双方都要进行连通性检查;ice 客户端实现,该模式既可以收 binding request,也可以发 binding request
Lite ICE,在 FULL ICE 和 Lite ICE 互通时,只需要 FULL ICE 一方进行连通性检查,Lite 一方只需回应 response 消息,该模式对于部署在公网的设备比较常用;只接受并回复 binding request 请求,不会主动发送 binding request 请求给对方
sdp 中有 a=ice-lite 字样
srs 服务器采用 lite-ice 模式
Candidate 地址
媒体传输的候选地址,组成 candidate pair 做连通性检查,确定传输路径
Type 类型
Host (Host Candidate),该地址是一个真实的主机,参数中的地址和端口对应一个真实的主机地址,该地址来源于本地的物理网卡或逻辑网卡上的地址,对于具有公网地址或者同一内网的端可以用;
Srvflx (Server Reflexive Candidate),该地址是通过 Cone NAT (锥形 NAT) 反射的类型,参数中的地址和端口是端发送 Binding 请求到 STUN/TURN server 经过 NAT 时,NAT 上面分配的地址和端口
Relay (Relayed Candidate),该地址是端发送 Allocate 请求到 TURN server,由 TURN server 用于中继的地址和端口,该地址和端口是 TURN 服务用于在两个对等点之间转发数据的地址和端口,是一个中继地址端口;( 可能是本机或 NAT 地址);
Prflx(Peer Reflexive Candidate),该地址是通过发送 STUN Binding 时,通过 Binding 获取到的地址;在建立连接检查期间新发生,参数中的地址和端口是端发送 Binding 请求到 STUN/TURN server 经过 NAT 时,NAT 上分配的地址和端口
Componet ID
传输媒体的类型,1 代表 RTP; 2 代表 RTCP
WebRTC 采用 Rtcp-mux 方式,也就是 RTP 和 RTCP 在同一通道内传输,减少 ICE 的协商和通道的保护
Priority
Candidate 的优先级
Base
candidate 的基础地址
SDP 中的 Candidate 地址描述
文章插图
ICE 保活
对于每个 ICE 通道,都需要为其会话进行保护
采用 STUN binding request 或者 STUN binding indication
如果没有收到响应,则会重传,直到最大重传次数
ICE 角色冲突的解决方法
当两端角色都为 controlling 或者 controlled 角色冲突时,在连通性检查阶段,要求发送信息 binding request 消息中必须要带上 tie-breaker 属性
当出现冲突时,比较 tie-breaker 大小,值比较大的则被认为是 controlling,同时回应 487 错误给对端,对端收到消息 487 错误后切换角色
文章插图
私信【1】领取上图学习webRTC高级开发技术,资源资料共享【2】ICE 的一般过程收集 candidates
客户端无法知道自己的外网 IP,需要发送 stun 包给 stun 服务,stun 服务返回对应客户端的出口 IP 和端口,返回来的地址和自己本地地址做比对便可以知道 NAT 类型
根据 Componet ID,获取本机 host address;从 STUN 服务器获取 srvflx address;从 TURN 服务器获取 relay address;同时生成 foundation;
删除重复的 candidate 收集地址完成后,需要去掉重复的 candidate,如果两个 candidate 的地址一样,并且 Base 地址也一样则删除
交换 candidates
ICE 交换 candidates 方式可以使用 sdp 交换,也可以使用单独信令交换
ICE 交换 candidates sdp 方式
ICE 使用 offer/answer 方式,双方通过 SDP 协商交换 candidate 信息;
Candidate 信息包括 type, foundation, base, component id, transport
SDP 示例
文章插图
文章插图
生成 candidate pairs
在本端收到远端 candidates 后,将 Component ID 和 transport protocol 相同的 candidates 组成 pair
修整 candidate pair,如果是 srvflx 地址则需要用其 base 地址替换
连通性检查
将 candidate pairs 按照优先级排序,供连通性检查使用,其实就是把 sdp 中的 candidate 地址和本地的 candidate 地址进行排队,组成一个 checklist 表,生成按优先级排序的链表,按优先顺序发起每个候选地址对的检查;
连通性检查成功的 candidate pair 按优先级排序的链表,用于 ICE 提名和选择最终路径,连通性检查完毕后,开始进行优先级排序
推荐阅读
- 前端开发中需要掌握的开发框架React
- 2021年Android开发新技术动向,未来的路该怎么走?
- RabbitMQ的开发应用
- 程序员常用的 15 款开发者工具
- .net微信全平台快速开发的应用框架,专注业务实现,值得收藏
- java开发框架之SSM整合框架
- SpringBoot开发的物联网通信平台系统,值得收藏学习
- MySQL 团队开发规范,太详细了,建议收藏
- 前端开发框架之Vue开发流程与使用
- FFmpeg开发——入门介绍