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 技术,可以显著提高连接建立速度。

相关推荐
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
2601_955662462 天前
短剧多人对白怎么配?2026年多角色配音工具对比
大数据·人工智能·音视频·语音识别
开发笔记-阿牛3 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
旺仔小馒头wang3 天前
AI 智能手机发布会:赋予人类的五种新能力
人工智能·学习·音视频
纳祥科技3 天前
拆机拆到芯片级:ARC功放机里的NX7026、NX8420、NX6805
单片机·音视频·智能音箱
youandyouyou3 天前
律所内部培训共享的内网部署方案:架构、参数与三步落地
音视频
爱吃提升3 天前
文生视频核心
人工智能·音视频
2601_955662463 天前
抖音视频怎么做多语言配音?2026年AI配音工具与制作流程详解
人工智能·音视频·语音识别·视频
音视频牛哥3 天前
Android与HarmonyOS NEXT如何接入GB28181:从SIP到PS/RTP的完整链路
音视频·gb28181-2022对接·鸿蒙next gb28181·gb/t 28181-2022·gb/t 28181-2016·gb28181-2022平台
美狐美颜SDK开放平台3 天前
直播APP源码与视频美颜sdk如何配合?一套完整开发思路
android·人工智能·计算机视觉·音视频·直播美颜sdk