如果你是長期關(guān)注 WebRTC 的資深開發(fā)者或技術(shù)愛好者,你可能留意到了,近期圈子里出了一個(gè)不大不小的話題,引得一些知名 WebRTC 技術(shù)博主紛紛發(fā)聲,表明觀點(diǎn)。
事情是這樣的。
前不久,Jitsi 在其官方博客[1]上發(fā)布了一個(gè) WebRTC 與 Zoom Web 客戶端的視頻通話對比測試。測試結(jié)果顯示,WebRTC 的視頻通話質(zhì)量比 Zoom 還要好。一石激起千層浪,不少博主發(fā)表了自己的看法。
視頻源自 Jitsi 的博客
看似是在挑事,但 Jitsi 出此一舉完全事出有因。
Jitsi 是一個(gè)開源項(xiàng)目,可幫開發(fā)者在 Web 、Windows、Linux、Mac OS X、Android 平臺(tái)上實(shí)現(xiàn)實(shí)時(shí)的語音、視頻通話應(yīng)用。有很多獨(dú)立開發(fā)者在基于這套代碼開發(fā)自己的視頻通話應(yīng)用。這一切,都是建立于 WebRTC 的基礎(chǔ)之上實(shí)現(xiàn)的。然而, Jitsi 卻看到作為視頻會(huì)議服務(wù)提供商的 Zoom 不但從 2015 年開始就在一些地方一再聲稱自己并沒有使用 WebRTC,甚至不斷表示“WebRTC 是一種能力非常有限的解決方案”:
圖:源自 Jitsi 官方博客
Jitsi 如何測試 WebRTC 弱網(wǎng)傳輸呢?
他們在同一個(gè) Wi-Fi 環(huán)境下,用同樣的一臺(tái) Mac ,做了兩次測試,分別用 WebRTC 和 Zoom 進(jìn)行一對一視頻通話。在兩組通話的最初 10 秒,只是進(jìn)行正常通話,在 10 秒之后,開始增加網(wǎng)損,同時(shí)限制上行與下行帶寬至 500kbps。這時(shí)測量兩個(gè)方案各自需要多長時(shí)間來調(diào)整,使正在進(jìn)行的視頻通話穩(wěn)定適應(yīng)目前網(wǎng)絡(luò)帶寬的變化。如下圖所示,博主 Tsahi Levent-Levi 在其博文[2]中,用一張比較形象圖描繪了測試過程中的碼率變化。
圖片源自 Tsahi Levent-Levi 的博客
結(jié)果是在帶寬受到人為限制后,WebRTC 的視頻通話用了 20 秒完全調(diào)整到了合適的碼率,而 Zoom 則用了 156 秒。
相對于與這個(gè)對比結(jié)果,我們更關(guān)心的是,這個(gè)方法對 WebRTC 開發(fā)者有多大參考意義呢?WebRTC 開發(fā)者參照這個(gè)方法,是否能準(zhǔn)確地測試出自己與他人應(yīng)用之間的差距呢?
答案是“否”,這個(gè)方法并不嚴(yán)謹(jǐn)。
以聲網(wǎng)的經(jīng)驗(yàn)來講,上下行同時(shí)限制相同帶寬門限的測試,并非常用的質(zhì)量測試方式。通常會(huì)單向限制上行,或者限制下行。但是從測試本身來說,是公平的。相信 Jitsi 并不會(huì)專門針對這個(gè)場景進(jìn)行調(diào)試后給出這樣的對比結(jié)果,應(yīng)該是 Zoom 在這個(gè)場景下有弱點(diǎn)被抓住了。
從通信架構(gòu)角度來看,Zoom 采用的是 MCU/SFU 的服務(wù)器接入通信方式,使用分段式的帶寬自適應(yīng)策略。而 Jitsi 的 1 對 1 通信,相信是沿用了 WebRTC 的端到端反饋。所以,兩者是不同的。全鏈路反饋在這個(gè)場景中有一定優(yōu)勢,鏈路上的瓶頸可以快速反應(yīng)到發(fā)送端,從而快速自適應(yīng)。而分段式策略,就要分別估算上行和下行帶寬,依賴于服務(wù)器的投遞決策機(jī)制,策略配置是一個(gè) QoE 的難點(diǎn)。
Tsahi Levent-Levi 也在博客中表示,通過人為工具干預(yù)網(wǎng)絡(luò)傳輸?shù)姆绞讲⒉粔蛲耆珡?fù)現(xiàn)真實(shí)的用戶場景。但我們可以通過工具來盡可能的接近用戶的真實(shí)場景。
真實(shí)用戶場景與弱網(wǎng)環(huán)境
什么是真實(shí)的用戶場景呢?一個(gè)人晚上在家通過 Wi-Fi 上網(wǎng),在線電影播放基本流暢,可一旦在晚間用網(wǎng)高峰期打視頻電話就畫面糊,這時(shí)不僅可能帶寬受限了,還可能有較高的丟包率。
與有線網(wǎng)絡(luò)通信相比,無線網(wǎng)絡(luò)通信受環(huán)境影響會(huì)更大,比如高層建筑、用戶的移動(dòng)、環(huán)境噪音、封閉的環(huán)境等,網(wǎng)絡(luò)服務(wù)質(zhì)量相對不穩(wěn)定,導(dǎo)致用戶經(jīng)常在弱網(wǎng)環(huán)境下通信。例如,在車庫的視頻通話通常都不如在室外的質(zhì)量。
除了受環(huán)境影響外,網(wǎng)絡(luò)覆蓋、過載控制、鄰區(qū)漏配等,也會(huì)造成呼叫失敗、服務(wù)質(zhì)量下降。這些真實(shí)的用戶場景。
Jitsi 所做的就是模擬弱網(wǎng)環(huán)境的測試。一般這種測試是靠修改帶寬、丟包、抖動(dòng)參數(shù)來進(jìn)行模擬。從數(shù)據(jù)角度講,不同的應(yīng)用對弱網(wǎng)的定義是不同的,要對各網(wǎng)絡(luò)類型最低速率、業(yè)務(wù)場景做綜合考慮。以移動(dòng)場景為例,一般 2G,速率較低的 3G,弱信號的 Wi-Fi 都算是弱網(wǎng),需要被納入到弱網(wǎng)測試場景中。
弱網(wǎng)模擬測試的正確姿勢
其實(shí),這次事件也揭示了一個(gè)很普遍存在問題,很多剛接觸 WebRTC 的獨(dú)立開發(fā)者,可能并不了解如何模擬弱網(wǎng)場景。我們來分享一些聲網(wǎng)Agora音視頻實(shí)驗(yàn)室的經(jīng)驗(yàn),推薦 3 個(gè) WebRTC 開發(fā)者們都可以使用的弱網(wǎng)環(huán)境模擬測試工具。
下面詳細(xì)說一下每個(gè)工具的搭建、使用方法,以及三者之間優(yōu)缺點(diǎn)對比:
Linux Traffic Control(TC)
Linux 內(nèi)核內(nèi)置了一個(gè) Traffic Control 框架,能夠?qū)崿F(xiàn)流量限速、流量整形、策略應(yīng)用,可以注入延時(shí)故障、丟包故障、包重復(fù)故障、亂序故障,以及模擬網(wǎng)絡(luò)閃斷等情況。TC 對硬件、系統(tǒng)還有一些要求:
硬件要求
PC - 建議配置不低于 CPU i3,4G 內(nèi)存,64G 硬盤
雙網(wǎng)卡 - 除原有板載網(wǎng)卡外, 額外需要一塊 pci-e 網(wǎng)卡(例如 intel 82574L)
路由器 - 支持橋接模式
網(wǎng)線 - 若干
系統(tǒng)要求
需要 Fedora、OpenSuse、Gentoo、Debian、Mandriva 或 Ubuntu,如果Linux內(nèi)核版本大于 2.6,則已內(nèi)置 TC。
系統(tǒng)模塊
Ubuntu/Debian 系統(tǒng)下需要 iproute2
Fedora/RHEL 系統(tǒng)下需要 iproute-tc
iptables
Linux kernel module : sch_netem
同時(shí),軟件方面還需要安裝 dhcp server。具體安裝方法,請參考 Ubuntu 官方文檔[3]。
開始部署
- NIC-0 通過網(wǎng)線連接外網(wǎng), 假設(shè)對應(yīng) Net device eth0
- NIC-1 通過網(wǎng)線連接路由器 WAN 口, 假設(shè)對應(yīng) Net device eth1
- 路由器: 打開橋接模式, 關(guān)閉 DHCP 服務(wù)
PC 端輸入命令行:
至此,你已經(jīng)完成了部署。
TC 的使用方法
做弱網(wǎng)測試基本是按照以下四個(gè)步驟:
設(shè)備連接 Wi-Fi 熱點(diǎn)成功獲取 IP 地址,假設(shè)為:192.168.3.101。
打開 Linux terminal,輸入 TC 命令為發(fā)送端 IP 為 192.168.3.101 的設(shè)備添加網(wǎng)損。
此時(shí)手機(jī)即在弱網(wǎng)環(huán)境下運(yùn)行。
測試完成后,輸入 TC 命令取消弱網(wǎng)。
例如,你要是想限制 IP 地址為 192.168.3.101 的設(shè)備上行丟包 5%,那么需要運(yùn)行如下命令:
可以說 TC 框架可以實(shí)現(xiàn)很多場景,但前提是需要開發(fā)者們學(xué)會(huì)使用 TC 命令行。如果你想了解更多的 TC 命令,可以學(xué)習(xí)一下官方文檔[4]。
Augmented Traffic Control(ATC)
ATC 其實(shí)是 Facebook 在 2015 年開源的一套網(wǎng)絡(luò)測試工具。ATC 是基于 TC 的封裝。
在部署好 ATC 弱網(wǎng)控制機(jī)后,在手機(jī)上通過 Web 界面就可以隨時(shí)切換不同的網(wǎng)絡(luò)環(huán)境。多個(gè)手機(jī)可以連接到同一個(gè) Wi-Fi ,復(fù)用同一臺(tái)弱網(wǎng)控制機(jī),且多設(shè)備之間模擬的網(wǎng)絡(luò)環(huán)境互不影響。也就是說,部署好這個(gè)測試工具后,團(tuán)隊(duì)里的任何人都可以通過 Web 自行測試,且互不干擾。
ATC 的部署方法相對復(fù)雜,但只要根據(jù)官方文檔[5],就可以順利完成搭建。按照官方文檔完成搭建之后,大家還需要通過以下幾行命令配置 HOST 地址,然后就可以啟動(dòng)運(yùn)行了。
使用方法
- 設(shè)備接入對應(yīng) Wi-Fi
- 打開 http://192.168.3.1:8000 (假設(shè) eth1 IP地址為:192.168.3.1)
- 輸入對應(yīng)弱網(wǎng)參數(shù)后,點(diǎn)擊按鈕 [Update Shaping] 生效,該弱網(wǎng)僅對本機(jī)生效
測試完成后,點(diǎn)擊按鈕 [Turn Off] 清除弱網(wǎng)設(shè)置。
Network Link Conditioner(NLC)
可能有些 iOS 開發(fā)者已經(jīng)認(rèn)出來了。NLC 是蘋果官方提供的網(wǎng)絡(luò)模擬工具,支持安裝在 macOS 和 iOS 上。
macOS 端安裝
打開 Xcode,選擇 Xcode -> Open Developer Tool -> More Develop Tools。
用蘋果賬號登錄網(wǎng)站,搜索 Additional Tools for Xcode,下載 Xcode 對應(yīng)版本的 Additional Tools。
打開下載的文件,在 Hardware 文件夾中雙擊 Network Link Conditioner 安裝。 安裝完成后,工具會(huì)在系統(tǒng)設(shè)置中的最后一排出現(xiàn)。
iOS 端安裝
通過打開“開發(fā)者選項(xiàng)”就可以使用 Network Link Conditioner 功能。
數(shù)據(jù)線連接手機(jī)到 Mac 上,Xcode -> Windows -> Devices -> 選中當(dāng)前手機(jī)設(shè)備,右鍵彈出
菜單 -> 選擇Show Provisioning Profiles… 會(huì)彈出一個(gè)證書列表窗口
如果手機(jī)已經(jīng)安裝了必要的開發(fā)者證書,直接點(diǎn)擊窗口中的 done 按鈕即可。否則需要點(diǎn)擊左下角的 + 號,把從網(wǎng)上下載下來的證書導(dǎo)入進(jìn)去, 點(diǎn)擊 done 按鈕關(guān)閉窗口。
此時(shí)手機(jī)設(shè)置中就多了一個(gè)開發(fā)者選項(xiàng),進(jìn)入開發(fā)者選項(xiàng)可以看到 Network Link Conditioner 選項(xiàng)。
使用方法
NLC 的使用方法就簡單多了,不需要用命令行。如果 NLC 中的配置不滿足需求的話,可以手動(dòng)添加更多的配置。在 Mac 端和 iOS 上,按照以下操作即可。
Mac 端
iOS 端
需要注意的是 interface 設(shè)置,當(dāng) iOS 通過共享 Wi-Fi 熱點(diǎn)的方式作為接入設(shè)備的弱網(wǎng)控制機(jī)時(shí),需要將 interface 設(shè)置為 Cellular。
對比與小結(jié)
相對來講,TC 的參數(shù)最為豐富,可以控制更多細(xì)節(jié),能模擬出多種不同的網(wǎng)絡(luò)情況,但操作太復(fù)雜,需要開發(fā)者熟悉 TC 命令及網(wǎng)絡(luò)模型。NLC 最簡單易操作,參數(shù)配置可以滿足普通開發(fā)需求。
WebRTC 1.0 的重點(diǎn)是提供給開發(fā)者更多對媒體、數(shù)據(jù)通道的控制。而根據(jù)此前的提案[6]顯示,下一版本的 WebRTC 將有可能使數(shù)據(jù)處理脫離主線程。使用 RTCDataChannels 傳輸數(shù)據(jù),相比使用 WebSocket 會(huì)有更好的擁塞控制。
根據(jù) WebRTCHacks 博主 Philipp Hancke 的分析[7],Zoom 的 Web Client 并沒有使用 WebRTC,客戶端用 WebSocket 進(jìn)行媒體傳輸,該方法類似于 WebRTC 中的 Turn/TCP。盡管有利于穿越防火墻,但在進(jìn)行實(shí)時(shí)通信時(shí),如果出現(xiàn)丟包,就會(huì)進(jìn)行重傳,最終導(dǎo)致積累延時(shí)。僅從這個(gè)角度看,下一個(gè)版本的 WebRTC 的方案更優(yōu)于 Zoom。
我們在上文中也曾提到,WebRTC 服務(wù)器的策略配置開發(fā)是 QoE 的難點(diǎn)。所以,多人通信的質(zhì)量不佳,是原生 WebRTC 應(yīng)用最常被人詬病的問題。其實(shí),聲網(wǎng)的 Agora Web SDK 也是基于 WebRTC 開發(fā)而來的,并且基于原生 WebRTC 進(jìn)行了多方面的優(yōu)化。聲網(wǎng) Agora Web SDK 始終聚焦于通信質(zhì)量的提升,優(yōu)化至現(xiàn)在的版本,已經(jīng)可支持17人的視頻通話。我們針對 WebRTC 網(wǎng)關(guān)進(jìn)行了多層面的優(yōu)化,比如傳輸質(zhì)量保障,對原生 WebRTC QoS 調(diào)優(yōu),針對場景差異做了不同的優(yōu)化策略。
我們提供的是全球化的服務(wù),覆蓋了包括視頻會(huì)議、在線醫(yī)療、在線教育、社交直播、社交游戲音視頻、金融、IoT 等多種實(shí)時(shí)音頻、視頻通信場景。目前,Agora Web SDK 已經(jīng)是全球商用服務(wù)中規(guī)模最大的基于 WebRTC 的實(shí)時(shí)通信 SDK。很多情況下 WebRTC 不會(huì)被考慮作為大頻道解決方案。而 Agora Web SDK 現(xiàn)在已經(jīng)支持百萬級別并發(fā)的大頻道通話。
參考資源
- WebRTC vs. Zoom – A Simple Congestion Test https://jitsi.org/news/a-simple-congestion-test-for-zoom/
- WebRTC vs Zoom. Who has Better Video Quality? https://bloggeek.me/webrtc-vs-zoom-video-quality/
- Ubuntu 官方文檔:DHCP server https://help.ubuntu.com/community/isc-dhcp-server
- TC 命令的使用 http://tldp.org/HOWTO/Traffic-Control-HOWTO/index.html
- Augmented Traffic Control: A tool to simulate network conditions https://code.fb.com/production-engineering/augmented-traffic-control-a-tool-to-simulate-network-conditions/
- WebRTC NV proposal https://www.w3.org/2011/04/webrtc/wiki/images/5/5c/WebRTCWG-2018-06-19.pdf
- How Zoom’s web client avoids using WebRTC https://webrtchacks.com/zoom-avoids-using-webrtc/