WebRTC 开发实践:为何你须要 SFU 服务器

当你入门 WebRTC 以后,很快就会接触到一个名词,叫作:SFU,你可能很容易就在网上寻找到不少 SFU 的开源实现,并并兴致勃勃地开始编译、部署和测试这些服务器,可是可曾想过,为啥咱们的 WebRTC 应用须要 SFU 服务器 ?html

1 WebRTC P2P 通话的网络模型服务器

1.png

如图是 WebRTC P2P 模式下的网络拓扑结构,ClientA 和 ClientB 若是可以顺利创建 P2P 的链接,则可直接经过 P2P 互相交换数据。若是因为某些网络环境缘由,没法成功打通 P2P 链接的话,则能够经过一台 TURN Server 来中转数据给对方。微信

这个 TURN Server 是指支持 TURN 协议 的服务器,它扮演着一种网络中继的角色,支持把一个 Client 的数据包透明转发到多个其余的 Client 客户端。网络

在这种简单的 P2P 通话场景下,其实这种模型基本够用了,根本不须要架设什么 SFU 服务器。ide

下面咱们再近一步,看看多人通话的场景:测试

2.png

如图所示,多人通话跟单人通话惟一的不一样就是每一个客户端都须要跟其余两个端都分别创建 P2P 链接,我在《WebRTC 开发实践:从一对一通话到多人会议》也介绍过这个场景。与一对一通话同样,若是两个端可以顺利创建 P2P 的链接,则直接经过 P2P 互相交换数据;若是没法打通,则利用 Turn Server 来中转数据。spa

咱们把这种彻底使用 P2P 方式的网络拓扑结称之为 Mesh 结构,下面咱们谈谈它的优劣点。code

2 WebRTC Mesh 网络拓扑结构的优劣视频

优势:htm

  • 逻辑简单,容易实现

  • 服务端比较 “轻量”,TURN 服务器比较简单,必定比例的 P2P 成功率可极大减轻服务端的压力

缺点:

  • 每新增一个客户端,全部的客户端都须要新增一路数据上行,客户端上行带宽占用太大。所以,通话人数越多,效果越差

  • 没法在服务端对视频进行额外处理,如:录制存储回放、实时转码、智能分析、多路合流、转推直播等等

由此能够看到,mesh 结构的缺点影响仍是比较大的,真正商业化的应用,是须要具有良好的通话质量、服务稳定性和可扩展性的,所以,亟需一种新的网络拓扑结构,可以很好的规避 mesh 结构的这些短板。

3 什么是 SFU ?

SFU 的全称是:Selective Forwarding Unit,是一种经过服务器来路由和转发 WebRTC 客户端音视频数据流的方法。

3.png

如图所示,SFU 服务器最核心的特色是把本身 “假装” 成了一个 WebRTC 的 Peer 客户端,WebRTC 的其余客户端其实并不知道本身经过 P2P 链接过去的是一台真实的客户端仍是一台服务器,咱们一般把这种链接称之为 P2S,即:Peer to Server。除了 “假装” 成一个 WebRTC 的 Peer 客户端外,SFU 服务器还有一个最重要的能力就是具有 one-to-many 的能力,便可以将一个 Client 端的数据转发到其余多个 Client 端。

这种网络拓扑结构中,不管多少人同时进行视频通话,每一个 WebRTC 的客户端只须要链接一个 SFU 服务器,上行一路数据便可,极大减小了多人视频通话场景下 Mesh 模型给客户端带来的上行带宽压力。

SFU 服务器跟 TURN 服务器最大的不一样是,TURN 服务器仅仅是为 WebRTC 客户端提供的一种辅助的数据转发通道,在 P2P 不通的时候进行透明的数据转发。而 SFU 是 “懂业务” 的, 它跟 WebRTC 客户端是平等的关系,甚至 “接管了” WebRTC 客户端的数据转发的申请和控制。

4 什么是 MCU ?

从上述 SFU 的定义能够看到,SFU 这种网络拓扑模型,经过由 SFU Server 来实现 one-to-many ,减轻了多人视频通话场景下每一个客户端的上行带宽压力,可是下行依然是多路流,随着通话人数的增大,下行带宽的压力依然会成比例的增大,那可否让下行也只剩一路流呢?—— 能够,经过在服务器端合流后再下发便可解决,以下图所示:

4.png

这种网络拓扑结构,被称之为 MCU,它的特色是,由 MCU Server 将各路客户端上行的视频流合成为一路,再转发给其余客户端。这种模型相比于 SFU 下降了多人视频通话场景下客户端的下行带宽压力,可是因为合流须要转码操做,对服务器端压力比较大,并且下发给客户端的流是固定的合流画面,灵活性不是特别好。

5 为啥推荐选择 SFU ?

综上所述,纯 mesh 方案没法适应多人视频通话,也没法实现服务端的各类视频处理需求,最早排除在商业应用以外。

SFU 相比于 MCU,服务器的压力更小(纯转发,无转码合流),灵活性更好(可选择性开关任意一路数据的上下行等),受到更普遍的欢迎和应用,常见的开源 SFU 服务器有:Licode,Janus,Jitsi,mediasoup,Medooze 等等,各有特色,你们能够去项目主页了解更详细的状况。

固然,也能够组合使用 SFU + MCU 的混合方案,以灵活应对不一样场景的应用须要。

5 小结

关于 WebRTC SFU 相关知识点就分享到这里了,若有疑问的小伙伴欢迎来信 lujun.hust@gmail.com 交流。另外,也欢迎你们关注个人新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。

weixin_jhuster.jpg

相关文章
相关标签/搜索