WebRTC 协议簇:ICE、STUN/TURN、DTLS、SRTP

WebRTC 建立在多个协议之上,这些协议共同完成了网络穿透、安全传输等功能。本章将详细介绍这些核心协议的工作原理和报文结构。

1. 协议栈概览

1.1 协议层次关系

flowchart TB
    subgraph 应用层
        A[WebRTC API]
    end

    subgraph 会话层
        C[ICE - 连接建立]
    end

    subgraph 安全层
        D[DTLS - 密钥交换]
    end

    subgraph 传输层
        E[SRTP - 媒体传输]
        F[SCTP - 数据通道]
    end

    subgraph 网络层
        G[UDP]
    end

    A --> C
    C --> D
    D --> E
    D --> F
    E --> G
    F --> G

1.2 各协议职责

协议 所在层次 主要职责
ICE 会话层 协调 NAT 穿透,选择最佳路径
STUN 网络辅助 发现公网映射地址
TURN 网络辅助 提供中继转发服务
DTLS 安全层 密钥交换、身份验证
SRTP 传输层 加密媒体传输

2. ICE(Interactive Connectivity Establishment)

2.1 ICE 是什么

ICE 是一个综合框架,由 RFC 8445 定义,用于在复杂的网络环境中建立连接。它不是单一协议,而是整合了多种穿透技术的协调机制。

ICE 解决的核心问题

  • 如何在 NAT 后发现可达地址
  • 如何验证两个端点之间的连通性
  • 如何在多条可选路径中选择最优路径

2.2 ICE Candidate 类型

类型 缩写 来源 优先级 说明
Host host 本地网卡 最高 直接可用的本地地址
Server Reflexive srflx STUN 服务器 通过 STUN 发现的公网地址
Peer Reflexive prflx 对端观察 连接检查中发现的地址
Relay relay TURN 服务器 最低 TURN 服务器分配的中继地址
flowchart TB
    subgraph 客户端
        A[Host Candidate<br>192.168.1.100:5000]
    end

    subgraph NAT
        B[NAT 映射<br>203.0.113.1:12345]
    end

    subgraph STUN服务器
        C[协助发现 SRFLX]
    end

    subgraph TURN服务器
        D[Relay Candidate<br>198.51.100.1:50000]
    end

    A --> B
    A --> C
    C --> B
    B --> |srflx| C
    A --> D

2.3 Candidate 格式详解

ICE Candidate 在 SDP 中的表示格式:

a=candidate:<foundation> <component-id> <transport> <priority> <connection-address> <port> <candidate-type> [<rel-addr> <rel-port>]
字段 说明
foundation 候选标识符,相同 foundation 的候选共享相同的基础传输
component-id 组件 ID:1=RTP,2=RTCP(rtcp-mux 后只用 1)
transport 传输协议:udp 或 tcp
priority 优先级(32位整数),决定检查顺序
connection-address 候选地址
port 端口号
candidate-type 类型:host/srflx/prflx/relay
rel-addr 相关地址(srflx/relay 时的原始地址)
rel-port 相关端口

2.4 优先级计算

优先级由以下公式计算:

priority = (2^24) * (type preference) + (2^8) * (local preference) + (256 - component ID)
类型 type preference
Host 126
Peer Reflexive 110
Server Reflexive 100
Relay 0

设计原理:优先使用直连路径(Host),其次是通过 NAT 映射的路径,最后才使用中继。

2.5 ICE 连通性检查流程

sequenceDiagram
    participant A as 端点A (控制方)
    participant B as 端点B (受控方)

    Note over A,B: 阶段1: 收集候选
    A->>A: 收集 Host/SRFLX/Relay
    B->>B: 收集 Host/SRFLX/Relay

    Note over A,B: 阶段2: 交换候选
    A->>B: 发送候选列表
    B->>A: 发送候选列表

    Note over A,B: 阶段3: 连通性检查
    A->>B: STUN Binding Request (从 host)
    B->>A: STUN Binding Response
    A->>B: STUN Binding Request (从 srflx)
    B->>A: STUN Binding Response
    B->>A: STUN Binding Request (从 host)
    A->>B: STUN Binding Response

    Note over A,B: 阶段4: 选择有效对
    A->>A: 选择最高优先级有效对
    B->>B: 确认选择

2.6 ICE 状态机

状态 说明
new 初始状态,ICE Agent 已创建
gathering 正在收集候选地址
checking 正在进行连通性检查
connected 至少一个组件检查成功
completed 所有组件检查完成,找到最佳路径
failed 所有检查都失败
disconnected 连接断开(可能临时)
closed ICE Agent 已关闭
stateDiagram-v2
    [*] --> new: 创建连接
    new --> gathering: 开始收集
    gathering --> checking: 收集完成
    checking --> connected: 检查成功
    checking --> failed: 全部失败
    connected --> completed: 检查完成
    connected --> disconnected: 连接丢失
    completed --> disconnected: 连接丢失
    disconnected --> connected: 恢复连接
    disconnected --> failed: 恢复失败
    failed --> closed: 关闭
    completed --> closed: 关闭

2.7 ICE Restart

当连接断开需要重新建立时,触发 ICE Restart:

  • 生成新的 ice-ufrag 和 ice-pwd
  • 重新收集所有候选
  • 重新进行连通性检查

3. STUN(Session Traversal Utilities for NAT)

3.1 STUN 是什么

STUN 由 RFC 5389 定义,是一个轻量级协议,主要用于:

  • 发现 NAT 映射后的公网地址
  • 检测 NAT 类型
  • 作为 ICE 连通性检查的载体

3.2 STUN 消息头结构

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0|     STUN Message Type     |         Message Length        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Magic Cookie                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                     Transaction ID (96 bits)                  |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段 位数 说明
前两位 2 必须为 00,用于区分其他协议
Message Type 14 消息类型
Message Length 16 消息体长度(不含 20 字节头)
Magic Cookie 32 固定值 0x2112A442,用于识别 STUN
Transaction ID 96 事务标识,用于请求响应对应

3.3 STUN 消息类型

消息类型由类别和方法组成:

类别(Class)
| 类别 | 值 | 说明 |
|——|—–|——|
| Request | 0x000 | 请求消息 |
| Indication | 0x010 | 指示消息(无响应) |
| Success Response | 0x100 | 成功响应 |
| Error Response | 0x110 | 错误响应 |

常用方法(Method)
| 方法 | 值 | 说明 |
|——|—–|——|
| Binding | 0x001 | 地址绑定 |
| Allocate | 0x003 | TURN 分配 |
| Refresh | 0x004 | TURN 刷新 |

组合后的消息类型
| 类型 | 值 | 说明 |
|——|—–|——|
| Binding Request | 0x0001 | 请求映射地址 |
| Binding Success Response | 0x0101 | 返回映射地址 |
| Binding Error Response | 0x0111 | 绑定错误 |
| Binding Indication | 0x0011 | 指示消息(保活) |

3.4 STUN 属性格式

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Type                  |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Value (variable)                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段 说明
Type 属性类型(16位)
Length 值长度(16位)
Value 属性值(变长,4 字节对齐)

3.5 常用 STUN 属性

属性 类型值 说明
MAPPED-ADDRESS 0x0001 NAT 映射后的地址
XOR-MAPPED-ADDRESS 0x0020 异或后的映射地址(推荐)
RESPONSE-ORIGIN 0x802B 响应来源地址
OTHER-ADDRESS 0x802C 其他服务器地址
ERROR-CODE 0x0009 错误代码
SOFTWARE 0x8022 软件标识
FINGERPRINT 0x8028 消息指纹(完整性校验)
MESSAGE-INTEGRITY 0x0008 消息完整性(HMAC-SHA1)

3.6 XOR-MAPPED-ADDRESS 结构

使用异或编码防止 NAT 设备修改地址:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0|    Family     |         X-Port                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                X-Address (IPv4 / IPv6)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Family: 0x01=IPv4, 0x02=IPv6
  • X-Port: 端口异或 Magic Cookie 高 16 位
  • X-Address: 地址异或 Magic Cookie(IPv4)或 Magic Cookie + Transaction ID(IPv6)

3.7 STUN 工作流程

sequenceDiagram
    participant C as 客户端
    participant N as NAT
    participant S as STUN 服务器

    C->>N: Binding Request<br>源: 192.168.1.100:5000
    N->>S: 转发<br>源: 203.0.113.1:12345
    S->>S: 记录来源地址
    S->>N: Binding Success Response<br>XOR-MAPPED-ADDRESS: 203.0.113.1:12345
    N->>C: 转发
    C->>C: 得知公网地址

4. TURN(Traversal Using Relays around NAT)

4.1 TURN 是什么

TURN 由 RFC 8656 定义,当 P2P 连接无法建立时(如对称 NAT、防火墙限制),TURN 服务器充当中继转发所有流量。

TURN 的特点

  • 作为最后的穿透手段
  • 服务器转发所有流量
  • 需要用户认证
  • 支持多种传输方式(UDP/TCP/TLS)

4.2 TURN 分配流程

sequenceDiagram
    participant C as 客户端
    participant T as TURN 服务器

    C->>T: Allocate Request
    T->>T: 验证认证信息
    T->>C: Allocate Success Response<br>返回中继地址
    Note over C: 获得中继地址<br>例如: 198.51.100.1:50000

    C->>T: CreatePermission Request<br>指定对端地址
    T->>C: CreatePermission Success

    C->>T: ChannelBind Request<br>绑定通道号
    T->>C: ChannelBind Success

    Note over C,T: 可以通过通道发送数据

4.3 TURN 消息类型

类型 说明
ALLOCATE 0x0003 请求分配中继地址
REFRESH 0x0004 刷新分配
SEND 0x0006 发送数据
DATA 0x0007 接收数据指示
CREATE-PERMISSION 0x0008 创建权限
CHANNEL-BIND 0x0009 绑定通道

4.4 TURN 属性

属性 类型值 说明
REQUESTED-TRANSPORT 0x0019 请求的传输协议
LIFETIME 0x000D 分配有效期
XOR-RELAYED-ADDRESS 0x0016 中继地址
XOR-PEER-ADDRESS 0x0012 对端地址
DATA 0x0013 数据内容
CHANNEL-NUMBER 0x000C 通道号

4.5 两种数据发送方式

Send/Data 方式

  • 每次发送都需要指定目标地址
  • 消息较大,效率较低

Channel 方式

  • 预先绑定通道号和对端地址
  • 使用更紧凑的消息格式
  • 推荐用于频繁通信
ChannelData 消息格式:
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Channel Number        |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Application Data                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4.6 TURN 中继通信流程

sequenceDiagram
    participant A as 客户端A
    participant T as TURN服务器
    participant B as 客户端B

    A->>T: Allocate
    T->>A: 中继地址: R1
    A->>T: ChannelBind (目标: B)
    T->>A: 通道号: 0x4000

    B->>T: Allocate
    T->>B: 中继地址: R2

    Note over A,B: 通过 TURN 中继通信
    A->>T: ChannelData [0x4000] + 数据
    T->>T: 查找通道绑定的目标
    T->>B: Data (来源: R1)
    B->>T: Send (目标: R1)
    T->>A: Data (来源: R2)

4.7 TURN vs STUN 对比

特性 STUN TURN
用途 发现公网地址 中继转发流量
协议基础 STUN STUN 扩展
连接成功率 ~80% ~100%
服务器负载 极低 高(转发所有流量)
带宽成本
延迟 低(P2P 直连) 较高(经过中继)
部署成本

5. DTLS(Datagram Transport Layer Security)

5.1 DTLS 是什么

DTLS 是 TLS 的 UDP 版本,由 RFC 6347 定义。WebRTC 使用 DTLS 进行:

  • 密钥交换
  • 身份验证
  • 建立加密上下文

为什么 WebRTC 不直接用 TLS?

  • TLS 基于 TCP,需要可靠传输
  • WebRTC 使用 UDP 实现低延迟
  • DTLS 在 UDP 上实现了 TLS 的安全特性

5.2 DTLS 与 TLS 的区别

特性 TLS DTLS
传输协议 TCP UDP
消息顺序 保证 不保证
消息可靠性 保证 需自行处理
分片 不需要 需要处理 MTU
重传 TCP 处理 DTLS 自己实现

5.3 DTLS 记录层

struct {
    ContentType type;
    ProtocolVersion version;
    uint16 epoch;
    uint48 sequence_number;
    uint16 length;
    opaque fragment[DTLSPlaintext.length];
} DTLSPlaintext;
字段 说明
type 内容类型(握手/告警/应用数据等)
version 协议版本
epoch 加密周期,密钥更新后递增
sequence_number 序列号,用于重放检测
length 片段长度
fragment 实际内容

5.4 DTLS 握手流程

sequenceDiagram
    participant C as 客户端
    participant S as 服务器

    C->>S: ClientHello<br>支持的加密套件、随机数
    S->>C: HelloVerifyRequest<br>Cookie(防 DoS)
    C->>S: ClientHello + Cookie
    S->>C: ServerHello<br>选中的加密套件、随机数
    S->>C: Certificate<br>服务器证书
    S->>C: ServerKeyExchange<br>密钥交换参数
    S->>C: CertificateRequest(可选)
    S->>C: ServerHelloDone

    C->>S: Certificate(可选)
    C->>S: ClientKeyExchange<br>密钥材料
    C->>S: CertificateVerify(可选)
    C->>S: ChangeCipherSpec
    C->>S: Finished(加密)

    S->>C: ChangeCipherSpec
    S->>C: Finished(加密)

    Note over C,S: 加密通信开始

5.5 DTLS 1.3 vs DTLS 1.2

特性 DTLS 1.2 DTLS 1.3
握手延迟 2 RTT 1 RTT
加密握手消息 部分 全部(除必要明文)
0-RTT 数据 不支持 支持
密钥派生 PRF HKDF

5.6 DTLS 与 SRTP 的密钥关系

flowchart LR
    A[DTLS 握手] --> B[协商主密钥]
    B --> C[密钥派生]
    C --> D[SRTP 密钥]
    C --> E[SRTCP 密钥]
    D --> F[SRTP 加密]
    E --> G[SRTCP 加密]

DTLS 握手完成后,使用 exporter 接口导出 SRTP 所需的密钥材料:

  • 加密密钥(用于 AES 等算法)
  • 盐值(Salt)
  • 认证密钥(用于 HMAC)

5.7 证书指纹

SDP 中的 fingerprint 属性包含 DTLS 证书的哈希值:

a=fingerprint:sha-256 26:FC:29:E8:56:49:3D:ED:4F:A7:2F:A9:7B:7E:4C:2B:...

作用

  • 通过信令通道传递证书指纹
  • 验证 DTLS 握手对端身份
  • 防止中间人攻击

6. SRTP(Secure Real-time Transport Protocol)

6.1 SRTP 是什么

SRTP 由 RFC 3711 定义,是 RTP 的安全扩展,提供:

  • 机密性保护:加密媒体数据
  • 消息认证:防止篡改
  • 重放保护:防止重放攻击

6.2 SRTP 包结构

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X|  CC   |M|     PT      |       sequence number         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           timestamp                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           synchronization source (SSRC) identifier            |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|            contributing source (CSRC) identifiers             |
|                             ....                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   RTP Extension (optional)                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Payload                              |
|                           ....                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Auth Tag                                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
部分 说明
RTP Header 12 字节固定头部
CSRC 贡献源列表(可选)
Extension 扩展头部(可选)
Payload 加密后的媒体数据
Auth Tag 认证标签

6.3 SRTP 加密流程

flowchart LR
    A[原始 RTP<br>Header + Payload] --> B[加密 Payload]
    B --> C[计算 Auth Tag<br>覆盖 Header + 加密 Payload]
    C --> D[SRTP 包<br>Header + Encrypted + Auth Tag]

关键点

  • RTP 头部不加密(路由需要)
  • 仅加密 Payload
  • 认证覆盖整个包(除 Auth Tag)

6.4 加密算法

加密套件 加密算法 认证算法 Auth Tag 长度
AES_CM_128_HMAC_SHA1_80 AES-128 Counter Mode HMAC-SHA1 80 bits
AES_CM_128_HMAC_SHA1_32 AES-128 Counter Mode HMAC-SHA1 32 bits
AEAD_AES_128_GCM AES-128 GCM GCM 128 bits
AEAD_AES_256_GCM AES-256 GCM GCM 128 bits

6.5 序列号与重放保护

SRTP 使用滑动窗口机制防止重放:

                    滑动窗口
    +---+---+---+---+---+---+---+---+---+
    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    +---+---+---+---+---+---+---+---+---+
                          ^
                          当前最高序列号
  • 收到包的序列号 < 窗口最小值:丢弃(可能的重放)
  • 序列号在窗口内且已收到:丢弃(重复)
  • 序列号 > 当前最高:滑动窗口

6.6 密钥派生

SRTP 从主密钥派生多个密钥:

flowchart TB
    A[主密钥 Master Key] --> B[加密密钥]
    A --> C[盐值 Salt]
    A --> D[认证密钥]

    E[主盐值 Master Salt] --> C

每个加密上下文包含:

  • 加密密钥(16/32 字节)
  • 盐值(14 字节)
  • 认证密钥(20/32 字节)

7. SRTCP(Secure RTCP)

7.1 SRTCP 结构

SRTCP 在 RTCP 基础上添加安全字段:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         RTCP Header                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Payload                               |
|                           ....                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         SRTCP Index                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Auth Tag                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

SRTCP Index 是一个 31 位的计数器,用于加密和重放保护。

8. 协议协作流程

8.1 完整连接建立流程

sequenceDiagram
    participant A as 用户A
    participant S as 信令服务器
    participant ST as STUN/TURN
    participant B as 用户B

    Note over A,B: 1. 媒体协商(通过信令)
    A->>S: Offer SDP
    S->>B: 转发
    B->>S: Answer SDP
    S->>A: 转发

    Note over A,B: 2. ICE 候选收集
    A->>ST: STUN Binding Request
    ST->>A: 公网地址
    A->>A: 收集 Host/SRFLX/Relay
    A->>S: ICE Candidates
    S->>B: 转发

    B->>ST: STUN Binding Request
    ST->>B: 公网地址
    B->>B: 收集 Host/SRFLX/Relay
    B->>S: ICE Candidates
    S->>A: 转发

    Note over A,B: 3. ICE 连通性检查
    A->>B: STUN Connectivity Check
    B->>A: STUN Response
    B->>A: STUN Connectivity Check
    A->>B: STUN Response
    Note over A,B: 选定路径

    Note over A,B: 4. DTLS 握手
    A->>B: DTLS ClientHello
    B->>A: DTLS ServerHello + Certificate
    A->>B: DTLS KeyExchange + Finished
    B->>A: DTLS Finished
    Note over A,B: 密钥协商完成

    Note over A,B: 5. SRTP 媒体传输
    A->>B: SRTP 加密媒体
    B->>A: SRTP 加密媒体

8.2 数据包层次关系

flowchart TB
    subgraph 应用数据
        A1[视频/音频帧]
    end

    subgraph RTP层
        B1[RTP Header]
        B2[Payload]
    end

    subgraph SRTP层
        C1[加密后的 Payload]
        C2[Auth Tag]
    end

    subgraph UDP层
        D1[UDP Header]
        D2[UDP Data]
    end

    A1 --> B2
    B1 --> C1
    B2 --> C1
    C1 --> D2
    C2 --> D2

8.3 时间关系

阶段 典型时间
ICE 收集 100-500ms
连通性检查 50-200ms
DTLS 握手 50-100ms
首帧显示 总计 200-1000ms

9. 安全性考虑

9.1 多层安全防护

层次 协议 保护目标
网络层 ICE 防止 IP 欺骗
传输层 DTLS 密钥安全、身份验证
媒体层 SRTP 数据加密、完整性

9.2 常见安全威胁与防护

威胁 说明 防护措施
中间人攻击 攻击者冒充对端 证书指纹验证
重放攻击 重放历史数据包 SRTP 序列号窗口
数据篡改 修改传输内容 Auth Tag 验证
DoS 攻击 耗尽服务器资源 STUN Cookie 机制

10. 总结

协议 作用 关键点
ICE 连接协调 候选收集、连通性检查、路径选择
STUN 地址发现 轻量级、高成功率
TURN 中继转发 最后手段、100% 成功
DTLS 安全握手 UDP 版 TLS、密钥协商
SRTP 媒体加密 低开销、重放保护

关键点:

  1. ICE 框架:整合 STUN/TURN,自动化 NAT 穿透
  2. STUN 轻量:只发现地址,不中继流量
  3. TURN 兜底:当 P2P 不通时保证连接
  4. DTLS 密钥:在 UDP 上实现安全握手
  5. SRTP 加密:保护媒体数据,认证防篡改

下一章将介绍视频编码技术。