Skip to main content

WebRTC 全景实战 (0):架构全景与协议栈地图

Rainy
雨落无声,代码成诗 —— 致力于技术与艺术的极致平衡
Rainy
18 MIN READ... VIEWS

"WebRTC 不是某一个 API,而是一整套让浏览器能够安全、低延迟地交换实时媒体的开放标准。"

如果你曾经尝试在网页里做视频通话,大概率遇到过这样的困惑:RTCPeerConnection 的文档能看懂,但 ICE 一直 failed;SDP 里一堆 a=rtpmap 不知道在协商什么;明明本地预览正常,对方却听不到声音。

这些问题的根源,通常不是某个 API 调用错了,而是缺少一张 WebRTC 协议栈的全景地图

本系列 WebRTC 全景实战 共 16 篇,将从架构认知出发,逐层深入到信令、SDP、ICE、DTLS/SRTP、RTP/RTCP、编解码、拥塞控制、SFU 架构与生产部署,每篇均配套 examples/webrtc-lab 实战代码。本文作为第零章,回答最根本的问题:WebRTC 是什么?它从哪来?它由哪些层组成?


本篇术语表(系列总纲)

后续各章会重复出现这些概念,建议先建立整体认知:

术语英文解释
WebRTCWeb Real-Time CommunicationW3C + IETF 联合定义的浏览器实时通信标准栈,不是某个 npm 包或单一 SDK
W3CWorld Wide Web Consortium定义浏览器 JavaScript API(getUserMediaRTCPeerConnection 等)
IETFInternet Engineering Task Force定义底层协议(ICE、DTLS、SRTP、RTP、SCTP 等 RFC)
P2PPeer-to-Peer两个或多个端点直接交换媒体,不经过中央媒体服务器
SFUSelective Forwarding Unit选择性转发单元:服务端转发 RTP 包但不转码,见 Ch12
MCUMultipoint Control Unit多点控制单元:服务端混流/转码后分发,CPU 开销大
Signaling信令WebRTC 标准外的控制通道,用于交换 SDP 和 ICE Candidate
SDPSession Description Protocol文本格式的会话「合同」,描述 Codec、ICE 参数、DTLS 指纹
ICEInteractive Connectivity Establishment在多条网络路径中选择最优 UDP 通道的算法
STUNSession Traversal Utilities for NAT帮助客户端发现公网 IP:Port 的协议
TURNTraversal Using Relays around NATNAT 穿透失败时的中继服务器协议
DTLSDatagram Transport Layer SecurityUDP 上的 TLS,用于密钥协商
SRTPSecure RTP加密的 RTP 媒体传输
RTP/RTCPReal-time Transport / Control Protocol媒体数据面与控制反馈协议,1996 年标准化
JSEPJavaScript Session Establishment ProtocolOffer/Answer 协商模型,RFC 8829
MBONEMulticast Backbone1990 年代 Internet 多播实验网络,WebRTC 前身工具的运行环境
NPAPINetscape Plugin API已废弃的浏览器插件接口,Gmail 视频聊天曾依赖它

系列学习路线图

Phase章节核心能力配套 Lab
1Ch0–2建立全局地图,跑通第一个 P2Pch01-media-devices, ch02-p2p-basic
2Ch3–6理解连接建立的每一层signaling/, coturn
3Ch7–9媒体加密、传输、编解码Wireshark 抓包
4Ch10–12拥塞控制、Simulcast、SFULiveKit / Pion
5Ch13–15生产排障、部署、Capstone完整视频会议

一、历史脉络:从 MBONE 到浏览器

理解 WebRTC 的设计,需要理解它站在哪些协议之上、又为什么放弃了哪些旧路。本节参考 WebRTC for the Curious — 历史 中协议作者与 Google 早期团队的访谈,梳理关键转折。

1.1 时间线:四十年实时通信演进

1.2 RTP 的诞生:从「工具」到「协议」

RTP 共同作者 Ron Frederick 在 1992 年基于 Sun VideoPix 帧采集卡编写 nv 网络视频会议工具,目标是在 128 kbps ISDN 带宽下传输可接受画质——为此他实现了专用软件视频压缩(后获专利 US5485212A),并在 MBONE(Internet 多播主干网)上向全球广播 IETF 会议。

设计意图

nv、vat 等早期工具各自有轻量会话协议。IETF 工作组(Van Jacobson、Steve Casner、Henning Schulzrinne 等)的目标不是再做一个工具,而是提炼所有工具可共用的媒体传输基础——这就是 RTP/RTCP(后修订为 RFC 3550)。

Ron Frederick 在访谈中反思:RTP 在单播场景下 RTCP 显得过于复杂;许多人转向 TCP/HTTP 流式传输因为「足够好」。但 TCP 多方通话需向每个对等方重复发送相同数据,带宽效率骤降——这正是 WebRTC 坚持 UDP + RTP 的原因。

1.3 为什么 WebRTC 是单播,不是 IP 多播?

维度IP 多播(MBONE 时代)WebRTC 单播 + SFU
网络要求全网/router 支持多播标准互联网即可
服务端极简(多播代转发)需要 SFU/TURN
运营商几乎不部署多播完全兼容
安全难以 per-user 加密DTLS/SRTP 原生支持

Marratech(后被 Google 收购)早期也押注多播——「网络帮你把包传给所有人,服务器可以非常简单」。但行业最终转向 packet shufflers(SFU),因为公网多播从未规模化部署。WebRTC 的设计选择是现实主义的:在现有互联网上工作,而非等待网络升级。

1.4 WebRTC 诞生:Google 的三重动机

Google 产品经理 Serge Lachapelle(Marratech 联合创始人)在 Curious 访谈 中总结了 WebRTC 诞生的背景:

Gmail 语音视频聊天(WebRTC 前身)的教训:Justin Uberti 将 GIPS(音频)、Vidyo(视频)、libjingle(网络)三个子系统拼在一起——每个都为不同问题设计,API 完全不同。WebRTC 的目标就是一次性解决这些集成痛点,让开发者专注业务。

刻意不标准化信令:SIP 等已有方案存在,重新标准化信令「不会创造有价值贡献」,反而可能演变为政治问题。因此 WebRTC 只标准化媒体通道,信令留给应用层——这也是 Ch3 必须自己写 WebSocket 服务器的根本原因。

1.5 从 NPAPI 插件到沙盒化浏览器

阶段技术栈问题
Gmail 视频聊天GIPS + Vidyo + libjingle + NPAPI三套 API、插件安全风险
Chrome 原生 WebRTC统一栈 + 沙盒进程默认加密、无插件依赖
W3C Recommendation跨浏览器标准 APIFirefox/Safari 独立实现

Justin Uberti(Google 工程师,后领导 WebRTC 团队)在整合 Gmail 视频聊天时的核心贡献,是把三个异构子系统拼成一个可用的产品——这段「集成噩梦」直接催生了「一次性解决所有集成问题」的 WebRTC 目标。

1.6 Maastricht 2010:跨公司午餐会

2010 年夏天,在荷兰 Maastricht 的一次非正式午餐会上,Google、Cisco、Ericsson、Skype、Mozilla、Linden Labs 等公司的工程师聚在一起讨论「浏览器里的实时通信应该是什么样」。档案可在 rtc-web.alvestrand.com 查阅。

这次会议的意义:

  • 跨厂商共识:不是 Google 一家说了算,而是行业共同方向
  • Skype 贡献 Opus:Skype 已在 IETF 完成 Opus 音频 Codec 标准化,为 WebRTC 音频奠定基础
  • Harald Alvestrand 启动 IETF 流程:Google 的 Harald 此前已有丰富 IETF 经验,推动 RTCWeb 工作组

二、WebRTC 解决什么问题

2.1 实时通信 vs 流媒体

维度WebRTCWebSocket + HLS/DASH
传输UDP 为主(RTP over DTLS)TCP(HTTP)
延迟100–300ms 级3–30s(分片缓冲)
交互双向、多路、可 P2P主要是单向拉流
典型场景视频会议、连麦、远程桌面、AI 语音直播观看、点播

WebRTC 的核心价值是:在不可控的公网环境下,让两个或多个端点之间建立低延迟、加密的实时媒体通道

2.2 三代 RTC 架构演进

架构工作方式延迟服务端 CPU适用规模
Full Mesh P2P每对参与者直连最低无媒体处理≤4 人
MCU服务端混流后分发较高极高(转码)传统电话会议
SFU服务端选择性转发,不转码低且可预测10–10,000+ 人

本系列前半段聚焦 P2P 原理(Ch1–Ch6),后半段进入 SFU 生产架构(Ch10–Ch15)。理解 P2P 是理解 SFU 的基础——SFU 本质上是在帮每个参与者维护多条「逻辑上的 P2P 订阅关系」。

2.3 WebRTC 不适用场景

场景为何不适合替代方案
万人单向直播P2P/SFU 无法支撑分发规模HLS/DASH + CDN
高延迟可接受WebRTC 复杂度不值得WebSocket + 预录流
仅文本聊天杀鸡用牛刀WebSocket / SSE
需要服务端录制混流需额外 Egress 组件LiveKit Egress / FFmpeg

三、W3C 与 IETF:两套标准的分工

关键理解:你在 JavaScript 里调用的是 W3C API;浏览器内部(C++)实现 IETF 协议。你不需要手动构造 RTP 包或 DTLS 握手——但需要理解这些层在做什么,才能 Debug。


四、WebRTC 协议栈全景

WebRTC 由 W3C(浏览器 API)和 IETF(底层协议)两套标准共同定义。RFC 8825 是总览文档,推荐阅读。

4.1 各层职责速查

层级标准职责
Signaling无标准(应用自定义)交换 SDP、ICE Candidate、Room 状态
JSEPRFC 8829Offer/Answer 协商模型
SDPRFC 8866会话描述:编解码器、端口、ICE 参数
ICERFC 8445在多条网络路径中选最优连通路径
STUNRFC 5389发现公网 IP/端口
TURNRFC 5766NAT 穿透失败时的中继
DTLSRFC 6347UDP 上的 TLS,密钥协商
SRTPRFC 3711媒体流加密
SCTPRFC 8831Data Channel 多路复用
RTP/RTCPRFC 3550媒体包传输与 QoS 反馈
关键认知

Signaling 不在 WebRTC 标准内。 浏览器 API 只负责建立连接,你必须自己实现信令通道(WebSocket 最常见)来交换 SDP 和 ICE Candidate。这是新手第一个坑。

4.2 W3C API 与 IETF 协议对照

你写的代码触发的协议行为
getUserMedia()捕获 MediaStreamTrack,不涉及网络
pc.addTrack()创建 RTCRtpSender,SDP 中出现新 m-line
pc.createOffer()生成 SDP Offer(JSEP)
pc.setLocalDescription()开始 ICE Gathering
pc.onicecandidate产出 ICE Candidate
pc.setRemoteDescription()开始 ICE Connectivity Check
pc.createDataChannel()协商 SCTP over DTLS

4.3 协议层依赖关系

4.4 完整 RFC 索引(本系列引用)

RFC标题对应章节
8825WebRTC OverviewCh0
8829JSEPCh2, Ch4
8866SDPCh4
8445ICECh5
5389STUNCh5
5766TURNCh5, Ch14
6347DTLSCh7
5764DTLS-SRTPCh7
3711SRTPCh7
8827WebRTC SecurityCh7
3550RTP/RTCPCh8
7587OpusCh9
8831Data ChannelsCh6

五、一次 P2P 通话的完整时序

在写任何代码之前,先理解端到端流程(信令用 WebSocket 举例):

Phase 1(Ch1Ch2)将实现这个流程;Phase 2(Ch3–Ch6)将把每一步拆解开。

5.1 连接建立四阶段

阶段成功标志失败常见原因
信令Offer/Answer 交换完成WebSocket 断开、SDP 格式错误
ICEiceConnectionState=connectedNAT 对称、无 TURN
DTLSconnectionState=connectedfingerprint 不匹配
SRTPontrack 触发、有画面Codec 无交集、防火墙

六、适用场景与选型建议

场景推荐架构本系列对应章节
1v1 视频通话Full Mesh P2PCh2
3–8 人会议SFUCh12
大型直播(万人观看)CDN + 可选连麦 SFUCh11, Ch12
实时白板 / 游戏状态Data ChannelCh6
AI 语音助手SFU + Agent 框架Ch15 + LiveKit 介绍
纯单向直播HLS/WebRTC 推流 Ingress超出本系列,参考 LiveKit Ingress

七、常见误解 FAQ

误解真相
「WebRTC 是 P2P,不需要服务器」需要信令服务器;多数场景还需要 TURNSFU
「WebRTC 可以替代 WebSocket」WebSocket 适合信令和控制;WebRTC 适合低延迟媒体
「只要 getUserMedia 就能视频通话」还需要 PeerConnection + 信令 + ICE
「WebRTC 完全免费」开源免费,但 TURN 带宽、SFU 服务器有运维成本
「所有浏览器 WebRTC 行为一致」有差异,建议用 adapter.js
「Simulcast 是 WebRTC 标准」Simulcast 是广泛部署的扩展,SFU 必须支持

八、实战 Lab:打开调试工具

本篇无需写代码,但请完成以下准备:

  1. 使用 Chrome 打开 chrome://webrtc-internals
  2. 访问 WebRTC Samples 建立一个测试连接
  3. 在 webrtc-internals 中观察:
    • RTCPeerConnection 列表
    • ICE candidate pair 状态
    • Stats 面板中的 inbound-rtp / outbound-rtp

这些面板将在 Ch13 成为生产排障的核心工具。

8.1 webrtc-internals 观察清单

观察项位置说明
PeerConnection 列表首页每个 Tab 一个 PC
ICE candidate pairICE 标签state=succeeded 的行
Local/Remote SDPSDP 标签对比 Offer/Answer
Stats graphsGraphs 标签码率、丢包实时曲线
getUserMedia媒体标签采集分辨率与帧率

九、本章小结与下一篇预告

维度核心要点
定位浏览器端低延迟、加密、P2P 实时媒体框架
标准W3C 定义 API,IETF 定义协议栈
关键层Signaling → JSEP/SDP → ICE → DTLS → SRTP → Codec
架构P2P 适合小规模;SFU 是生产会议的主流
学习路径先跑通 P2P,再深入每层协议,最后上 SFU

下一篇(Ch1) 我们从最顶层 API 开始:getUserMedia 如何获取摄像头和麦克风,如何切换设备和处理权限。


系列导航

章节主题状态
0架构全景与协议栈地图✅ 已发布
1浏览器媒体 API 与设备管理✅ 已发布
2第一个 P2P 视频通话✅ 已发布
3信令服务器设计与会话状态机✅ 已发布
4SDP 解剖与媒体协商✅ 已发布
5ICE、STUN、TURN 与 NAT 穿透✅ 已发布
6Data Channel 与 SCTP over DTLS✅ 已发布
7DTLS 握手与 SRTP 加密体系✅ 已发布
8RTP/RTCP 媒体传输与 QoS✅ 已发布
9音视频编解码与 Simulcast 入门✅ 已发布
10带宽估计与拥塞控制 GCC✅ 已发布
11Simulcast、SVC 与选择性订阅✅ 已发布
12SFU/MCU/Mesh 架构与 Pion 实战✅ 已发布
13调试工具链与可观测性✅ 已发布
14TURN 集群部署与多区域扩展✅ 已发布
15Capstone 生产级视频会议系统✅ 已发布

References

Logo
RainLib

Exploring the frontiers of technology, design, and distributed systems. Building tools for the future developers.

Suggestions & Feedback

© 2026 RainLib. Built for the Future.
All rights reserved.
System Normal