WebRTC 是基于 P2P 的实时通信技术,(如果 P2P 打洞失败,则会使用 TURN 服务器进行数据转发),在有 2 台客户端参与的情况下,网络拓扑结构如图:

一、Mesh 架构

在只有 2 个客户端参与情况下,我们可以使用上图的这种拓扑结构。但假如同时有 3 个客户端参与(如多人视频会议),如果还是按照上面的方式,拓扑结构就会变成:

从上图中我们可以看到,在 3 人参与的实时通信中,每个客户端要维持 4 个连接(2 个上行,2 个下行);同理,如果有 N 个客户端参与,每个客户端就要维持N-1上行,N-1个下行,这样会极大的占用客户端的上行带宽和下行带宽;

这种每个端之前完全使用 P2P 方式架构称之为 Mesh 架构。

二、SFU (Selective Forwarding Unit)架构


SFU 架构最核心的特点是把自己 “伪装” 成了一个 WebRTC 的客户端,WebRTC 的其他客户端其实并不知道自己通过 P2P 连接过去的是一台真实的客户端还是一台服务器,我们通常把这种连接称之为 P2S,即:Peer to Server。除了 “伪装” 成一个 WebRTC 的客户端外,SFU 服务器还有一个最重要的能力就是具备one-to-many的能力,即可以将一个客户端的数据转发到其他多个客户端。

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

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

三、MCU (MultiPoint Control Unit)架构

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

目前,随着 5G 技术的推广,可以预见带宽越来越不是问题,所以 SFU 在未来,可能会更有优势。常见的开源 SFU 服务器有:LicodeJanusJitsimediasoupMedooze 等等。

文章参考:
WebRTC 开发实践:为什么你需要 SFU 服务器 > webrtc 笔记(3): 多人视频通讯常用架构 Mesh/MCU/SFU