WebRTC(十四):Candidate

什么是Candidate?

WebRTC(Web Real-Time Communication) 的连接建立过程中,Candidate(候选地址)是实现 NAT 穿透和端到端连接 的核心机制之一。WebRTC 通过 ICE(Interactive Connectivity Establishment) 协议收集多个可能的网络地址,这些地址被称为 Candidate。双方交换 Candidate 后,通过连通性检测选择最佳路径建立 P2P 连接。

由于现实网络环境中存在 NAT、路由器、防火墙等设备,终端通常无法直接使用本地 IP 建立连接。因此 WebRTC 必须通过 Candidate 收集机制,找到可能可达的地址组合。

Candidate 本质上是一个网络地址信息结构,其中包含:

  • IP 地址
  • 端口号
  • 传输协议(UDP/TCP)
  • Candidate 类型
  • 优先级
  • Foundation 标识

通过这些信息,ICE 可以判断并选择最优通信路径。

关于ICE:https://blog.csdn.net/www_dong/article/details/148750073

Candidate的生成流程

Candidate 的生成通常在 ICE Gathering(ICE 收集阶段) 进行。当 WebRTC PeerConnection 创建后,ICE Agent 会开始收集 Candidate。

主要步骤如下:

  1. 获取本地网络接口地址
  2. 通过 STUN 服务器获取公网地址
  3. 通过 TURN 服务器获取中继地址
  4. 将 Candidate 发送给远端

整个过程通常通过 Trickle ICE 机制逐步发送 Candidate,而不是一次性发送。

浏览器中会触发:

bash 复制代码
onicecandidate

事件通知应用层。

典型 Candidate 示例:

bash 复制代码
candidate:842163049 1 udp 1677729535 192.168.1.2 54400 typ host

字段含义:

字段 含义
candidate Candidate 标识
842163049 Foundation
1 Component ID
udp 传输协议
1677729535 优先级
192.168.1.2 IP 地址
54400 端口
typ host Candidate 类型

Candidate的类型

ICE Candidate 根据来源可以分为三种主要类型。

1. Host Candidate

Host Candidate 是本地网络接口的 IP 地址。

例如:

  • 192.168.x.x
  • 10.x.x.x
  • 本机 IPv6 地址

示例:

bash 复制代码
candidate:1 1 udp 2130706431 192.168.1.5 5000 typ host

特点:

  • 直接来自本机网卡
  • 不经过 NAT 处理
  • 延迟最低

适用场景:

  • 同一局域网
  • 内网通信

缺点:

  • 无法跨 NAT 访问

2. Server Reflexive Candidate(srflx)

Server Reflexive Candidate 是通过 STUN 服务器 获取的公网映射地址。

流程:

复制代码
客户端 → STUN服务器
STUN服务器 → 返回公网IP:端口

例如:

复制代码
candidate:2 1 udp 1694498815 8.134.22.11 60000 typ srflx raddr 192.168.1.5 rport 5000

字段说明:

字段 含义
srflx Server Reflexive
raddr 本地地址
rport 本地端口

特点:

  • 通过 NAT 映射得到
  • 可用于公网通信
  • 不需要中继服务器

适用场景:

  • 大多数 NAT 网络
  • P2P 直连

优点:

  • 延迟低
  • 成本低

缺点:

  • 对称 NAT 可能失败

3. Relay Candidate

Relay Candidate 是通过 TURN 服务器中继得到的地址。

连接路径:

复制代码
Peer A → TURN → Peer B

示例:

复制代码
candidate:3 1 udp 33554431 52.23.45.12 3478 typ relay

特点:

  • 通过 TURN 中继
  • 可穿透所有 NAT
  • 可靠性最高

适用场景:

  • 对称 NAT
  • 严格防火墙环境

缺点:

  • 延迟最高
  • 消耗服务器带宽

Candidate优先级

ICE 为每个 Candidate 设置优先级,用于选择最佳路径。

优先级计算公式:

bash 复制代码
priority = (2^24 × type preference)
         + (2^8 × local preference)
         + (256 − component ID)

其中:

参数 含义
type preference Candidate 类型权重
local preference 本地优先级
component ID RTP/RTCP组件

通常优先级排序:

复制代码
Host > srflx > relay

原因:

  • Host 延迟最低
  • srflx 次之
  • relay 成本最高

ICE 会优先尝试高优先级 Candidate。

Candidate Pair

当双方交换 Candidate 后,ICE 会形成 Candidate Pair(候选地址对)

例如:

复制代码
Local Candidate  +  Remote Candidate

示例:

复制代码
192.168.1.5:5000  ↔  8.134.22.11:60000

ICE 会对所有 Candidate Pair 进行 Connectivity Check(连通性检测)

检测方式:

使用 STUN Binding Request

如果响应成功,则该 Candidate Pair 被认为是 有效路径

ICE 连接选择流程

ICE 的连接建立过程如下:

1. Candidate 收集

双方收集:

  • host
  • srflx
  • relay

Candidate。

2. Candidate 交换

通过信令服务器交换 Candidate:

例如:

  • WebSocket
  • HTTP
  • SIP
  • MQTT

3. Pair 生成

组合为 Candidate Pair:

bash 复制代码
local candidate × remote candidate

4. 连通性检测

ICE 发送 STUN 请求:

bash 复制代码
STUN Binding Request

如果成功:

bash 复制代码
Pair Valid

5. 选择最佳路径

ICE 根据:

  • 优先级
  • RTT
  • 成功率

选择 最佳 Candidate Pair

6. 连接建立

最终媒体流通过选定路径传输:

bash 复制代码
RTP / SRTP / DTLS

Trickle ICE

传统 ICE 需要收集完所有 Candidate 再发送 SDP。

Trickle ICE 则采用 逐步发送 Candidate 的方式。

流程:

bash 复制代码
收集一个 Candidate
        ↓
立即发送
        ↓
远端开始连接检测

优势:

  • 连接建立更快
  • 用户体验更好

WebRTC 默认支持 Trickle ICE。

浏览器事件:

bash 复制代码
onicecandidate

Candidate在SDP中的体现

Candidate 会出现在 SDP(Session Description Protocol) 中。

示例:

复制代码
a=candidate:842163049 1 udp 1677729535 192.168.1.2 54400 typ host

完整 SDP 示例:

复制代码
m=audio 54400 RTP/SAVPF 111
a=rtcp-mux
a=ice-ufrag:abcd
a=ice-pwd:xyz123
a=candidate:1 1 udp 2130706431 192.168.1.5 54400 typ host
a=candidate:2 1 udp 1694498815 8.134.22.11 60000 typ srflx
a=candidate:3 1 udp 33554431 52.23.45.12 3478 typ relay

Candidate优化策略

为了提高连接成功率和性能,可以采用以下策略:

1. 优先使用 UDP

UDP 适合实时通信:

  • 延迟低
  • 无重传阻塞

2. 使用多个 STUN 服务器

提高 srflx 获取成功率:

bash 复制代码
stun:stun.l.google.com:19302

3. TURN 服务器部署

保证极端网络可连接。

常用 TURN 实现:

  • coturn

4. 限制 Candidate 数量

减少 ICE 检测开销。

例如:

  • 禁止 IPv6
  • 限制 TCP Candidate

总结

Candidate 是 WebRTC NAT 穿透和 P2P 连接建立的重要组成部分。通过 ICE 协议,WebRTC 可以收集多种网络地址,并通过连通性检测选择最佳通信路径。

Candidate 主要包括:

  • Host Candidate(本地地址)
  • Server Reflexive Candidate(STUN 公网映射)
  • Relay Candidate(TURN 中继地址)

ICE 通过 Candidate Pair 进行连通性检测,并最终选择最优路径进行媒体传输。结合 Trickle ICE 技术,可以显著提高连接建立速度。

相关推荐
王家视频教程图书馆1 小时前
测试开源视频播放器在RN webview中的运行方式
开源·音视频
奔跑吧 android1 小时前
【车载audio】【AudioService 01】【Android 音频子系统分析:按键音(Sound Effects)开启与关闭机制深度解析】
android·音视频·audioflinger·audioservice·audiohal
却道天凉_好个秋1 小时前
WebRTC(十五):NAT穿透机制深度解析
后端·webrtc·stun·turn·ice·net网络穿透
Cxiaomu1 小时前
深入解析 WebSocket 语音交互:状态流转、表情联动与音频上下行处理实践
websocket·音视频·交互
Arman_1 小时前
深入浅出 RTP 协议:从原理到 WebRTC 实践
webrtc·tcp
简离13 天前
前端调试实战:基于 chrome://webrtc-internals/ 高效排查WebRTC问题
前端·chrome·webrtc
REDcker13 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo199813 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
山河君13 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa