WebRTC通话质量调优:三个弱网模拟测试工具的使用与对比

作为一个使用 WebRTC 独立开发者或团队,怎样才能知道自己 App 的通话质量已经“达标”了呢?如何进行合理的弱网模拟测试?介绍给开发者们三个开源工具的部署、使用方法,及其各自优缺点。

如果你是长期关注 WebRTC 的资深开发者或技术爱好者,你可能留意到了,Jitsi 曾在其官方博客[1]上发布了一个 WebRTC 与 Zoom Web 客户端的视频通话对比测试。测试结果显示,WebRTC 的视频通话质量比 Zoom 还要好。一石激起千层浪,不少博主发表了自己的看法。

看似是在挑事,但 Jitsi 出此一举完全事出有因。

Jitsi 是一个开源项目,可帮开发者在 Web 、Windows、Linux、Mac OS X、Android 平台上实现实时的语音、视频通话应用。有很多独立开发者在基于这套代码开发自己的视频通话应用。这一切,都是建立于 WebRTC 的基础之上实现的。然而, Jitsi 却看到作为视频会议服务提供商的 Zoom 不但从 2015 年开始就在一些地方一再声称自己并没有使用 WebRTC,甚至不断表示“WebRTC 是一种能力非常有限的解决方案”:

图:源自 Jitsi 官方博客

Jitsi 如何测试 WebRTC 弱网传输呢?

他们在同一个 Wi-Fi 环境下,用同样的一台 Mac ,做了两次测试,分别用 WebRTC 和 Zoom 进行一对一视频通话。在两组通话的最初 10 秒,只是进行正常通话,在 10 秒之后,开始增加网损,同时限制上行与下行带宽至 500kbps。这时测量两个方案各自需要多长时间来调整,使正在进行的视频通话稳定适应目前网络带宽的变化。如下图所示,博主 Tsahi Levent-Levi 在其博文[2]中,用一张比较形象图描绘了测试过程中的码率变化。

图片源自 Tsahi Levent-Levi 的博客

结果是在带宽受到人为限制后,WebRTC 的视频通话用了 20 秒完全调整到了合适的码率,而 Zoom 则用了 156 秒。

相对于与这个对比结果,我们更关心的是,这个方法对 WebRTC 开发者有多大参考意义呢?WebRTC 开发者参照这个方法,是否能准确地测试出自己与他人应用之间的差距呢?

答案是“否”,这个方法并不严谨。

以声网的经验来讲,上下行同时限制相同带宽门限的测试,并非常用的质量测试方式。通常会单向限制上行,或者限制下行。但是从测试本身来说,是公平的。相信 Jitsi 并不会专门针对这个场景进行调试后给出这样的对比结果,应该是 Zoom 在这个场景下有弱点被抓住了。

从通信架构角度来看,Zoom 采用的是 MCU/SFU 的服务器接入通信方式,使用分段式的带宽自适应策略。而 Jitsi 的 1 对 1 通信,相信是沿用了 WebRTC 的端到端反馈。所以,两者是不同的。全链路反馈在这个场景中有一定优势,链路上的瓶颈可以快速反应到发送端,从而快速自适应。而分段式策略,就要分别估算上行和下行带宽,依赖于服务器的投递决策机制,策略配置是一个 QoE 的难点。

Tsahi Levent-Levi 也在博客中表示,通过人为工具干预网络传输的方式并不够完全复现真实的用户场景。但我们可以通过工具来尽可能的接近用户的真实场景。

真实用户场景与弱网环境

什么是真实的用户场景呢?一个人晚上在家通过 Wi-Fi 上网,在线电影播放基本流畅,可一旦在晚间用网高峰期打视频电话就画面糊,这时不仅可能带宽受限了,还可能有较高的丢包率。

与有线网络通信相比,无线网络通信受环境影响会更大,比如高层建筑、用户的移动、环境噪音、封闭的环境等,网络服务质量相对不稳定,导致用户经常在弱网环境下通信。例如,在车库的视频通话通常都不如在室外的质量。

除了受环境影响外,网络覆盖、过载控制、邻区漏配等,也会造成呼叫失败、服务质量下降。这些真实的用户场景。

Jitsi 所做的就是模拟弱网环境的测试。一般这种测试是靠修改带宽、丢包、抖动参数来进行模拟。从数据角度讲,不同的应用对弱网的定义是不同的,要对各网络类型最低速率、业务场景做综合考虑。以移动场景为例,一般 2G,速率较低的 3G,弱信号的 Wi-Fi 都算是弱网,需要被纳入到弱网测试场景中。

弱网模拟测试的正确姿势

其实,这次事件也揭示了一个很普遍存在问题,很多刚接触 WebRTC 的独立开发者,可能并不了解如何模拟弱网场景。我们来分享一些声网Agora音视频实验室的经验,推荐 3 个 WebRTC 开发者们都可以使用的弱网环境模拟测试工具。

下面详细说一下每个工具的搭建、使用方法,以及三者之间优缺点对比:

Linux Traffic Control(TC)

Linux 内核内置了一个 Traffic Control 框架,能够实现流量限速、流量整形、策略应用,可以注入延时故障、丢包故障、包重复故障、乱序故障,以及模拟网络闪断等情况。TC 对硬件、系统还有一些要求:

硬件要求

  • PC - 建议配置不低于 CPU i3,4G 内存,64G 硬盘

  • 双网卡 - 除原有板载网卡外, 额外需要一块 pci-e 网卡(例如 intel 82574L)

  • 路由器 - 支持桥接模式

  • 网线 - 若干

系统要求

  • 需要 Fedora、OpenSuse、Gentoo、Debian、Mandriva 或 Ubuntu,如果Linux内核版本大于 2.6,则已内置 TC。

系统模块

  • Ubuntu/Debian 系统下需要 iproute2

  • Fedora/RHEL 系统下需要 iproute-tc

  • iptables

  • Linux kernel module : sch_netem

同时,软件方面还需要安装 dhcp server。具体安装方法,请参考 Ubuntu 官方文档[3]。

开始部署

NIC-0 通过网线连接外网, 假设对应 Net device eth0

NIC-1 通过网线连接路由器 WAN 口, 假设对应 Net device eth1

路由器: 打开桥接模式, 关闭 DHCP 服务

PC 端输入命令行:

vi /etc/default/isc-dhcp-server

添加:

INTERFACESv4="eth1"

重启服务:

sudo /etc/init.d/isc-dhcp-server restart

重启后运行以下命令:

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

至此,你已经完成了部署。

TC 的使用方法

做弱网测试基本是按照以下四个步骤:

设备连接 Wi-Fi 热点成功获取 IP 地址,假设为:192.168.3.101。

打开 Linux terminal,输入 TC 命令为发送端 IP 为 192.168.3.101 的设备添加网损。

此时手机即在弱网环境下运行。

测试完成后,输入 TC 命令取消弱网。

例如,你要是想限制 IP 地址为 192.168.3.101 的设备上行丢包 5%,那么需要运行如下命令:

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 的设备下行丢包 20%,需要运行如下命令:

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 框架可以实现很多场景,但前提是需要开发者们学会使用 TC 命令行。如果你想了解更多的 TC 命令,可以学习一下官方文档[4]。

Augmented Traffic Control(ATC)

ATC 其实是 Facebook 在 2015 年开源的一套网络测试工具。ATC 是基于 TC 的封装。

在部署好 ATC 弱网控制机后,在手机上通过 Web 界面就可以随时切换不同的网络环境。多个手机可以连接到同一个 Wi-Fi ,复用同一台弱网控制机,且多设备之间模拟的网络环境互不影响。也就是说,部署好这个测试工具后,团队里的任何人都可以通过 Web 自行测试,且互不干扰。

ATC 的部署方法相对复杂,但只要根据官方文档[5],就可以顺利完成搭建。按照官方文档完成搭建之后,大家还需要通过以下几行命令配置 HOST 地址,然后就可以启动运行了。

打开 Setting:

vi atcui/atcui/settings

添加 HOST 地址 :

ALLOWED_HOSTS = ['*']

启动命令:

atcd --atcd-wan eth0 --atcd-lan eth1

使用方法

设备接入对应 Wi-Fi

打开 http://192.168.3.1:8000 (假设 eth1 IP地址为:192.168.3.1)

输入对应弱网参数后,点击按钮 [Update Shaping] 生效,该弱网仅对本机生效

测试完成后,点击按钮 [Turn Off] 清除弱网设置。

Network Link Conditioner(NLC)

可能有些 iOS 开发者已经认出来了。NLC 是苹果官方提供的网络模拟工具,支持安装在 macOS 和 iOS 上。

macOS 端安装

打开 Xcode,选择 Xcode -> Open Developer Tool -> More Develop Tools。

用苹果账号登录网站,搜索 Additional Tools for Xcode,下载 Xcode 对应版本的 Additional Tools。

打开下载的文件,在 Hardware 文件夹中双击 Network Link Conditioner 安装。 安装完成后,工具会在系统设置中的最后一排出现。

iOS 端安装

通过打开“开发者选项”就可以使用 Network Link Conditioner 功能。

数据线连接手机到 Mac 上,Xcode -> Windows -> Devices -> 选中当前手机设备,右键弹出

菜单 -> 选择Show Provisioning Profiles... 会弹出一个证书列表窗口

如果手机已经安装了必要的开发者证书,直接点击窗口中的 done 按钮即可。否则需要点击左下角的 + 号,把从网上下载下来的证书导入进去, 点击 done 按钮关闭窗口。

此时手机设置中就多了一个开发者选项,进入开发者选项可以看到 Network Link Conditioner 选项。

使用方法

NLC 的使用方法就简单多了,不需要用命令行。如果 NLC 中的配置不满足需求的话,可以手动添加更多的配置。在 Mac 端和 iOS 上,按照以下操作即可。

Mac 端

iOS 端

需要注意的是 interface 设置,当 iOS 通过共享 Wi-Fi 热点的方式作为接入设备的弱网控制机时,需要将 interface 设置为 Cellular。

对比与小结

相对来讲,TC 的参数最为丰富,可以控制更多细节,能模拟出多种不同的网络情况,但操作太复杂,需要开发者熟悉 TC 命令及网络模型。NLC 最简单易操作,参数配置可以满足普通开发需求。

WebRTC 1.0 的重点是提供给开发者更多对媒体、数据通道的控制。而根据此前的提案[6]显示,下一版本的 WebRTC 将有可能使数据处理脱离主线程。使用 RTCDataChannels 传输数据,相比使用 WebSocket 会有更好的拥塞控制。

根据 WebRTCHacks 博主 Philipp Hancke 的分析[7],Zoom 的 Web Client 并没有使用 WebRTC,客户端用 WebSocket 进行媒体传输,该方法类似于 WebRTC 中的 Turn/TCP。尽管有利于穿越防火墙,但在进行实时通信时,如果出现丢包,就会进行重传,最终导致积累延时。仅从这个角度看,下一个版本的 WebRTC 的方案更优于 Zoom。

我们在上文中也曾提到,WebRTC 服务器的策略配置开发是 QoE 的难点。所以,多人通信的质量不佳,是原生 WebRTC 应用最常被人诟病的问题。其实,声网的 Agora Web SDK 也是基于 WebRTC 开发而来的,并且基于原生 WebRTC 进行了多方面的优化。声网 Agora Web SDK 始终聚焦于通信质量的提升,优化至现在的版本,已经可支持17人的视频通话。我们针对 WebRTC 网关进行了多层面的优化,比如传输质量保障,对原生 WebRTC QoS 调优,针对场景差异做了不同的优化策略。

我们提供的是全球化的服务,覆盖了包括视频会议、在线医疗、在线教育、社交直播、社交游戏音视频、金融、IoT 等多种实时音频、视频通信场景。目前,Agora Web SDK 已经是全球商用服务中规模最大的基于 WebRTC 的实时通信 SDK。很多情况下 WebRTC 不会被考虑作为大频道解决方案。而 Agora Web SDK 现在已经支持百万级别并发的大频道通话。

参考资源

[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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335