news 2026/5/12 0:12:15

WebRTC 连接建立流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WebRTC 连接建立流程

第一阶段:信令与 ICE 候选地址交换

第二阶段:ICE 连通性检查(建立原始通道)

第三阶段:DTLS 握手(在 ICE 建立的通道上)

第四阶段:SRTP 密钥导出与媒体传输

完整流程的时间线总结


!!!别的不说,先上图!!!

流程图对应的plantUML代码:

sequenceDiagram participant A as Peer A participant Sig as 信令服务器 participant B as Peer B participant STUN as STUN/TURN 服务器 Note over A, B: 第一阶段:本地准备与信令交换 A->>A: 1. 创建PeerConnection<br>收集ICE候选地址 A->>Sig: 2. 发送SDP Offer<br>(含ICE候选地址) Sig->>B: 转发Offer B->>B: 3. 收集自己的ICE候选地址 B->>Sig: 4. 发送SDP Answer<br>(含ICE候选地址) Sig->>A: 转发Answer Note over A, B: 第二阶段:ICE连接性检查 A->>B: STUN请求 (测试路径1) B->>A: STUN响应 (路径通的确认) Note over A,B: 建立双向连接通道<br>但还不能传媒体 Note over A, B: 第三阶段:DTLS握手(在ICE选定的通道上) rect rgb(240, 255, 240) A->>B: ClientHello B->>A: ServerHello, Certificate, ServerKeyExchange,<br>ServerHelloDone A->>B: ClientKeyExchange, ChangeCipherSpec, Finished B->>A: ChangeCipherSpec, Finished end Note over A, B: DTLS握手完成<br>双方获得主密钥 Note over A, B: 第四阶段:SRTP密钥导出与媒体流传输 rect rgb(240, 248, 255) A->>A: 5. 从DTLS主密钥导出<br>SRTP加密密钥 B->>B: 从相同的DTLS主密钥导出<br>SRTP解密密钥 A->>B: 6. 开始传输加密的SRTP媒体流 B->>A: 传输加密的SRTP媒体流 end

第一阶段:信令与 ICE 候选地址交换

这部分与之前描述一致:

  1. Peer A创建RTCPeerConnection,收集 ICE 候选地址(主机、反射、中继)

  2. Peer A通过信令服务器发送SDP Offer(包含 ICE 候选地址和媒体信息)

  3. Peer B收到 Offer 后,收集自己的 ICE 候选地址

  4. Peer B通过信令服务器发送SDP Answer(包含自己的 ICE 候选地址)

第二阶段:ICE 连通性检查(建立原始通道)

这是DTLS 的前提

  1. 双方使用 STUN 协议测试所有候选地址对

  2. 找到可通行的最佳路径(可能是 P2P 直连或通过 TURN 中继)

  3. 重要:此时建立的是一个原始的数据传输通道,但还没有加密,不能传输敏感媒体数据

第三阶段:DTLS 握手(在 ICE 建立的通道上)

这是安全性的核心。一旦 ICE 完成,两端立即在已建立的通道上启动 DTLS 握手:

什么是 DTLS?

  • DTLS = Datagram Transport Layer Security(数据包传输层安全)

  • 它是 TLS(HTTPS 使用的协议)的 UDP 版本

  • 专门为无连接、不可靠的 UDP 通道设计,能处理丢包、乱序等问题

DTLS 握手步骤:

  1. ClientHello: Peer A(作为 DTLS 客户端)向 Peer B 发送 ClientHello 消息

  2. ServerHello + Certificate

    • Peer B(作为 DTLS 服务器)回复 ServerHello

    • 关键:Peer B 发送自己的DTLS 证书(浏览器自动生成的临时证书)

  3. 密钥交换:双方交换密钥交换参数(如 ECDHE)

  4. Finished:双方交换 Finished 消息,验证握手完整性

重要规则

  • SDP 中的 a=fingerprint 属性:在 Offer/Answer 交换时,每个对等端都包含了自己证书的指纹(哈希值)

  • 证书验证:DTLS 握手时,对端会验证收到的证书是否与 SDP 中声明的指纹匹配,防止中间人攻击

  • 角色确定:通常,发送 Offer 的一方作为 DTLS 客户端,发送 Answer 的一方作为 DTLS 服务器

握手结果

  • 双方协商出一个共享的主密钥

  • 建立了加密的 DTLS 信道

  • DTLS 信道不直接传输媒体,而是用来派生媒体加密密钥

第四阶段:SRTP 密钥导出与媒体传输

从 DTLS 到 SRTP:

  1. 密钥导出函数:双方使用 DTLS 握手生成的主密钥,通过标准的密钥导出函数(如 TLS 的 PRF)计算出一对SRTP 密钥材料

  2. 生成两对密钥

    • SRTP 加密密钥/盐(用于发送媒体)

    • SRTP 解密密钥/盐(用于接收媒体)

  3. 密钥同步:因为双方有相同的主密钥,所以导出的 SRTP 密钥也是匹配的

开始媒体传输:

  1. SRTP 封装:音频/视频数据被封装成SRTP 包(Secure RTP)

  2. 加密传输:使用导出的 SRTP 密钥对媒体进行加密和认证

  3. 完整保护:提供:

    • 机密性:媒体内容加密

    • 完整性:防止数据篡改

    • 重放保护:防止攻击者重放旧数据包

完整流程的时间线总结

1. 信令交换:SDP Offer/Answer + ICE 候选地址交换 ↓ 2. ICE 连接检查:建立原始 UDP 通道 ↓ 3. DTLS 握手:在建立的 UDP 通道上进行加密握手 ↓ 4. SRTP 密钥导出:从 DTLS 主密钥生成媒体加密密钥 ↓ 5. SRTP 媒体流:开始传输加密的音视频数据 ↓ 6. (可选) SCTP/DataChannel:在 DTLS 信道上建立加密的数据通道
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 15:16:37

Git Commit规范助力AI开发:结合PyTorch项目的版本管理技巧

Git Commit规范助力AI开发&#xff1a;结合PyTorch项目的版本管理技巧 在深度学习项目中&#xff0c;我们常常遇到这样的场景&#xff1a;某次实验准确率突然提升了3%&#xff0c;但翻遍训练日志和代码变更记录&#xff0c;却无法确定是哪个改动带来的效果。团队成员提交的 git…

作者头像 李华
网站建设 2026/5/10 15:02:25

Conda环境导入导出:跨平台迁移PyTorch项目

Conda环境导入导出&#xff1a;跨平台迁移PyTorch项目 在深度学习项目的日常开发中&#xff0c;你是否遇到过这样的场景&#xff1a;本地训练一切正常&#xff0c;模型跑得飞快&#xff0c;信心满满地把代码推到服务器上准备大规模训练&#xff0c;结果一运行就报错——torch.…

作者头像 李华
网站建设 2026/5/9 20:31:59

如何在云服务器上部署PyTorch-CUDA环境?详细图文教程

如何在云服务器上部署 PyTorch-CUDA 环境&#xff1f;—— 从零到训练的实战指南 在深度学习项目中&#xff0c;最让人头疼的往往不是模型设计本身&#xff0c;而是环境搭建&#xff1a;CUDA 驱动装不上、PyTorch 版本不兼容、cuDNN 缺失……这些“环境陷阱”常常让开发者耗费…

作者头像 李华
网站建设 2026/5/8 18:20:16

【视频】GStreamer+WebRTC(五):通过修改SDP改变webrtc数据流单双方向

1、问题描述 在设备终端和人机交互终端使用webrtc实现视频和通话时,设备端不需要显示图像,只播放声音即可。 这时需要修改发送的SDP,比如将 sendrecv 改为 sendonly,如何操作呢? 2、解决方法 2.1 修改SDP 比如:在 webrtcbin 创建了offer SDP后,会发送 create-offer …

作者头像 李华
网站建设 2026/5/11 8:00:58

内网穿透的应用-服务器卡成 PPT?Netdata 帮你实时抓出 拖后腿 的进程

文章目录 前言1.关于Netdata**2.本地部署Netdata**3.使用Netdata4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Netdata公网地址 前言 Netdata 是一款轻量级服务器监控工具&#xff0c;能实时展示 CPU、内存、网络带宽等硬件指标&#xff0c;还能追踪进程资源占用情况…

作者头像 李华
网站建设 2026/5/10 7:37:31

Jupyter Notebook密码保护设置:防止未授权访问

Jupyter Notebook密码保护设置&#xff1a;防止未授权访问 在云计算与远程开发日益普及的今天&#xff0c;数据科学家和AI工程师越来越依赖Jupyter Notebook进行模型实验、数据分析和教学演示。它以交互式Web界面打破了传统脚本开发的壁垒&#xff0c;让代码执行、结果可视化和…

作者头像 李华