WebRTC 開發實踐:爲什麼你需要 SFU 服務器

當你入門 WebRTC 之後,很快就會接觸到一個名詞,叫做:SFU,你可能很容易就在網上尋找到很多 SFU 的開源實現,並並興致勃勃地開始編譯、部署和測試這些服務器,但是可曾想過,爲啥我們的 WebRTC 應用需要 SFU 服務器 ?

1 WebRTC P2P 通話的網絡模型

1.png

如圖是 WebRTC P2P 模式下的網絡拓撲結構,ClientA 和 ClientB 如果能夠順利建立 P2P 的連接,則可直接通過 P2P 互相交換數據。如果由於某些網絡環境原因,無法成功打通 P2P 連接的話,則可以通過一臺 TURN Server 來中轉數據給對方。

這個 TURN Server 是指支持 TURN 協議 的服務器,它扮演着一種網絡中繼的角色,支持把一個 Client 的數據包透明轉發到多個其他的 Client 客戶端。

在這種簡單的 P2P 通話場景下,其實這種模型基本夠用了,根本不需要架設什麼 SFU 服務器。

下面我們再近一步,看看多人通話的場景:

2.png

如圖所示,多人通話跟單人通話唯一的不同就是每個客戶端都需要跟其他兩個端都分別建立 P2P 連接,我在《WebRTC 開發實踐:從一對一通話到多人會議》也介紹過這個場景。與一對一通話一樣,如果兩個端能夠順利建立 P2P 的連接,則直接通過 P2P 互相交換數據;如果無法打通,則利用 Turn Server 來中轉數據。

我們把這種完全使用 P2P 方式的網絡拓撲結稱之爲 Mesh 結構,下面我們談談它的優劣點。

2 WebRTC Mesh 網絡拓撲結構的優劣

優點:

  • 邏輯簡單,容易實現

  • 服務端比較 “輕量”,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 相關知識點就分享到這裏了,如有疑問的小夥伴歡迎來信 [email protected] 交流。另外,也歡迎大家關注我的新浪微博 @盧_俊 或者 微信公衆號 @Jhuster 獲取最新的文章和資訊。

weixin_jhuster.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章