【腾讯优测干货】微信测试工程师手把手教你作弱网络模拟测试

小优有话说:vue

app研发不一样于实验室里作研究,哪里有“理想环境”。
理想里,用户用着性能卓越的手机,连着畅通无阻的wifi网络。
“哇塞!这个app好用到飞起!”
现实是,他们可能正用着你闻所未闻的机型,穿梭于地铁、公交、火车、乡间、大山..... 信号“若隐若现,扑朔迷离”
“我去!又crash了!”
“唉,怎么又连不上网了,其余app好好的啊。”
这大概就是理想与现实之间的差距吧。linux

机型碎片化的问题,腾讯优测已经帮你解决了(广告就是这么硬)。
弱网络引起的crash,anr,丢包等各类问题,除了亲身到各个网络崩溃的地方测试,祈求问题重现外,还有弱网络模拟测试工具能够助你一臂之力哦!
微信测试团队的开发工程师亲身实践,为你详解弱网络模拟测试工具的那些事儿。web

*浏览器

-----------我是正文分割线-----------微信

特约供稿人:微信测试团队 CoderZh网络

*app

背景

移动互联网时代,用户会在各类网络情况下使用咱们的APP。他们使用3G或4G 网络,甚至还在用2G,他们也许正在商场闲逛,也许正在地铁奔波,飞速的汽车穿过一个又一个基站,簇拥的人群挤在演唱会现场。
在弱网络下,你的APP表现还好吗?你的手游还能玩吗?
因此,咱们须要一款可以模拟弱网络的软件,用来测试咱们的APP在弱网络下的表现。框架

分析

市面上已经有一些弱网络模拟工具,好比微软的Network Emulator for Windows Toolkit(NEWT),Facebook的Augmented Traffic Control(ATC),以及WANem。工具

NEWT

NEWT是基于Windows的,经过图形化的界面,能够对该机器的网络参数进行设置,且模型较为丰富。性能

参数设置:

优势:
使用起来比较简单,网络模拟的参数也很丰富,模拟的准确性也比较高。

缺点:
基于 Windows。想在手机上测试时,需在 PC 上使用 USB 无线网卡创建 WIFI 热点,使用方式为独占式,且必须在 PC 上进行控制,不适用于长期开放热点供多人使用。

WANem

WANem 的实现原理基于 iptables 和 tc。它推出的年份较早,能够看出并非针对如今的移动互联网设计的。他提供了一个可安装的 Linux 系统镜像文件,安装后可在一个网页里对该机器的网络流量进行控制。其余被测机器经过修改路由表,将网络流量引向装好 WANem 的机器从而实现对网络的模拟。

设置页面:

优势:
提供了安装镜像,解决了安装配置复杂的问题。

缺点:
需手工配置路由表,用户体验很是不友好,对移动端经过 WIFI 接入支持很差。

ATC

ATC 是 Facebook 开源的弱网络模拟工具,实现原理基于 iptables 和 tc。

服务启动后,经过手机能够对网络参数进行设置:

6.jpg

优势:
可多人使用,在手机端对网络参数进行设置且互不影响。

缺点:
部署起来不太方便,在 Linux 上使用 USB 无线网卡创建 WIFI 热点也是很头疼的事。固然这些都不算什么,关键是实际体验 ATC 时出现了网络模拟很是不许确的状况,好比基本的上传下载的速度控制都极为不许。在 Github 上关于这点的 Issue 很是多,最后给出的解决方案是启动 atcd 时加 --atcd-dont-drop-packets 参数,即便这样也给人留下这丫怎么那么不许的印象。

ATC 的 Web 页面在某些手机的浏览器里显示不出来,这么明显的 BUG,不知道他们如今修好了没。

网络模拟原理

NEWT 在 Windows 里进行网络模拟的原理咱们不得而知,可是像 ATC 和 WANem 基于 Linux 的 iptables 和 tc 的实现原理咱们却是能够一窥究竟。

网卡

首先,有个基本的前提必须清楚,即咱们只能对网卡的出口流量(egress)进行精确控制。这也比较好理解,好比咱们频繁的往互联网发送数据,路由器能够轻易的控制数据往外发的速度。但若是别人频繁发送数据给你,发送速度的控制权不在你,数据来了路由器就会被动的接收,因此控制起来就会更困难。

那是否是无法对入口流量(ingress,能够理解为下载的流量)进行控制呢?其实不是的。咱们只须要有两个网卡,让他们互为出口流量便可。

其中一个网卡(eth0)接入互联网,另外一个网卡(eth1)接入内网。这对应到路由器的 WAN 口和 LAN 口上。

假设在 PC 上只有一个物理网卡的状况下,也能够虚拟出一个网卡,从而实现对出口和入口流量的控制。好比我须要建立一个名为 wtc 的虚拟网卡:

若是是正式使用,建议仍是直接使用路由器的物理网卡。

一般,内网 eth1 经过 NAT 的方式将流量引入 eth0 进行上网。设置 NAT 的方式很简单,首先开启内核中的 IP 转发:


为了永久生效,修改 [/etc/sysctl.conf]文件,修改下行内容:

而后执行该命令使其生效:

配置 NAT 的方法:(假设 192.168.1.0/24 是你的内网 IP 段)

局域网内的机器只要将网关设置成该台机器(192.168.1.1)便可经过 NAT 上网。

经过 vagrant,能够很容易的在一台机器上模拟出上述的网络结构用于本地调试。

流量控制

什么是流量控制?流量控制就是在路由器上经过一系列队列,对数据包进行排序以控制它们的发送顺序,并经过一系列策略控制收到的和发送的数据包是否应该被丢弃,同时还要对数据包的发送速率进行控制。

Linux 下的流量控制能够经过 tc 命令来实现的。

qdisc

首先说说调度器 qdisc,也被称为排队规则。它提供了对数据包不一样的调度策略,好比最多见的 FIFO(先入先出队列)、SFQ(随机公平队列)、TBF(令牌桶),以及咱们接下来须要使用的 HTB(分层令牌桶)。

HTB 的一个重要特性就是租借模型。当子分类的流量超过了 rate 时,它们就会向父分类借用令牌,直到子分类借到的令牌数量知足能让其达到 ceil 指定的速度为止,与此同时,它会暂缓发送数据包,直到有了足够多的令牌(token 或 ctoken)。

简单理解:经过 qdisc 的 HTB 模型能够准确的对网络流量的速度进行控制。

class

qdisc 提供可分类和不可分类两种调度器。可分类的意思是,是在某个 qdisc 调度器之下,可否再分出多个子调度器。理论上,类能无限扩展,一个类能够仅包含一个排队规则,也能够包含多个各自排队规则的子类。一个类之下能够包含多个分类的排队规则。这就给 Linux 流量控制系统予以了极大的可扩展性和灵活性。

简单理解:经过 class 能够将调度器分红多个子类。

filter

过滤器是 Linux 流量控制系统中最复杂的对象,它是链接各个流量控制核心组件的纽带。过滤器最简单和最多见的用法就是对数据包进行分类。Linux 容许用户使用一个或多个过滤器将出站数据包分类并送到不一样的出站队列上。

简单理解:既然前面能够分不一样的 class,那流量具体要去到哪一个 class,就要经过 filter 来控制了。

网络模拟

首先,qdisc 咱们选用 HTB 模型,由于它能够分类,并且流量控制的比较精确。接着是 class,因为咱们但愿流量控制是针对具体某个 IP 的,因此每一个 class 对应的是不一样的用户。过滤(filter)的规则是用户的 IP 地址。

那么问题来了,如何根据用户的 IP 对流量进行分类呢?这就须要用到 iptables 的 mark 功能,经过 --set-xmark 给不一样 IP 的数据打上标记,在 tc 的 filter 里能够识别这些标记,从而进入不一样的分类。

不一样 IP 用户的流量进入到不一样分类以后,就能够针对具体的用户进行流量控制了。经过 htb 模型能够对流量进行限速,那丢包、延迟、乱序、重包等等,要怎样模拟呢?

tc 里提供了一个 netem 模块,能够对延迟(delay)、丢包(loss)、重包(duplication)、乱序(re-ordering)等进行控制,好比,给 eth0 网卡设置 100ms 的延迟:

详尽的 netem 用法请参考:
http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

基于 IP 的网络模拟实现以下:

若是手工执行命令的话,大概是这样的:

实践

有了以上理论基础,熟读几遍 iptables 和 tc 的文档,实现一个基于 IP,经过手机直接设置网络参数的弱网络模拟工具就不是那么难了。

我实现了一个版本:WTC(We Traffic Control),是 ATC 更加轻量级的实现,为了把它塞进路由器里,尽可能选用了体积小轻量级的框架,好比:web.py、vuejs。全部文件加起来只有几百K,已经成功在路由器(刷 openwrt)上部署。

演示:

为了在 openwrt 上方便部署,我制做了一个安装好 WTC 依赖环境的 ROM(基于最新的 openwrt 15.05.1),想要使用WTC,只须要如下几步:

申请一个支持刷 openwrt 的路由器。
刷配好 WTC 环境的 ROM。
作必定手工配置。

而后手机连上该 WIFI 后直接访问:http://w.tc 就能够进行网络模拟了。

固然,你也能够在你的 openwrt 环境手工配置并跑起来:
(-wan 为外网网卡接口,默认为 eth0,-lan 为内网网卡接口,默认为 eth1)

推荐直接在路由器上搭配 lighttpd 部署, wsgi 方式运行使用 wsgi.py。

(小优注:原做者已将WTC的具体实现放置在腾讯内网,由于“你懂的”缘由不方便对外公开。稍后有可能会开源哦,感兴趣的同窗能够关注做者私人公众帐号hacker-thinking,私下交流。
或者,大牛们看过文章能够亲自动手实践一番哦!)

更多精彩内容欢迎关注,腾讯优测公众帐号:

腾讯优测

腾讯优测是专业的移动云测试平台,为应用、游戏,H5混合应用的研发团队提供产品质量检测与问题解决服务。不只在线上平台提供「全面兼容测试」、「缺陷分析」、「云手机」等多种质量检测工具,同时在线下为VIP客户配备专家团队,提供定制化综合测试解决方案。真机实验室配备上千款手机,覆盖亿级用户,7*24小时在线运行,为各种测试工具提供支持。

相关文章
相关标签/搜索