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 连接建立流程图: 最佳实践 通过浏览器的 JavaScript 接口了解 peerConnection 建立过程是一个非常不错的实践方式,上面的 sample 通过最简单的方式实现了两个 peerConneciton 的建立过程。 使用 Web API 建立简单 peerConnection 的大概流程为: 上面这个示例中使用到了 trickle-ice 协议,在 WebRTC 的 SDP 中通常可以包含三类信息 也就是说 iceCandidate 信息是可以放到 SDP 里面的,省去了一次信息交换的过程,但是 iceCandidate 的收集过程是比较耗时的,所以 WebRTC 里面启用了 trickle-ice,上面示例中 createOffer 产生的 SDP 里面并没有 iceCandidate 信息,而是在 peerConnection 执行 setLocalDescription 操作后才开始收集 iceCandidate,收集到一个便触发一次 icecandidate 事件,然后通过信令通道输出到对端 peerConnection,对端 peerConneciton 通过执行 addIceCandidate 操作将对端的 iceCandidate 添加到本地 peerConnection 的 ICE agent 中。 为了验证将 iceCandidate 放到 SDP 中也可以实现 peerConnection 的连接,我们将上面的示例做了调整。当本地 iceCandidate 收集完成后再 createOffer,这样 SDP 信息中就携带了 candidate 信息, 修改后的示例请参考: SFU 模式下,SFU 服务都会有自己的固定公网IP地址,这个先决条件简化了 WebRTC 中 peerConnection 的建立过程,可以把这种场景理解为 P2P 通信的一端确定在 NAT 前面,并且有固定IP地址的特殊情况,这时对于 SFU 服务没有必要再去收集自己的 iceCandidate,所以 ICE 协议(RFC5245) 中定义了一种 lite 实现方式,简化了有固定IP公网地址一端的 ice 实现方式,只要满足固定公网IP的前提条件,通过 lite 方式实现一个 ice server,完全实现 ice 协议的对端将毫无感知的与 lite 实现建立常规的 peerConnection 通信信道。 ice-lite 有以下几个特点: 常规的 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 的建立过程: 最佳实践
0x00 前言
0x01 WebRTC PeerConnection 建立过程
通过上面的流程图可以总结出一下几点:
Webrtc Samples → Basic peer connection demo: https://webrtc.github.io/samples/src/content/peerconnection/pc1/
对应源文件:https://github.com/webrtc/samples/tree/gh-pages/src/content/peerconnection/pc1
由于是在同一个 js 文件内创建两个 peerConnection,所有使用全局变量方式可以省略 Stun Server 和 Signal Server;
https://aggresss.github.io/webrtc-samples/src/content/peerconnection/pc1-mod/
0x02 SFU 模式 PeerConnection 建立过程
通过上面的流程图可以看出,在 SFU 场景下 peerConnection 的过程得到了简化,由于 SFU 具有固定公网 IP 地址和 ice-lite 实现的 ice server 加持,省去了 peerConnection 双方单独交换 iceCandidate 的流程,并且可以缩短 peerConnection 的建立时间。
mediasoup 是一个典型的 SFU 服务,可以通过搭建 mediasoup-demo 来演示上面的使用场景,具体请参考:https://aggresss.blog.csdn.net/article/details/104858479
参考资料
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算