0%

WebRTC

WebRTC介绍

WebRTC一个由google开源的音视频处理+即时通讯的开源库,优秀的多媒体、跨平台框架。它极其庞大复杂,换句话来说功能很强大,然后就是WebRTC只是定义了客户端的规范,至于服务器可以根据自己的业务场景来实现,一般应用于:

  • 音视频会议、在线教育
  • 照相机
  • 音乐播放器
  • 共享远程桌面
  • 录制
  • 实施人脸识别
  • 游戏
  • 文件传输工具
  • P2P网络加速
  • 即时通讯工具

WebRTC 1 对 1 音视频实时通话

过程示意图

即两个 WebRTC 终端(上图中的两个大方框)、一个 Signal(信令)服务器和一个 STUN/TURN 服务器。

WebRTC 终端负责音视频采集、编解码、NAT 穿越、音视频数据传输。步骤流程如下:

  • 获取权限(摄像头、麦克风)
  • 本地视频的采集与展示
  • 创建RTCPeerConnection
  • 媒体协商
  • 远端视频的展示

Signal 服务器负责信令处理,如加入房间、离开房间、媒体协商消息的传递等。
STUN/TURN 服务器负责获取 WebRTC 终端在公网的 IP 地址,以及 NAT 穿越失败后的数据中转。

NAT

Full Cone 完全锥型NAT
当 host 主机通过 NAT 访问外网的 B 主机时,就会在 NAT 上打个“洞”,所有知道这个“洞”的主机都可以通过它与内网主机上的侦听程序通信。
所谓的“打洞”就是在 NAT 上建立一个内外网的映射表。
大多数人都选用UDP作为打洞协议.

ip restrictedIP 限制锥型NAT
host 主机在 NAT 上“打洞”后,NAT 会对穿越洞口的 IP 地址做限制。只有登记的 IP 地址才可以通过。

IP 限制锥型 NAT 的映射表是一个 5 元组,即:

1
2
3
4
5
6
7
{
内网 IP,
内网端口,
映射的外网 IP,
映射的外网端口,
被访问主机的 IP
}

port restrected 端口限制型NAT

不光在 NAT 上对打洞的 IP 地址做了限制,而且还对具体的端口做了限制。因此,端口限制型 NAT 的映射表是一个 6 元组,其格式如下:

1
2
3
4
5
6
7
8
{
内网 IP,
内网端口,
映射的外网 IP,
映射的外网端口,
被访问主机的 IP,
被访问主机的端口
}

symmetric 对成型NAT
host 主机访问 B 时它在 NAT 上打了一个“洞”,而这个“洞”只有 B 主机上提供服务的端口发送的数据才能穿越,这一点与端口限制型 NAT 是一致的。

但它与端口限制型 NAT 最大的不同在于,如果 host 主机访问 A 时,它会在 NAT 上重新开一个“洞”,而不会使用之前访问 B 时打开的“洞”。也就是说对称型 NAT 对每个连接都使用不同的端口,甚至更换 IP 地址,而端口限制型 NAT 的多个连接则使用同一个端口,这对称型 NAT 与端口限制型 NAT 最大的不同.

NAT 类型检测步骤

  • 判断是否有 NAT 防护
  • 探测 NAT 环境

STUN协议

  • STUN存在的目的就是进行NAT穿越。
  • STUN是典型的客户端/服务器模式,即:客户端发送请求,服务端进行相应。

STUN有着两套规范,分别是:
RFC3489Simple Traversal of UDP Through NAT

RFC3489定义属性
| 属性 | 作用 | |
| :—–| :— | :—- |
| 0x001 | mapped-address | 获取客户端映射地址 |
| 0x002 | response-address | 指明对于mapped-address的相应应该由哪里发送 |
| 0x003 | change-request | 请求服务端使用不同的IP和端口发送响应 |
| 0x004 | souce-address | 制定服务器的IP和端口 |
| 0x005 | change-addresss | 它是change-addresss请求的响应 |
| 0x006 | user-name | 用于安全验证 |
| 0x007 | password | 用于安全验证 |
| 0x008 | message-integrity | 消息完整性验证 |
| 0x009 | error-code | 错误码 |
| 0x00a | unknow-attributes | 未知属性 |
| 0x00b | peflected-from | 拒约 |

RFC5389Session Traversal Utilities for NAT(它是UDP和TCP都有用到的)

TURN协议

  • 目的是解决堆成NAT无法穿越的问题
  • 其建立在STUN之上,消息格式使用STUN格式消息
  • TURN Client要求服务端分配一个公共IP和Port用于接收或发送数据

ICE框架

  • 收集Candidate(本机所有IP和制定端口)
  • 对Candidate Pair 排序
  • 连通性检查

什么是 Candidate?
它表示 WebRTC 与远端通信时使用的协议、IP 地址和端口,一般由以下字段组成:

1
2
3
4
5
6
7
8
9
{
IP: xxx.xxx.xxx.xxx,
port: number,
type: host/srflx/relay,
priority: number,
protocol: UDP/TCP,
usernameFragment: string
...
}

其中,候选者类型中的 host 表示本机候选者,srflx 表示内网主机映射的外网的地址和端口,relay 表示中继候选者。

SDP

SDPsession description protocol,它是一种信息格式的描述标准,本身不属于传输协议,但是可以被其他传输协议用来交换必要的信息。

RTP/RTCP

一般情况下,在实时互动直播系统传输音视频数据流时,我们并不直接将音视频数据流交给 UDP 传输,而是先给音视频数据加个 RTP 头,然后再交给 UDP 进行传输。

在使用 RTP 包传输数据时,难免会发生丢包、乱序、抖动等问题,但在处理这些问题之前,它首先要让各端都知道它们自己的网络质量到底是怎样的,这就是 RTCP 的作用。

各协议头字段如下,SSRC为共享媒体流的源。

RTP

RTCP