WebRTC 中 PeerConnection 建立连接过程介绍_webrtc peerconnection_有点酷°的博客-程序员秘密

技术标签: vue.js  javascript  

WebRTC 中 PeerConnection 建立连接过程介绍

前言

WebRTC 中数据传输都是通过被称为 PeerConnection 的对象来完成的,PeerConnection 在可以传输数据前的建立过程现对于传统的 C/S 模式有略微差别,类似于 P2P 连接的建立过程,并且复用了传统的 STUN/TURN/ICE 架构的 P2P 实现方式。由于 WebRTC 支持 MESH/SFU/MCU 三种模式,使用 PeerConnection 概念的好处是可以同时兼容这三种模式,即使是像 SFU/MCU 这种非 P2P 的场景也同样使用 PeerConnection 来建立传输通道,不过针对 SFU/MCU 场景已经有一些优化方案,例如 ice-lite 。本文介绍了 P2P 和 SFU 场景中 PeerConnection 建立的过程。

WebRTC PeerConnection 建立过程

常规的 WebRTC PeerConnection 通信过程中有四种角色:

Signaling Server
STUN/TURN/ICE Server
Local Peer
Remote Peer

通信过程中的基本概念:

Room: Signaling Server 使用 Room 的概念对一组通信的 peers 进行管理,一个 Room 中包含 一个或多个 peers,当没有 peers 存在时 Room 自动注销;当第一个 peer 连接到 Signaling Server 时执行 Create Room 操作;

Offer/Answer:描述 peer 媒体属性的 SDP 信息通过 Offer/Answer 模式,由 Signaling Server 进行交换,通信建立前两个互相通信的 peer 需要互相获得对方的 媒体 SDP 信息;

IceCandidate: Peer 与 STUN/TURN/ICE Server 通信,获取自己的 NAT 类型以及公网IP和端口,这些消息简称为 IceCandidate。和 媒体描述信息一样,IceCandidate 信息也需要互相通信的 peer 在通信前进行交换,在获取到对方的 iceCandidate 信息后双方通过 Stun binding 信令确认信道的联通性;

下图为经典的 WebRTC 中 PeerConnection 连接建立流程图:
在这里插入图片描述
通过上面的流程图可以总结出一下几点:

1、peerConnnection 建立之前必须交换两个信息:SDP 和 iceCandidate;
2、Answer 端接收到 Offer 后才会创建 PeerConnection 对象;
3、Offer 端在创建成功本地 Offer 后才会去收集本地 iceCandidate;Answer 端在创建成功本地 Answer 后才会去收集本地iceCandidate;
4、peerConnection 两端都收到 iceCandidate 后才完成 peerConnection 的建立。

使用 Web API 建立简单 peerConnection 的大概流程为:

1、创建 peerConnection 对象 pc = new RTCPeerConnection(null);当初始化参数中 iceServers 为空时只能创建本地连接;
2、设置peerConnection 对象 事件响应操作
pc.addEventListener(‘icecandidate’, xxx) // icecandidate 通知,WebRTC 默认开启了 trickle-ice,所以每探测到一个 iceCandidate 都会触发一次该事件,直到事件返回为 null 时,表示完成 iceCandidate 探测;
3、pc.addEventListener(‘iceconnectionstatechange’, xxx) // ice 状态改变
4、pc.addEventListener(‘track’, xxx) // 接收到 track
5、执行 peerConnection 操作
6、pc.addTrack() 为 peerConnection 增加媒体流;
7、pc.createOffer() / pc.createAnswer() 创建 SDP Offer / SDP Answer
8、pc.setLocalDescription() Offer 端创建 Offer 后,Answer 端创建 Answer 后,将本地生成的 SDP 信息加入到本地 peerConnection;注意:iceCandidate 的收集过程发生在这个操作之后;
9、pc.setRemoteDescription() Answer 端接收到 Offer 后,Offer 端接收到 Answer 后,将对端的 SDP 信息加入到本地 peerConnection;
10、pc.addIceCandidate() 将对端生成的 iceCandidate 加入到本地 peerConneciton 的 ICE 代理中;

上面这个示例中使用到了 trickle-ice 协议,在 WebRTC 的 SDP 中通常可以包含三类信息

ICE Parameters: candidate/ice-ufrag/ice-pwd
DTLS Parameters: fingerprint/setup
Media Parameters: extmap/rtpmap/fmtp/rtcp-fb/ssrc

也就是说 iceCandidate 信息是可以放到 SDP 里面的,省去了一次信息交换的过程,但是 iceCandidate 的收集过程是比较耗时的,所以 WebRTC 里面启用了 trickle-ice,上面示例中 createOffer 产生的 SDP 里面并没有 iceCandidate 信息,而是在 peerConnection 执行 setLocalDescription 操作后才开始收集 iceCandidate,收集到一个便触发一次 icecandidate 事件,然后通过信令通道输出到对端 peerConnection,对端 peerConneciton 通过执行 addIceCandidate 操作将对端的 iceCandidate 添加到本地 peerConnection 的 ICE agent 中。

SFU 模式 PeerConnection 建立过程

SFU 模式下,SFU 服务都会有自己的固定公网IP地址,这个先决条件简化了 WebRTC 中 peerConnection 的建立过程,可以把这种场景理解为 P2P 通信的一端确定在 NAT 前面,并且有固定IP地址的特殊情况,这时对于 SFU 服务没有必要再去收集自己的 iceCandidate,所以 ICE 协议(RFC5245) 中定义了一种 lite 实现方式,简化了有固定IP公网地址一端的 ice 实现方式,只要满足固定公网IP的前提条件,通过 lite 方式实现一个 ice server,完全实现 ice 协议的对端将毫无感知的与 lite 实现建立常规的 peerConnection 通信信道。

ice-lite 有以下几个特点:

1、ICE 的 Lite 实现不需要实现 Candidate 的收集过程;只需要提供 Host Candidate;
2、不需要实现连通性检查或者状态机,只需要实现连通性检查的Response;
3、ICE Lite 在交互过程中只能是 controlled 角色,并且不能使用 USE-CANDIDATE 来做 ice nomination;
4、常规的 SFU 都会自身集成一个 ice lite 实现的 ice server,所以交互过程中省去了 ice server 的独立角色。SFU 的 SDP 信息中会携带自身的 Host Candidate 和 ‘a=ice-lite’ 属性,当对端收到 ‘a=ice-lite’ 属性后会自动将自己设置成 controlling 角色,主动与 SFU 的 ice agent 进行交互。同时 SFU 也不需要对端的 iceCandidate 信息,因为在对端发起 stun binding 测试连通性的时候就可以获取对端的信息,便可以建议一个 Transport tuple 用来维持 peerConnection 通信。

下图是 SFU 模式下 peerConnectionn 的建立过程:
在这里插入图片描述
通过上面的流程图可以看出,在 SFU 场景下 peerConnection 的过程得到了简化,由于 SFU 具有固定公网 IP 地址和 ice-lite 实现的 ice server 加持,省去了 peerConnection 双方单独交换 iceCandidate 的流程,并且可以缩短 peerConnection 的建立时间。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wh5757180/article/details/115076037

智能推荐

[ASP基础][SQL语句]ASP中使用SQL语句教程 _ChneChen的博客-程序员秘密

(http://edu.chinaz.com/Get/Program/Asp/058310953226894281.asp)(http://edu.chinaz.com/Get/Program/Asp/058310953226894281_2.asp)(http://edu.chinaz.com/Get/Program/Asp/058310953226894281_3.asp)

吴裕雄--天生自然 R语言开发学习:基本数据管理(续一)_weixin_30339969的博客-程序员秘密

#---------------------------------------------------------## R in Action (2nd ed): Chapter 4 ## Basic data management ...

跨链技术的分析和思考_跨链技术践行者的博客-程序员秘密

当前的区块链底层技术平台百花齐放,不同的业务、不同的技术底层的区块链之间缺乏统一的互联互通的机制,这极大限制了区块链技术和应用生态的健康发展。跨链的需求由此而来,本文通过分析几种主流的跨链方案探讨跨链技术的本质及相应的解决思路。跨链的类型跨链交互根据所跨越的区块链底层技术平台的不同可以分为同构链跨链和异构链跨链:同构链之间安全机制、共识算法、网络拓扑、区块生成验证逻辑都一致,它们之间的...

实验室服务器的连接,交互,anaconda安装和环境配置,pytorch安装_阿姝姝姝姝姝的博客-程序员秘密

服务器连接与使用1、Xshell2、Xftp3、安装anaconda3并新建环境4、安装pytorch1、Xshell我的电脑是win10系统,连接实验室的Linux系统服务器,选用Xshell软件,连接方式为用户名密码登录,参考了这篇文章。连接成功之后界面如下图2、Xftp使用Xftp交互图形化软件管理服务器文件,使用方法和Xshell相同,下载安装参考 这篇文章。连接成功之后界面如下图,左侧是win10桌面,右侧是服务器目录。直接使用鼠标左键拖拽文件即可上传,在服务器目录中双击文件即可下载

hibernate官方文档手册学习--第 16 章 HQL: Hibernate 查询语言_索隆的博客-程序员秘密

个人感觉,HQL语言就是假的sql。它通过映射把hql中的对象可以喝数据库表的字段对应,在hql里出现的是对象,而不是表字段。我觉得这是hibernate失败的地方,本来hibernate就是想通过映射和持久化使程序员不用再考虑sql怎么写,直接面向对象编程就可以了。那这hql语言像sql又不是sql,它又有自己的一套规则,虽然和真正的sql比出不多,但你也得去了解才能在实际中使用...

spark系列二:parquet数据源之自动合并元数据_cjx42518041的博客-程序员秘密

+--------+----+-----+ 如同ProtocolBuffer,Avro,Thrift一样,Parquet也是支持元数据合并的。用户可以在一开始就定义一个简单的元数据,然后随着业务需要,逐渐往元数据中添加更...

随便推点

页面加载性能之Web Vitals_前端 web-vitals_找到Web的博客-程序员秘密

Web Vitals是Google的一项重大举措,旨在为质量信号提供统一的指导,这对于在Web上提供出色的用户体验来说很重要。网站的开发者需要了解自己的网站给用户带来的体验,但不一定要成为性能优化的专家。Web Vitals旨在简化流程,并帮助网站开发者聚焦在核心性能指标上,也称为Core Web Vitals。Core Web VitalsCore Web Vitals是Web Vitals的一个子集,适用于所有网页,应该被所有开发者去进行测量,也将在所有Google提供的工具中浮现。每一个Core

CPU虚高故障分析_chutongg028083的博客-程序员秘密

总结步骤: 1,使用命令top -p <pid> ,显示你的java进程的内存情况,pid是你的java进程号,比如123 2,按H,获取每个线程的内存情况 3,找到内存和cpu占用最高的线程pid,比如15248 4,执行 printf 0x%x 15248 得到 0x3b9...

笨鸟的平凡之路-win10虚拟机安装MAC OS_笨鸟的平凡之路的博客-程序员秘密

一、准备工作VM虚拟机:我选的版本是VMware14MacOS镜像文件:我选的版本是10.12Mac补丁:借助提供,补丁的作用就是让我们win10里面的VM虚拟机可以提供MacOS系统的安装。工具地址(不包含镜像,镜像太大,不是VIP有限制,希望理解):链接: https://pan.baidu.com/s/1AEOoEYw9Sw-4KmFVWP8QAg 提取码: qgv2二、开始1...

基于LMS8962的跑马灯教学程序——定时器、串口及GPIO的使用_changesway的博客-程序员秘密

使用定时器中断等多种方式,实现了一简单地跑马灯程序

宝塔上线项目_LetMe-886的博客-程序员秘密

3、粘贴宝塔地址输入对应的账号名、密码之后会弹出登录注册》》没有注册的自己去宝塔注册,注册完后登录进入到如下界面。2、输入自己服务器IP和服务器实例的密码,安装完成后会弹出宝塔的地址和账号名、密码(记得保存)这里有一点需要注意一下,你宝塔上新建的目录里面会有一些默认文件,将其全部删除掉,点击上传。最后直接在浏览器输入你服务器IP和你发布的对应的端口号就可以看到自己的项目已经发布成功了。5、注意 步骤4输入信息的88是服务器访问端口号,记得要在服务器开启该端口号。到这里服务器对应的端口已经开启。

easyUI+HSSFWorkbook导出Excel表格_easyui导出excel分页_Kli1046的博客-程序员秘密

1、自定义分页工具条,在分页条上新增导出按钮var pager = $('#tableID').datagrid('getPager'); pager.pagination({ buttons:[{ text:'导出本页', iconCls:'icon-save', handler:function(){ } },{ ...

推荐文章

热门文章

相关标签