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 restricted
IP 限制锥型NAT
host 主机在 NAT 上“打洞”后,NAT 会对穿越洞口的 IP 地址做限制。只有登记的 IP 地址才可以通过。
IP 限制锥型 NAT 的映射表是一个 5 元组,即:
1 | { |
port restrected
端口限制型NAT
不光在 NAT 上对打洞的 IP 地址做了限制,而且还对具体的端口做了限制。因此,端口限制型 NAT 的映射表是一个 6 元组,其格式如下:
1 | { |
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有着两套规范,分别是:RFC3489
Simple 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 | 拒约 |
RFC5389
Session Traversal Utilities for NAT(它是UDP和TCP都有用到的)
TURN协议
- 目的是解决堆成NAT无法穿越的问题
- 其建立在STUN之上,消息格式使用STUN格式消息
- TURN Client要求服务端分配一个公共IP和Port用于接收或发送数据
ICE框架
- 收集Candidate(本机所有IP和制定端口)
- 对Candidate Pair 排序
- 连通性检查
什么是 Candidate?
它表示 WebRTC 与远端通信时使用的协议、IP 地址和端口,一般由以下字段组成:
1 | { |
其中,候选者类型中的 host 表示本机候选者,srflx 表示内网主机映射的外网的地址和端口,relay 表示中继候选者。
SDP
SDP
session description protocol,它是一种信息格式的描述标准,本身不属于传输协议,但是可以被其他传输协议用来交换必要的信息。
RTP/RTCP
一般情况下,在实时互动直播系统传输音视频数据流时,我们并不直接将音视频数据流交给 UDP 传输,而是先给音视频数据加个 RTP 头,然后再交给 UDP 进行传输。
在使用 RTP 包传输数据时,难免会发生丢包、乱序、抖动等问题,但在处理这些问题之前,它首先要让各端都知道它们自己的网络质量到底是怎样的,这就是 RTCP 的作用。
各协议头字段如下,SSRC为共享媒体流的源。