架构
主体包含3个模块,音频引擎,视频引擎,传输层。最核心的在于传输层。
- 音频引擎包含回声消除,降噪音频编解码等。音频采集和渲染层 可override自己实现
- 视频引擎包含VP8,VP9,H264编解码,图形增强的算法。视频采集层 可override自己实现,不包含图像渲染层
- 传输层包含P2P,STUN,TURN,ICE,RTP,RTSP等传输控制协议。网络IO层可override 自己实现
信令服务器
NAT穿越:
设备大多在网关背后,想要简历P2P连接就要穿过网关,连接到内网的设备,网关一般包含以下4种防火墙类型。
- 完全锥形:网关只做简单的映射,最容易穿越
- 地址限制锥形:对于主动访问外网的IP做记录,容易穿越
- 端口限制锥形:对主动访问外网的IP和Port做记录,比上一个更严格
- 对称型:内网与外网通信会建立一个IP和Port,不同的外网地址建立不同的IP和port,基本无法穿越。是否可用中继服务器的方式打洞
穿越原理
- C1, C2向STUN发消息
- 交换公网IP和Port
- C1->C2, C2->C1。如果是对称型需要端口猜测
STUN:
目的就是获取设备的公网IP和Port然后互相交换
TURN:
目的是解决对称NAT无法穿越的问题,用来转发数据。 获取到双方地址后尝试P2P链接,如果链接失败,则使用数据转发
ICE:
包含了STUN, TURN的一整个解决方案框架,不断选择最优的链接通路,获取不同的candidate,尝试最优的链路。
- 收集Candidata
- 对Candidate Pair排序,筛选出最合适的候选者对,否则直接检查浪费时间
- 一方收集到所有候选者后,通过信令传给对方
- 另一方收到候选者后也做收集工作
- 当双方拿到全部列表后,将候选者形成匹配对儿
- 对Candidate Pair连通性检查
- 对每个后选对进行发送,接收检查
***
Candidata
是一个地址,例如: …UDP…192.168.1.2 1816 type host等协议,地址,类型 类型包含3个:
- 主机候选者, 本机网卡上所有地址和类型
- 反射候选者,NAT穿越后的地址和类型, SUTN/TURN
- 中继候选者, TURN服务开通后的地址和类型, TURN
SDP
Session Description Protocol , 是设备之间互通配置信息的协议
上图中是SDP基本内容, 其中有2个candidate, 一个是本机UDP,另一个是NAT穿越后的地址UDP
SDP规范包括2部分:
- 会话层: 会话时间,名称等全局基本信息,多个媒体信息
- 媒体层
- 媒体格式:音频、视频、数据
- 传输协议:TCP/UDP
- 传输IP和Port
- 媒体负载类型:VP8 VP9 h264. h265
m 媒体名称和地址, c 传输层信息, b 带宽信息 ,a 各种属性定义和对m的描述
WebRTC中的SDP包含5个部分:
- 会话元
- 网络描述
- 流描述
- 安全描述
- 服务质量
连接流程图
简易版流程图
- 与信令服务器建立连接,用于2端之间进行必要协商通信
- 媒体协商 (SDP),选择双方合适的媒体类型
- 连接协商 (Candidate),选择最合适的连接方式
- 建立P2P连接,开始媒体交换