在测试中,对应用进行弱网测试是必须考虑的测试点。那我们怎么模拟弱网呢?今天小酋对常用的方法做了个总结。
clumsy(Windows)
clumsy 根据用户选择的 filter 来拦截指定的网络数据。在filter 中可以设定你所需的协议(tcp/udp)、IP、端口号,是接收还是发出的端口。你也可以通过简单的逻辑语句来进一步缩小范围。当clumsy被激活时,只有符合这些标准的网络数据会被进行处理,而你不需要的数据仍然会由系统正常传输。
可以模拟网络情况:
- 当被 filter 的网络数据包被拦截后,你可以选择clumsy提供的功能来有目的性的调整网络情况:
- 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况。
- 掉包(Drop),随机丢弃一些数据。
- 节流(Throttle),把一小段时间内的数据拦截下来后再在之后的同一时间一同发出去。
- 重发(Duplicate),随机复制一些数据并与其本身一同发送。
- 乱序(Out of order),打乱数据包发送的顺序。
- 篡改(Tamper),随机修改小部分的包裹内容。
具体使用介绍可参考:http://www.51ste.com/share/det-355.html
netem+tc(Linux)
netem 是Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。
tc是Linux系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制netem 的工作模式,也就是说如果想使用 netem,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有tc 。
①网络延迟
tc qdisc add dev eth0 rootnetem delay 100ms
该命令将eth0网卡的传输设置为延迟100毫秒发送。
②模拟更真实的情况,延迟值可能会有一定的波动性,可以使用以下命令来模拟
tc qdisc add dev eth0 root netem delay 100ms 10ms
该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送
③网络丢包
tc qdisc add dev eth0 root netem loss 10%
该命令将 eth0 网卡的传输设置为随机丢掉 10% 的数据包。
④数据包重复
tc qdisc add dev eth0 root netem duplicate 10%
该命令将 eth0 网卡的传输设置为随机产生 10% 的重复数据包。
⑤数据包损坏
tc qdisc add dev eth0 root netem corrupt 0.5%
该命令将 eth0 网卡的传输设置为随机产生 0.5% 的损坏的数据包。
⑥数据包乱序
tc qdisc change dev eth0 root netem delay 100ms reorder 25% 50%
该命令将 eth0 网卡的传输设置为:有 25% 的数据包(50%相关)会被立即发送,其他的延迟100毫秒。
⑦查看已经配置的网络条件
tc qdisc show dev eth0
如果需要删除已配置的条件,则将以上命令中的add更改为del即可。
360安全卫士(Windows)
如果仅仅模拟断网、限制上下行速度,在windows中只要安装有360完全卫士,即可以通过 功能大全->流量防火墙 针对程序进行网络限制。
Fiddler(Windows&Linux)
Fiddler已经预置提供了模拟Modem速度的选项,设置路径:
Rules->Performances->Simulate Modem Speeds
勾选该选项后,所有通过Fiddler代理的流量都会变得用56k modem上网一般。
直接模拟Modem速度实在是慢爆了,事实上就算是在很差信号的情况下,手机移动网络的速度都已经超过了56k 的Modem速度,所以采用默认的配置模拟出来的环境,并不一定符合需求,此时就需要对限速的参数进行调整。
Fiddler本身就提供了一个配置文件供调整这些参数,点击:Rules –> Customize Rules… 在编辑内容中找到“m_SimulateModem”标志位:
if (m_SimulateModem) {
// Delay sends by 300ms per KB uploaded.
oSession["request-trickle-delay"] = "300";
// Delay receives by 150ms per KB downloaded.
oSession["response-trickle-delay"] = "150"
}
该标志位控制着oSession的两个参数值的设置,当勾选了Simulate Modem Speeds时,request-trickle-delay与response-trickle-delay就会被设置,其中request-trickle-delay中的值代表每KB的数据上传时会被延时多少毫秒,response-trickle-delay则对应下载每KB的数据会被延时多少毫秒,如果本身网速已经相当快的话,这里设置的值就可以近似地推算出开启模拟后的上传和下载带宽了,比如默认设置下下载延时为150ms,上传延时为300ms,对应可以推算出大致的模拟带宽为:
上传带宽=(1*8/1000)/0.300≈0.053Mbps
下载带宽=(1*8/1000)/0.150≈0.027Mbps
可以进一步地扩展CustomRules.js里的逻辑,参照Jscript的文档可以在模拟恶劣环境中加入更多自定义的逻辑,这里实现了一个随机延时量设置,使得网络带宽不恒定为一个低速的值,而是会在一定范围内随机抖动:
static function randInt(min, max) {
return Math.round(Math.random()*(max-min)+min);
}
if (m_SimulateModem) {
// Delay sends by 300ms per KB uploaded.
oSession["request-trickle-delay"] = ""+randInt(1,50);
// Delay receives by 150ms per KB downloaded.
oSession["response-trickle-delay"] = ""+randInt(1,50);
}
通过进一步扩展CustionRules.js可以实现很多需要的恶劣环境模拟场景,如果场景较为复杂的话,也可以通过编写Fiddler的插件的方式,编写C#插件代码来进一步控制Fiddler的行为。
Charles(Windows)
设置路径:Proxy -> Throttle Settings...
可以针对指定请求或所有请求进行模拟