mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
854 字
2 分钟
WebRTC:实时通信协议详解
2022-09-27

前言#

WebRTC(Web Real-Time Communication)是浏览器原生支持的实时通信技术,无需安装插件即可实现端到端的音频、视频和数据传输。本章详解 WebRTC 的架构、连接建立流程和应用场景。

一、WebRTC 概述#

1.1 核心能力#

能力说明
音视频通话点对点音频/视频通话
屏幕共享分享屏幕或窗口
文件传输P2P 数据传输
实时游戏低延迟多人游戏

1.2 协议栈全景#

graph TB subgraph "应用层" A[Web Application] end subgraph "WebRTC API" B[getUserMedia] --> G[MediaStream] C[RTCPeerConnection] --> H[ICE/STUN/TURN] D[RTCDataChannel] --> I[SCTP/DTLS] end subgraph "传输层" E[SRTP] --> J[UDP] F[DTLS] --> J I --> F end subgraph "安全层" K[DTLS-SRTP] --> E end A --> B A --> C A --> D style A fill:#e3f2fd style H fill:#fff3e0 style K fill:#fce4ec

WebRTC 与 WebSocket 协议 都支持实时通信,但 WebRTC 提供真正的 P2P 连接,延迟更低,适合音视频场景。底层使用 UDP(类似 HTTP/3 的 QUIC 协议),避免 TCP 队头阻塞。

1.3 与 WebSocket 对比#

特性WebSocketWebRTC
延迟数十毫秒更低(P2P直连)
服务器需要中转服务器无需服务器(建立后)
适用场景消息推送、聊天视频通话、文件传输
协议层TCPUDP/TCP

二、架构概览#

graph TB A["WebRTC API"] --> B["PeerConnection"] B --> C["Signaling"] B --> D["ICE"] D --> E["STUN"] D --> F["TURN"] G["DataChannel"] --> B H["MediaStream"] --> B

2.1 核心组件#

  • PeerConnection:管理端到端连接
  • MediaStream:获取摄像头/麦克风流
  • DataChannel:P2P 数据通道
  • Signaling:信令交换(通过服务器)

信令服务器通常使用 WebSocket 协议 实现 SDP 和 ICE 候选的实时交换。

三、连接建立流程#

3.1 ICE 候选交换#

sequenceDiagram participant C as Caller participant S as Callee participant STUN as STUN Server participant TURN as TURN Server C->>STUN: 请求 NAT 映射 STUN->>C: 公网 IP:端口 C->>S: ICE Candidate: 公网地址 S->>STUN: 请求 NAT 映射 STUN->>S: 公网 IP:端口 S->>C: ICE Candidate: 公网地址 C->>S: 直接连接测试 S->>C: 连接成功

3.2 SDP 协商#

# Session Description Protocol (SDP)
offer = {
"type": "offer",
"sdp": """
v=0
o=- 12345 2 IN IP4 127.0.0.1
s=-
c=IN IP4 0.0.0.0
t=0 0
m=audio 5004 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 5006 RTP/AVP 96
a=rtpmap:96 H264/90000
"""
}

四、NAT 穿透#

4.1 NAT 穿透流程#

flowchart TB subgraph "ICE 候选收集" A[开始] --> B[收集本地候选] B --> C[查询 STUN 服务器] C --> D[获取公网映射] D --> E{NAT 类型判断} E -->|锥型 NAT| F[使用 STUN 候选] E -->|对称型 NAT| G[需要 TURN 中继] F --> H[尝试 P2P 连接] G --> I[使用 TURN 中继] H --> J{连接成功?} J -->|是| K[P2P 通信] J -->|否| I I --> L[中继通信] end style E fill:#fff3e0 style G fill:#ffebee style F fill:#e8f5e9

4.2 NAT 类型#

类型说明WebRTC 兼容性
全锥型任何外部主机可连接良好
受限锥型需要内部先访问一般
端口受限锥型限制 IP 和端口较差
对称型每个目标不同映射

4.3 STUN 与 TURN#

graph LR subgraph "STUN 模式" A1[Client A] -->|NAT 映射查询| S1[STUN Server] S1 -->|返回公网 IP:Port| A1 A1 -->|直连尝试| B1[Client B] end subgraph "TURN 模式" A2[Client A] <-->|中继| T[TURN Server] T <-->|中继| B2[Client B] end style S1 fill:#e8f5e9 style T fill:#fff3e0
# STUN: 简单 NAT 穿透
stun_server = "stun:stun.l.google.com:19302"
# TURN: 中继穿透(对称型 NAT 必需)
turn_server = "turn:your-turn-server.com"
turn_credential = "username"
turn_key = "secret_key"

五、连接状态管理#

5.1 连接状态流程#

stateDiagram-v2 [*] --> new: 创建 PeerConnection new --> connecting: setLocalDescription connecting --> connected: ICE 完成 connecting --> failed: 连接超时 connected --> disconnected: 网络中断 disconnected --> connected: 重连成功 disconnected --> failed: 重连失败 connected --> closed: 关闭连接 failed --> closed closed --> [*]

5.2 ICE 连接状态#

状态说明
new初始状态
checking正在检查候选
connected连接成功
completed所有候选检查完成
failed连接失败
disconnected连接中断
closed连接关闭

六、DataChannel#

6.1 创建数据通道#

// 创建可靠有序的数据通道
const dc = pc.createDataChannel("chat", {
ordered: true, // 有序传输
maxRetransmits: 3, // 最大重传次数
});
dc.onmessage = event => {
console.log("收到:", event.data);
};
dc.send("你好!");

6.2 传输模式#

模式可靠性顺序适用场景
可靠有序文件传输
可靠无序实时游戏
不可靠有序语音消息
不可靠无序实时游戏

七、浏览器 API#

7.1 获取媒体流#

// 获取摄像头和麦克风
const stream = await navigator.mediaDevices.getUserMedia({
video: { width: 1280, height: 720 },
audio: { echoCancellation: true },
});
// 显示本地预览
videoElement.srcObject = stream;

7.2 建立连接#

const pc = new RTCPeerConnection({
iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
});
// 添加本地流
stream.getTracks().forEach(track => {
pc.addTrack(track, stream);
});
// 监听远程流
pc.ontrack = event => {
remoteVideo.srcObject = event.streams[0];
};

八、安全考虑#

8.1 加密传输#

  • SRTP(安全实时传输协议)加密媒体流
  • DTLS(数据报传输层安全)加密 DataChannel
  • 所有密钥在连接建立时协商

WebRTC 强制使用 DTLS 加密,与 HTTPS/TLS 提供类似的端到端安全保证。

8.2 安全建议#

// 始终验证远端证书
pc.onaddstream = event => {
// 验证来源可信
if (!isTrustedPeer(event.streams[0])) {
console.error("未信任的远端流");
}
};

九、应用场景#

场景实现方式
视频会议MediaStream + DataChannel
直播推流MediaStream + WebSocket 中转
远程教育视频通话 + 白板(DataChannel)
实时游戏DataChannel(低延迟)
文件传输DataChannel(大文件分片)

十、局限性#

  1. NAT 穿透失败:对称型 NAT 无法穿透时需 TURN 中转
  2. 浏览器兼容:Safari 支持相对较差
  3. 编解码器:HEVC/H.265 需要授权
  4. 服务器成本:信令服务器仍是必需

十一、总结#

WebRTC 提供了浏览器原生的实时通信能力,通过 ICE/STUN/TURN 穿透 NAT,SDP 协商媒体能力,PeerConnection 管理连接。掌握 WebRTC 的架构和 API,是构建现代实时应用的基础。

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

WebRTC:实时通信协议详解
https://blog.souloss.com/posts/web/webrtc-real-time-communication/
作者
Souloss
发布于
2022-09-27
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时