WebRTC 浏览器实时直连技术

工作原理与通信流程

WebRTC 建立连接分为 四个阶段

1.媒体采集与能力描述

  • 调用 getUserMedia() 获取本地音视频流
  • 引擎生成 Offer SDP,包含:支持的编码格式、分辨率、ICE 候选地址列表等

2.信令交换(Signaling)

信令不属于 WebRTC 规范,需开发者自行搭建(常用 WebSocket)

  • Peer A 将 Offer SDP 发给 Peer B
  • Peer B 回复 Answer SDP
  • 双方异步交换 ICE Candidate(网络探测结果)

3.NAT 穿透与连接建立(ICE 框架)

ICE 按优先级尝试以下路径:

  1. Host Candidate:局域网直连
  2. STUN Reflexive (srflx):通过 STUN 获取公网 IP:Port
  3. Peer Reflexive (prflx):对端发现的临时映射地址
  4. Relay (TURN):对称 NAT/防火墙阻挡时,通过 TURN 中继转发

4.媒体与数据传输

  • 音视频打包为 RTP 流,通过 SRTP 加密传输
  • 控制信息通过 RTCP 反馈(丢包率、延迟、关键帧请求等)
  • 内置 GCC(Google Congestion Control) 动态调整发送码率
  • 配合 NACK(丢包重传) / PLI(关键帧请求) / FEC(前向纠错) 抗弱网

信令服务器的作用

信令服务器只负责“传递”ICE信息,不参与“执行”ICE协议。只负责将两端生成的网络候选地址(ICE Candidates)和会话描述(SDP)原样转发,但不解析、不验证、不参与实际的 NAT 穿透探测。

  • 信令服务器负责“首次及持续的 ICE 信息传递”,但不负责“ICE 协议的执行与网络探测”。
  • 真正的 NAT 穿透、连通性测试、路径选择 100% 发生在两端 WebRTC 引擎之间,信令服务器仅扮演“消息路由器”。
  • 设计信令服务时,只需保证:低延迟、高可用、支持二进制/字符串透传、与业务鉴权解耦即可,无需实现任何 ICE/STUN 逻辑。
  • 媒体流永远不经过信令服务器:ICE 探测成功后,音视频/数据通道直接走 P2P 或 TURN,信令服务器可立即降级为低频心跳通道。

网络路径选择 ICE 工作流程(4 步)

重要澄清:WebRTC 中不是“服务器”进行网络探测,而是通信两端(Peer)基于 ICE 框架自主探测。STUN/TURN 只是辅助服务器,真正的路径发现、测试、选择逻辑全部运行在客户端。

1.收集候选地址(Candidate Gathering)

每个端点枚举自身网络接口,生成 ICE Candidate

类型 来源 说明
host 本地网卡 局域网直连地址(如 192.168.1.10:54321)
srflx STUN 服务器 公网映射地址(如 203.0.113.5:61234)
prflx 对端探测发现 打洞过程中动态发现的临时路径
relay TURN 服务器 中继地址,保底连通方案

默认通过 STUN 获取 srflx;若直连失败,才向 TURN 申请 relay

2.连通性探测(Connectivity Checks)

  • 双方交换候选地址后,ICE 会生成 候选对(Candidate Pairs)本地候选 × 远端候选
  • 按优先级排序后,发送 STUN Binding Request 测试连通性:
    • 请求携带 ICE 身份凭证(ufrag + pwd)防伪造
    • 使用 UDP 打洞(部分浏览器支持 TCP fallback)
    • 收到合法 STUN Binding Response 即标记为 valid

3.优先级排序与路径提名(Prioritization & Nomination)

ICE 使用 RFC 8445 定义的优先级公式:

Priority = (2^24) × TypePref + (2^8) × LocalPref + (2^0) × ComponentID
候选类型 TypePref(默认) 说明
host 126 局域网直连,延迟最低、成本为0
srflx 110 STUN 反射,适合非对称 NAT
prflx 100 动态发现,优先级低于 srflx
relay 0 TURN 中继,延迟高、带宽成本高,保底用

提名机制

  • Controlling Peer(主叫方)在发现第一个 valid 对后,发送带 USE-CANDIDATE 属性的 STUN 请求
  • Controlled Peer(被叫方)确认后,该路径被 nominated,媒体流开始通过此路径传输
  • 若后续网络恶化,ICE 会持续测试低优先级对,实现无缝 failover

4.连接维持与故障转移(Keepalive & Failover)

  • ~15秒 发送 STUN 保活包,维持 NAT 映射不超时
  • 连续 5次 无响应 → 标记 failed → 自动切换备用路径
  • 支持 Trickle ICE(渐进式交换候选):边收集边发送,连接建立提速 30%~50%
posted @ 2026-04-27 15:10  woncode  阅读(12)  评论(0)    收藏  举报