webRTC学习笔记
前言
在网络上传输数据,最原始的方式就是C-S通信。CS模式固然可靠,适合绝大部分场景。但是对于音视频尤其是及时音视频来说,CS模式需要服务器做中转延迟过高,而且服务器也没必要知道传输的数据流不需要承载这个负荷。
所以需要点对点直连,即p2p通信,直接连接收发双方。既然是通信,收发双方就需要知道对方的地址。通常来说二者通过ICE来交换地址。本机对外的IP如何获取?有以下几种方式:
- 在局域网里,大家的对外的IP都是本机读到的IP,可以方便的分享出去。
- 但是大多数设备都是不知道自己在互联网上的地址的,因为有NAT的存在,本机设备的IP地址被映射到公网的IP。设备需要使用STUN获取自己映射后的唯一地址。
- 尽管可以通过STUN获得公网地址,但是NAT是有4种类型的。特别的,对称NAT每次会根据本机IP、目标IP和目标端口生成一个公网IP和端口,因此外界无法确定本机设备的唯一地址。在这种情况下只能通过中继传输数据即TURN。
实现以上二者知道对方地址的过程叫做ICE。ICE是一种方法而不是协议,ICE通过STUN或TURN收集双方信息,然后进行交换。收集信息的过程可能比较崎岖,但ICE的最终目的就是让二者能够通信。在获取通信方式的以上3种方法里,ICE会根据优先级1>2>3向双方提供信息,其中3就类似于类似于传统CS模式所以优先级最低。
以上获取对方IP地址进行连接只是第一步,接下来需要传输媒体信息(SDP),传输媒体信息使用SRTP和RTCP,当然传输媒体信息前需要进行SDP协商以确认音视频信息。
大致流程如下

详细流程如下

ICE
交互式连接建立(Interactive Connectivity Establishment)
ICE做什么
- 收集Candidate信息
- 对Candidate Pair排序(用哪种效果最好,本地网用Host,然后外网是反射进行,最后是中继)
- 联通性检查,发送侦测包
ICE candidate
candidate是一个[协议-IP-端口-类型]四元组,例如
UDP-192.168.1.1-12123-host
candidate类型有:
- 主机Host:本机,收集时本机所有IP和指定端口
- 反射Reflexive:NAT映射后的,收集时Host向STUN服务器发送消息,然后获得本机的外网地址
- 中继Relay:NAT穿越不通过时,收集时向TURN服务器发送,获得响应,中继Candidate要中转一次类似于传统的CS模式,速度最慢。
RTP和RTCP
RTP
即时传输协议(Real-time Transport Protocol或简写RTP),是一个建立在UDP上的应用层协议。
其头部如下:

其中,Timestamp和SSRC字段比较重要,Timestamp标志了这一帧的事件,用于一帧由多个包组成时的同步,SSRC标志了唯一源。
RTCP
实时传输控制协议(Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是实时传输协议(RTP)的一个姐妹协议。RTCP并不传输媒体数据,只是用来传输统计数据。

SRTP和SRTCP
安全实时传输协议(Secure Real-time Transport Protocol),是建立在DTLS上的RTP。
DTLS:
Data Transport Layer Security。UDP的TLS。
四次握手:hello->hello resp+认证信息->解析认证信息+加密套件->按照加密套件发送信息

DTLS要解决的问题:
-
通过DTLS交换加密算法,交换密钥。
-
通过SRTP进行媒体数据交换。
SRTP:
SRTP解决的问题:
- 保证数据安全
- 保证数据完整性

SRTP就是把RTP的payload进行加密。
STUN和TURN
什么是STUN
Session Traversal Utilities for NAT,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址。 这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。RTP协议是使用UDP分组在Internet上传输音频和/或视频数据的。 不幸的是,由于通信的两个末端往往位于NAT之后,因此用传统的方法是无法建立连接的。 这也就是STUN发挥作用的地方。STUN是一个建立在UDP上的应用层协议。
20字节头部+0个及其以上个Attribute。每个属性是一个TLV编码。

| 字段 | 说明 |
|---|---|
| 前两位00 | 说明是新版本STUN |
| STUN Message Type | 消息类型,2位用用于分类(不在同一位置 ),12位用于定义请求分类 |
| Message Length | 消息长度,不包括头 |
| Magic Cookie | 魔法数,说明是STUN消息而不是其他 |
| Transaction ID | 上下文,用于关联消息和请求 |
什么是TURN
TURN(全名Traversal Using Relay NAT),当NAT无法穿越时需要一个中转服务器,成为TURN服务器。
为什么要用STUN
通过STUN信息交换确认客户端身份。而不是P2P通信时获取外网地址
STUN定义的NAT类型
-
Full Cone NAT 完全锥型NAT
本机IP和Port映射到公网IP和Port
-
Address Restricted Cone NAT 地址限制型NAT
类似1,但是本机先向外网某个IP发过信息,这个IP才能发过来包,外网端口没有限制
-
Port Restricted Cone NAT 端口限制型NAT
比2更进一步,本机先向外网某个IP的某个Port发过信息,这个IP的这个Port才能发过来包,该IP的其他Port不能
-
Symmetric NAT 对称NAT
和3类似,但是向不同外网IP地址或不同Port发信息时,NAT映射的IP和Port都不一样。3至少能够让一个内网IP与外网IP绑定。而4完全的动态IP再也找不到互联网上的固定地址。
STUN工作原理

SDP协商
Session Description Protocol,信息格式的描述标准类似于json。本机音视频和解码信息,通过信令服务器发送,让双方知晓。
SDP协商过程:

webRTC SDP组成:

多人音视频架构
Mesh
互相1对1,但是人数多的时候对网络要求很大。

Multipoint Conferencing Unit
节省带宽,混和视频信号对CPU消耗严重。相当于实时剪辑视频。

Selective Forwarding Unit
服务端直接转发流。对带宽要求高。
为了降低对带宽的要求,可以:
- 直接降低码流,降低分辨率
- SVC,分层(核心层拓展层边缘层)一层比一层清晰、
