作為一個(gè)使用 WebRTC 獨(dú)立開發(fā)者或團(tuán)隊(duì)鞋屈,怎樣才能知道自己 App 的通話質(zhì)量已經(jīng)“達(dá)標(biāo)”了呢?如何進(jìn)行合理的弱網(wǎng)模擬測試故觅?介紹給開發(fā)者們?nèi)齻€(gè)開源工具的部署厂庇、使用方法,及其各自優(yōu)缺點(diǎn)输吏。
如果你是長期關(guān)注 WebRTC 的資深開發(fā)者或技術(shù)愛好者权旷,你可能留意到了,Jitsi 曾在其官方博客[1]上發(fā)布了一個(gè) WebRTC 與 Zoom Web 客戶端的視頻通話對比測試贯溅。測試結(jié)果顯示拄氯,WebRTC 的視頻通話質(zhì)量比 Zoom 還要好。一石激起千層浪它浅,不少博主發(fā)表了自己的看法译柏。
看似是在挑事,但 Jitsi 出此一舉完全事出有因姐霍。
Jitsi 是一個(gè)開源項(xiàng)目鄙麦,可幫開發(fā)者在 Web 典唇、Windows、Linux胯府、Mac OS X介衔、Android 平臺上實(shí)現(xiàn)實(shí)時(shí)的語音、視頻通話應(yīng)用骂因。有很多獨(dú)立開發(fā)者在基于這套代碼開發(fā)自己的視頻通話應(yīng)用炎咖。這一切,都是建立于 WebRTC 的基礎(chǔ)之上實(shí)現(xiàn)的寒波。然而塘装, Jitsi 卻看到作為視頻會議服務(wù)提供商的 Zoom 不但從 2015 年開始就在一些地方一再聲稱自己并沒有使用 WebRTC,甚至不斷表示“WebRTC 是一種能力非常有限的解決方案”:
Jitsi 如何測試 WebRTC 弱網(wǎng)傳輸呢影所?
他們在同一個(gè) Wi-Fi 環(huán)境下,用同樣的一臺 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]中,用一張比較形象圖描繪了測試過程中的碼率變化愤估。
結(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ì)量測試方式壹若。通常會單向限制上行,或者限制下行。但是從測試本身來說店展,是公平的养篓。相信 Jitsi 并不會專門針對這個(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á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ū)漏配等铭乾,也會造成呼叫失敗剪廉、服務(wù)質(zhì)量下降。這些真實(shí)的用戶場景炕檩。
Jitsi 所做的就是模擬弱網(wǎng)環(huán)境的測試斗蒋。一般這種測試是靠修改帶寬、丟包笛质、抖動參數(shù)來進(jìn)行模擬泉沾。從數(shù)據(jù)角度講,不同的應(yīng)用對弱網(wǎng)的定義是不同的妇押,要對各網(wǎng)絡(luò)類型最低速率跷究、業(yè)務(wù)場景做綜合考慮今野。以移動場景為例机蔗,一般 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 端輸入命令行:
vi /etc/default/isc-dhcp-server
添加:
INTERFACESv4="eth1"
重啟服務(wù):
sudo /etc/init.d/isc-dhcp-server restart
重啟后運(yùn)行以下命令:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
modprobe ifb
ip link set ifb0 up
至此戳鹅,你已經(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)行如下命令:
sudo tc qdisc add dev ifb0 root handle 1: prio bands 3
sudo tc qdisc add dev eth1 ingress
sudo tc filter add dev eth1 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0
sudo tc qdisc add dev ifb0 parent 1:3 handle 30: netem loss 5 limit 1000
sudo tc filter add dev ifb0 protocol ip parent 1:0 prio 3 u32 match ip src 192.168.3.101 flowid 1:3
如果想要限制 IP 地址為 192.168.3.101 的設(shè)備下行丟包 20%,需要運(yùn)行如下命令:
sudo tc qdisc add dev eth1 root handle 1: prio bands 3
sudo tc qdisc add dev eth1 parent 1:3 handle 30: netem loss 20 limit 1000
sudo tc filter add dev eth1 protocol ip parent 1:0 prio 3 u32 match ip dst 192.168.3.101 flowid 1:3
可以說 TC 框架可以實(shí)現(xiàn)很多場景赞警,但前提是需要開發(fā)者們學(xué)會使用 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ù)用同一臺弱網(wǎng)控制機(jī)琼蚯,且多設(shè)備之間模擬的網(wǎng)絡(luò)環(huán)境互不影響境蜕。也就是說,部署好這個(gè)測試工具后凌停,團(tuán)隊(duì)里的任何人都可以通過 Web 自行測試粱年,且互不干擾。
ATC 的部署方法相對復(fù)雜罚拟,但只要根據(jù)官方文檔[5]台诗,就可以順利完成搭建完箩。按照官方文檔完成搭建之后,大家還需要通過以下幾行命令配置 HOST 地址拉队,然后就可以啟動運(yùn)行了弊知。
打開 Setting:
vi atcui/atcui/settings
添加 HOST 地址 :
ALLOWED_HOSTS = ['*']
啟動命令:
atcd --atcd-wan eth0 --atcd-lan eth1
使用方法
設(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 安裝丑念。 安裝完成后涡戳,工具會在系統(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... 會彈出一個(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 中的配置不滿足需求的話夜郁,可以手動添加更多的配置。在 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 會有更好的擁塞控制。
根據(jù) WebRTCHacks 博主 Philipp Hancke 的分析[7]列肢,Zoom 的 Web Client 并沒有使用 WebRTC恰画,客戶端用 WebSocket 進(jìn)行媒體傳輸,該方法類似于 WebRTC 中的 Turn/TCP瓷马。盡管有利于穿越防火墻拴还,但在進(jìn)行實(shí)時(shí)通信時(shí),如果出現(xiàn)丟包欧聘,就會進(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ù)走搁,覆蓋了包括視頻會議、在線醫(yī)療迈窟、在線教育私植、社交直播、社交游戲音視頻车酣、金融曲稼、IoT 等多種實(shí)時(shí)音頻、視頻通信場景湖员。目前贫悄,Agora Web SDK 已經(jīng)是全球商用服務(wù)中規(guī)模最大的基于 WebRTC 的實(shí)時(shí)通信 SDK。很多情況下 WebRTC 不會被考慮作為大頻道解決方案娘摔。而 Agora Web SDK 現(xiàn)在已經(jīng)支持百萬級別并發(fā)的大頻道通話窄坦。
參考資源
[1] WebRTC vs. Zoom – A Simple Congestion Test https://jitsi.org/news/a-simple-congestion-test-for-zoom/
[2] WebRTC vs Zoom. Who has Better Video Quality? https://bloggeek.me/webrtc-vs-zoom-video-quality/
[3] Ubuntu 官方文檔:DHCP server https://help.ubuntu.com/community/isc-dhcp-server
[4] TC 命令的使用 http://tldp.org/HOWTO/Traffic-Control-HOWTO/index.html
[5] Augmented Traffic Control: A tool to simulate network conditions https://code.fb.com/production-engineering/augmented-traffic-control-a-tool-to-simulate-network-conditions/
[6] WebRTC NV proposal https://www.w3.org/2011/04/webrtc/wiki/images/5/5c/WebRTCWG-2018-06-19.pdf
[7] How Zoom’s web client avoids using WebRTC https://webrtchacks.com/zoom-avoids-using-webrtc/