什么是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。
主要步骤如下:
- 获取本地网络接口地址
- 通过 STUN 服务器获取公网地址
- 通过 TURN 服务器获取中继地址
- 将 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 技术,可以显著提高连接建立速度。