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

相关推荐
非凡ghost1 小时前
可拓浏览器:给手机浏览器装上“外挂“!2W+拓展+AI搜索,玩出无限可能!
windows·智能手机·音视频·firefox
美狐美颜SDK开放平台3 小时前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
三十_4 小时前
WebRTC 远端画面无法显示:ICE 与 SDP 时序问题深度解析与解决方案
webrtc
ai产品老杨5 小时前
深度解析:基于国产化异构计算的 AI 视频管理平台架构——从 GB28181 接入到 NPU 边缘推流的解耦实践
人工智能·架构·音视频
watson_pillow5 小时前
音视频相关基础知识储备入门-字幕
音视频
程序员JerrySUN6 小时前
Jetson边缘嵌入式实战课程第二讲:JetPack 和 SDK Manager 是什么
c语言·开发语言·网络·udp·音视频
weixin_6688 小时前
NVIDIA VSSVideo Search and Summarization视频搜索与摘要蓝图详尽使用说明与技术报告版本
人工智能·音视频
jiayong238 小时前
国内外视频/图像大模型与智能体工具平台竞品对比
ai·音视频·agent
视频技术分享9 小时前
技术赋能生态革新:音视频产业开启千亿增长新周期 视频会议成核心增长亮点
音视频
reasonsummer9 小时前
【教学类-160-14】20260425 AI视频培训-练习014“豆包AI视频《月下枯蔷(哥特风)》+豆包图片风格:油画”
人工智能·音视频·豆包