为您推荐:
精华内容
最热下载
问答
  • 【背景】弱网测试,属于健壮性测试的内容。随着国内移动端迅猛发展,大大增加用户碎片化使用移动端的概率。想象一下,用户在地铁里,巴士上,甚至是电梯,车库等场景使用APP,我们就需要针对这些场景的弱网环境下,...

    在这里插入图片描述
    【背景】弱网测试,属于健壮性测试的内容。随着国内移动端迅猛发展,大大增加用户碎片化使用移动端的概率。想象一下,用户在地铁里,巴士上,甚至是电梯,车库等场景使用APP,我们就需要针对这些场景的弱网环境下,验证出现丢包、延时软件的处理机制,避免因用户体验不友好造成用户的流失。
    1.用户体验APP使用过程中,弱网的高延迟和高丢包,在实时性要求非常高的场景,容易伤害用户体验
    2.非正常情况下,出现bug概率会增加在解决日常的支持需求中,经常会遇到一些用户反馈一些无法简单复现的bug,有很大一部分的bug是由于用户自身的网络环境波动,或者是本身网络环境就较为恶劣,而服务在面对这种恶劣的网络环境的健壮性不够,导致会出现一些意想不到的bug
    【原理】使用代理捕获网络信号进行环境部署来分析APP的延迟(加载)时间、内容,提出HTTP优化建议,让开发者能够在APP上线前提前预知app在较差网络环境下的表现,以便提前发现问题,进行有针对性优化。让APP在任何网络情况下,都能表现自如,出类拔萃核心流程 网络请求—》代理proxy—》进行目标操作(修改返回值&延迟&丢包等)—》返回给移动端(见下图)
    在这里插入图片描述

    【模拟方法】当前模拟恶劣网络环境主要可以通过以下这些手段实现:通过应用层或者传输层的代理服务器,通过在代理服务器上设置一些模拟恶劣网络环境的参数,使得通过这些代理服务器的流量都被转化为恶劣网络环境下的流量。如利用Fiddler,Charles等具有代理服务器功能的网络流量分析软件来实现。
    通过利用一些更底层的驱动层面的服务,通过控制网卡的收包发包的行为,来模拟恶劣的网络环境。如dummynet的ipfw驱动等。通过建立一个可控的网关,在网关上部署模拟恶劣环境的相关程序,所有需要借助该网关进行转发的流量都会被模拟为恶劣网络条件
    360免费wifi等。
    Linux下的netem就提供了这类支持。ps:实际生活中,电梯里 or 地铁里 模拟用户体验测试是个不错的选择~O(∩_∩)O【实际操作】具有代理服务器功能的网络流量分析软件

    一、【弱网测试场景】既然APP异常测试中,弱网测试属于必须考虑的测试项,哪些业务适合验证,哪些不需要验证呢?以下是个人浅见,欢迎抛砖引玉:
    1.结合APP本身属性比如社交类APP(聊天、抢红包)对网络环境依赖性大且用户关注度高,弱网环境下需要重点关注。结合互联网金融APP,申购流程中创建订单后是否支付成功,用户关注度最高(涉及扣费)。例如 弱网环境,创建订单失败,用户关注是否被扣费;创建订单成功后支付失败,再次支付是否重复扣费等
    2.使用频率&易遇到弱网的场景比如微博APP【观看小视频】,用户在碎片时间极易【观看小视频】(APP用户喜欢使用碎片化时间进行娱乐操作),同时增加了【刷微博】(微博小视频和刷微博 操作场景重合)此处就需要加强弱网环境测试比如金融APP,用户在碎片化时间使用金融APP,领取奖品、查看理财类新闻、查看收益好的例子:据我所知,微信的升级就会监听用户是否插着电,连着wifi,一旦监听到了,就马上告诉你,现场可以升级
    二、【弱网环境测试点总结】
    1.场景:弱网环境下某个操作响应时间原因:APP用户对等待时间容忍度低,若弱网环境loading超过5s,用户很容易kill应用后再次进入应用
    【测试点】性能测试中,加入弱网环境测试点,检测各个场景网络请求的 API 消耗时间(此处可以放入性能测试中,做为衡量APP性能好坏的指标)
    2.场景:弱网环境下直至超时,UI界面友好度&APP是否稳定原因:容错机制主要是考虑弱网情况下带来的不稳定,常见的问题是:loading超时导致ANR or crash【测试点】弱网环境直至超时,判定为断网状态,UI界面和提示,友好且理解无歧义
    3.场景:断网后环境下,是否自动重发请求原因:不同模块,开发对请求处理不同。测试前可了解,代码是否支持自动重复请求,自动重发请求的频率是什么?【测试点】断网后恢复网络,是否堆积网络请求(目前来说 理财模块 当10s左右无返回 则会重发请求),此时请求和返回正常情况下,是否出现异常情况。比如1次支付操作,断网后堆积多个支付请求,恢复网络后因堆积多个支付请求,是否完成多次支付ps:断网后恢复网络,考虑APP进行操作目的是否对伤害用户体验,通过哪种手段 可以达到操作目的同时用户体验无感或者低伤害比如,微信希望在线升级某些内容,会自动监听用户是否插着电 or 连着wifi,一旦监听符合上述场景,APP自动升级:
    1)插电场景 确保升级过程中,耗电不会导致手机低电量甚至没电
    2)wifi场景,确保升级过程中,流量消耗不会使用用户话费中流量包,不会导致因消耗话费流量伤害用户体验4.网络请求中,kill进程 (导致APP登录态掉线)登录同一个账号成功,应该不继续相同网络请求(要和RD确认,程序实际实现)登录不同账号成功,应该不继续相同网络请求(要和RD确认,程序实际实现)
    三、【常见弱网问题和原因分析】
    1.场景:上传大图或者多图时,在弱网络环境下出现进度条走到一半卡住然后又从头开始原因:采用分段上传方式,直至请求超时,分段传输没有结束,代码逻辑不对,导致每次重试都重头上传,一直循环
    2.场景:在弱网络环境下容易出现登录不上或者登陆后立即掉线原因:登录没有缓冲机制,而请求超时时间的设置没有区分同网络情况解决方案:建议开发针对wifi、2g、3g、4g设置不同的超时时间
    3.场景:弱网络环境下,请求的数据返回时间较长,等待的过程中,如果页面上的相关控件仍然可以操作,则容易出现异常现(闪退现象、触发底部时获得原页面请求数据)原因:依赖数据的控件操作,在数据返回前没有做兼容处理4.场景:搜索时输入关键字会连续发请求,停下时,显示最终的关键字搜索结果,但很快又会被前面的关键字搜索结果覆盖了;原因:中间的请求返回较慢,显示了最终的结果后,之前的请求返回的数据应不做处理。

    在这里插入图片描述
    二、整理弱网测试时碰到的问题和解决方案

    1.现象:用户登录应用时下载初始化数据,下载过程中因网速太慢点击取消并重新登录,数据初始化完成后出现重复,造成数据不一致
    原因:数据下载过程中、下载失败后,未进行数据回滚,终止后重新下载,出现数据重复。
    解决方案:通过事务处理数据下载逻辑,下载失败后,应用本地数据库进行数据回滚。
    2.现象:用户点击数据上传,数据上传过程中,网络弱切不稳定,基于联网状态自动触发数据上传,导致穿线数据重复写入,形成脏数据。
    原因:数据上传过程中,由于失败重传机制,会出现连续两次写操作,并且未做唯一识别处理。
    解决方案:根据数据特性,对可能造成脏数据的地方,通过关键字段,例如创建时间,key-value值等生成hash键,标记记录唯一性,即数据写入事,检查hash键是否存在,如果已经存在,当前重复数据丢弃。
    3.现象:在弱网环境下,用户输入用户名和密码点击登录,应用链接超时返回用户名和密码错误提示。
    原因:在弱网环境下的连接超时后,按照强网业务逻辑,导致返回超时异常。
    解决方案:在弱网环境下的链接超时后,检查应用本地数据库是否有用户登录信息,若存在,获取应用本地用户信息进行登录。

    4.在弱网环境下,用户输入用户名和密码后点击登录,登录过程中应用崩溃并且闪退。
    原因:弱网环境下数据下载超时,加载数据严重依赖于后来的异步加载。数据还没来得及返回,应用跳转到下个activity,导致崩溃。
    解决方案:健壮数据加载流程,通过标记后台数据下载状态加载界面,依赖数据下载完成后,再进行页面跳转。

    5.现象,弱网络环境下,用户请求页面响应时间教程,等待的过程中,页面上的部分空间仍然可以操作,当用户点击控件时,出现应用闪退现象。
    原因:没有对数据加载流程进行判断,直接暴露控件,当出现依赖数据控件操作时,没有在数据返回前做兼容处理。
    解决方案:在数据加载过程中,设置页面对外暴露的控件为不可操作,当数据加载完再释放。

    6.现象:在弱网环境下,用户第一次输入搜索关键字没有得到响应后,再次输入全新关键字并发送请求,等待搜索结果返回后,当前结果页被之前的关键字搜索结果舒心覆盖。
    原因:中间的请求返回较慢,显示最终的结果后,之前请求返回的数据应不做处理。
    处理方案:对异步请求未完成的任务进行cancel

    展开全文
    qq_43071669 2019-08-27 13:59:08
  • Fiddler是一个抓包工具,显然不是专门用来进行弱网测试的,术业有专攻,我希望有一个专门进行弱网测试并持续维护的工具。 NEWT和ATC分别是微软和Facebook推出的网络模拟工具。其中,ATC是一个搭建在linux上的一个...

    背景

    用户使用app产品的过程中,不可能永远都处在wifi满格的情况下。在地铁里,巴士上,甚至是电梯,车库等等的场景里,我们的app会如何表现,这同样是我们的关注的重点。

    工具选型

    弱网测试工具有如下几种:
    1. Fiddler
    2. Network Emulator for Windows Toolkit(NEWT)
    3. Augmented Traffic Control(ATC)

    Fiddler是一个抓包工具,显然不是专门用来进行弱网测试的,术业有专攻,我希望有一个专门进行弱网测试并持续维护的工具。

    NEWT和ATC分别是微软和Facebook推出的网络模拟工具。其中,ATC是一个搭建在linux上的一个web服务,搭建一套之后可以给多人使用,而且是开源的。于是,我毫不犹豫的选择了ATC。

    安装

    ATC项目地址:

    https://github.com/facebook/augmented-traffic-control

    安装方式可参考:

    安装实践过程以及碰到的问题:

    1)驱动问题

    首先,你得确认自己的无线网卡支持热点功能,安装驱动,并且保证驱动不冲突
    比如:如果有wl的相关驱动,关闭

    $ lsmod | grep wl
    $ sudo modprobe -r wl
    $ sudo modprobe -r cfg80211

    然后加载b43驱动

    $ sudo modprobe b43

    2)创建热点问题

    前面的推荐文章中介绍了热点创建方式,但还是太麻烦了,这里使用了create_ap进行热点的创建。
    首先检查 有线宽带连接接口

    $ ifconfig

    可以看到这里有个p3p1是有线连接,然后查看无限连接接口

    $ iwconfig

    这里的是wlan2

    之后建立wifi热点

    #注意此处不要加-m bridge 参数,避免和后面atc启动的时候产生的桥接网络
    $ sudo create_ap  wlan2 p3p1 mouni_test 123789456

    这里我建议将启动任务放到后台

    #注意此处不要加-m bridge 参数,避免和后面atc启动的时候产生的桥接网络
    $ sudo create_ap  wlan2 p3p1 mouni_test 123789456 > /tmp/create_ap_log.file 2>&1 &

    3)启动FACEBOOK ATC
    由于这里使用docker进行部署,所以启动ATC的方式如下:

    $ docker run -d --privileged --net=host -e ATCD_LAN=wlan2 -e ATCD_WAN=p3p1 atcd/atc

    使用

    ATC搭建是个比较麻烦的事,使用起来却极其方便,推荐文章中已有相关介绍。只需要设置相关的网络,测试人员接入测试即可,多人互不干扰。
    下面是网络设置的参考:
    https://github.com/facebook/augmented-traffic-control/tree/master/utils/profiles

    展开全文
    m1213642578 2016-08-29 11:09:11
  • 摘自弱网测试时碰到的问题解决方案再加上自己的一些遇到的解决~ 1.没进入到后台,可以在前端请求开始时候加个定时器。在请求完毕,或者一定时间,删除定时器。 2. 现象:用户登录应用时下载初始化数据,下载...

    摘自弱网测试时碰到的问题和解决方案再加上自己的一些遇到的解决~

     

    1.没进入到后台,可以在前端请求开始时候加个定时器。在请求完毕,或者一定时间,删除定时器。

     

    2. 现象:用户登录应用时下载初始化数据,下载过程中因网速太慢点击取消并重新登录,数据初始化完成后出现重复,造成数据不一致。

    原因:数据下载过程中、下载失败后,未进行数据回滚,中止后重新下载,出现数据重复

    解决方案 :通过事务处理(批处理)数据下载逻辑,这里可以是,下载失败后,应用本地数据库进行数据回滚。

     

    3. 现象:用户点击数据上传,数据上传过程中网络弱且不稳定,基于联网状态自动触发数据上传,导致出现数据重复写入,形成脏数据

    原因:数据上传过程中, 由于失败重传机制,会出现连续两次写操作,并且未做唯一识别处理

    解决方案 :根据数据特性,对可能造成脏数据的地方,通过关键字段,例如创建时间,key-value值等生成hash键,标记记录唯一性,即数据写入时,检查hash键是否存在,如果已经存在,当前重复数据丢弃。

     

    4.现象:在弱网环境下,用户输入用户名和密码点击登录,应用链接超时返回用户名和密码错误提示。

    原因:在弱网环境下的连接超时后,按照强网业务逻辑处理,导致返回超时异常。

    解决方案 : 弱网连接超时后,检查应用本地数据库是否有用户登录信息,若存在,获取应用本地用户信息进行登录。

     

    5. 现象:在弱网环境下,用户输入用户名和密码后点击登录,登录过程中应用崩溃并且闪退。

    原因:弱网环境下数据下载超时,加载数据 严重依赖于后来的异步加载。数据还没来得及返回,应用跳转到下个activity,导致崩溃。

    解决方案 :健壮数据加载流程,通过标记后台数据下载状态加载界面,依赖数据下载完成后,再进行页面跳转。

     

    6. 现象:弱网络环境下,用户请求页面响应时间较长,等待的过程中,页面上的部分控件仍然可以操作,当用户点击控件时,出现应用闪退现象;

    原因:没有对数据加载流程进行判断,直接暴露控件可控,当出现依赖数据的控件操作时,没有在数据返回前做兼容处理。

    解决方案 :在数据加载过程中,设置页面对外暴露的控件为“不可操作”,当数据加载完再释放。

     

    7.现象:在弱网环境下,用户第一次输入搜索关键字没有得到响应后,再次输入全新关键字并发送请求,等待搜索结果返回后,当前结果页被之前的关键字搜索结果刷新覆盖

    原因:中间的请求返回较慢,显示最终的结果后,之前请求返回的数据应不做处理。

    解决方案 :对异步请求未完成的任务进行cancel.

     

    展开全文
    ademoa 2019-07-13 10:56:32
  • 解决日常的支持需求中,经常会遇到一些用户反馈一些无法简单复现的bug,有很大一部分的bug是由于用户自身的网络环境波动,或者是本身网络环境就较为恶劣,而服务在面对这种恶劣的网络环境的健壮性不够,导致会出现...

    一、利用Fiddler模拟恶劣网络环境

    在解决日常的支持需求中,经常会遇到一些用户反馈一些无法简单复现的bug,有很大一部分的bug是由于用户自身的网络环境波动,或者是本身网络环境就较为恶劣,而服务在面对这种恶劣的网络环境的健壮性不够,导致会出现一些意想不到的bug。而在正常的开发自测过程中很难去营造出这种恶劣的网络环境,使得这些bug较难被提前发现和修复。另外一些服务在恶劣网络环境下虽然不会出现不可用的情况,但是用户体检很差,为了优化这个情况下的用户体验,也需要去在本地模拟这种环境来进行调优。 
    所以要去复现这些bug,甚至是去提前发现这些bug,就需要能够在开发环境中模拟出恶劣的网络环境,从而看到在这种恶劣的网络环境下的服务的表现等。当前模拟恶劣网络环境主要可以通过以下这些手段实现:

    1. 通过应用层或者传输层的代理服务器,通过在代理服务器上设置一些模拟恶劣网络环境的参数,使得通过这些代理服务器的流量都被转化为恶劣网络环境下的流量。如利用Fiddler,Charles等具有代理服务器功能的网络流量分析软件来实现。
    2. 通过利用一些更底层的驱动层面的服务,通过控制网卡的收包发包的行为,来模拟恶劣的网络环境。如dummynet的ipfw驱动等。
    3. 通过建立一个可控的网关,在网关上部署模拟恶劣环境的相关程序,所有需要借助该网关进行转发的流量都会被模拟为恶劣网络条件。Linux下的netem就提供了这类支持。

      这里主要先讲的是第一种手段,即利用Fiddler来模拟恶劣的网络环境,对服务进行测试,这个手段实现简单,较为直观,但是缺点是只能支持那些利用HTTP进行通信和交互的服务。在之后的文章中也会进一步说一下后两种手段。

    【Fiddler是啥】

      Fiddler的官网上是这样描述它自己的:The free web debugging proxy for any browser, system or platform,即跨浏览器、跨系统、跨平台的免费Web Debug代理服务器。当你的HTTP浏览经过Fiddler时,Fiddler可以监视流量,查看HTTP通讯的各种信息,设置断点查看和修改HTTP数据,甚至可以构造各种测试用的HTTP包以及重放已记录的包等。其官网是http://www.fiddler2.com/fiddler2/,上面详细地介绍了Fiddler到底是什么。

    【简单地利用Fiddler限速模拟恶劣网络环境】

      Fiddler本身已经预置提供了模拟Modem速度的选项,其位置位于: 
      Rules – Performances – Simulate Modem Speeds 
    Fidder界面 
      勾选该选项后,所有通过Fiddler代理的流量都会变得和多年前的56k小猫时上网一般的慢。 
      由于Fiddler只是一个HTTP代理,要直观地看出限速效果,最好是运行在浏览器中的测速工具,这里选用speedtest.net提供的测速工具进行测试。 
      首先是开启该选项之前的速度: 
    开启前速度 
      打开了Simulate Modem Speeds后: 
    开启后速度
      速度已经回到了当年那种无法忍受的低速了,注意到这里PING值也有了显著的提高,而事实上ping值是ICMP层的控制报文,并不会被Fiddler影响,理论上ping值并不会出现提高的情况,进一步分析Fiddler中的报文则可以看出端倪: 
    端倪
      事实上网页插件并不能实现发送ICMP包并得到ping值的功能,而是用多次较小的HTTP GET请求的响应时间来计算PING值,这里实际算出来的是一个平均的HTTP的RTT值,所以受到Fiddler模拟恶劣环境的影响就是正常的了。

    【调整模拟恶劣网络环境的参数】

      直接模拟Modem速度实在是慢爆了,事实上就算是在很差信号的情况下,手机移动网络的速度都已经超过了当年的56k Modem速度了,所以采用默认的配置模拟出来的环境过于恶劣,并不一定符合需求,此时就需要对限速的参数进行调整。 
      Fiddler本身就提供了一个配置文件供调整这些参数,点击: 
      Rules – Customize Rules… 
      就会用文本编辑器打开CustomRules.js文件,其默认位于用户目录的文档目录下的\Fiddler2\Scripts 位置,后缀名是js,其内容实质是JScript.NET——微软对ECMAScript规范的实现,与日常使用的javascript是属于同一个规范下的,但是在扩展的细节实现存在一定的不同。 
      打开该文件后,可以找到一个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

      然而实际情况下却得到了两倍于这个值的带宽,推测可能是Fiddler的内部实现上有一些和描述上的不同,为何为造成这个现象现在还不是很清楚,所以上述公式最后还需要修正一个2.0的系数,即:

    上传带宽=((1*8/1000)/0.300)*2.0≈0.106Mbps 
    下载带宽=((1*8/1000)/0.150)*2.0≈0.053Mbps

      假设我们将两个参数都设置为50,则会得到上下载带宽均为0.32Mbps,测速结果如下所示: 
    设置参数以后的测速结果

    【编写自定义脚本】

      进一步地,我们可以扩展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);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

      得到的测试结果如下: 
    得到的测试结果 
      在测速过程中的瞬时速度的趋势图如下: 
    瞬时速度趋势图 
      可以看到整体的网络限速存在了一定程度的抖动。 
      通过进一步扩展CustionRules.js可以实现很多需要的恶劣环境模拟场景,如果场景较为复杂的话,也可以通过编写Fiddler的插件的方式,编写C#插件代码来进一步控制Fiddler的行为,在这里就不多做赘述了。详细可以参照:http://docs.telerik.com/fiddler/extend-fiddler/extendwithdotnet

    【Fiddler模拟恶劣网络环境的局限性】

      Fiddler进行限速较为简单和灵活,配置也较为方便,但是由于它是一个应用层的HTTP的代理,只能模拟该层上的行为,对于一些复杂的网络层的丢包、重传等恶劣情况就不能很好的模拟出来,而且对于其他协议的应用也不支持,后续会介绍一些其他的模拟恶劣环境的方法和软件来弥补这些缺失。

     

     

    二、利用Dummynet模拟恶劣网络环境

    利用Dummynet模拟恶劣网络环境

    在之前的文章中提到了三种模拟恶劣网络环境调试代码的手段:

    1. 应用层或者传输层的代理服务器
    2. 传输层或者网络层控制数据包的驱动
    3. 网络层控制数据包的网关

    同时在之前的文章中介绍了第一种手段,即利用应用层的HTTP代理Fiddler来模拟恶劣网络环境,这种方式简单且灵活,但是其处于应用层,限制较大,同时也没有办法从带宽和延时两个方面分别去精细化地对恶劣网络环境进行模拟,这里介绍第二种手段——Dummynet。

    Dummynet简介

    Dummynet的官网地址是:http://info.iet.unipi.it/~luigi/dummynet/,官网上对于dummynet的描述是这样的:dummynet is a live network emulation tool, originally designed for testing networking protocols, and since then used for a variety of applications including bandwidth management. 即Dummynet是一个实时的网络模拟工具,事实上dummynet是ipfw防火墙的一部分,ipfw是一个网络层的防火墙,并内建于FreeBSD之中。 
    利用ipfw的options DUMMYNET选项,可以设置一系列的pipes,从而做到对网络流量进行控制的目的。

    Dummynet基本原理

    enter image description here 
    如官网上提供的这张图所示,dummynet通过在两个网络层中(一般是在传输层和应用层之间或者网络层与传输层之间)建立一条条pipe的方式来控制网络流量,符合设定的规则中的网络流量会被引入这些管道中去,从而使得dummynet可以介入这些流量之中,控制带宽、延迟,甚至进一步控制丢包率等众多参数。

    Dummynet安装(Windows)

    Dummynet本身作为ipfw防火墙的一部分,其内建于FreeBSD,其本身支持FreeBSD,OSX,Linux,Windows多种操作系统下的安装和使用,在OSX和Linux下下载源码编译安装一般即可使用,这里主要介绍一下Windows下的Dummynet安装。 
    Dummynet在Windows下是作为一个网卡上的服务驱动存在的,在官方给出的二进制文件包中已经包含了该驱动的sys与inf文件,但是该驱动是没有包含数字签名的,在并没有引入驱动强制签名机制的Windows操作系统(如Windows XP)上时,直接到官网下载到最新的二进制包,然后依照之后的操作步骤进行安装即可以完成ipfw+dummynet服务驱动的安装,但是在引入了驱动强制签名机制(一般是Windows 7以后的Windows版本,或者设置了比较严格的组策略)的操作系统上,是无法安装ipfw+dummynet服务驱动的,要解决这个问题可以使用两种方案:

    1. 打开Windows的测试模式,关闭驱动强制签名机制,然后安装无签名的驱动 
      这种方式的实现也有两种方式,一种是在启动Windows时启动选项中关闭驱动强制签名校验机制,可以参考这篇文章 http://jingyan.baidu.com/article/7c6fb42879543380642c9036.html ,另外一种方式则是进入Windows的测试模式,可以参考 http://jingyan.baidu.com/article/acf728fd21c3e7f8e510a3ef.html 文章中的说明。
    2. 为无签名的ipfw+dummynet服务驱动打上自签名或者可用的签名 
      如何进行自签名或者打上可用的签名可以参考MSDN上的说明 https://msdn.microsoft.com/en-us/library/windows/hardware/ff544865(v=vs.85).aspx ,具体如何签名并不在本文的范畴内。 
      本文主要使用第二种方式,为ipfw+dummynet服务驱动打上百度签名后,即可在Windows 7上正常安装。

    安装的方式如下:

    1. 找到你需要限制带宽和流量的网卡,进入属性: 
      这里写图片描述
    2. 点击下方的安装,选择服务,然后选择从磁盘安装,并在浏览中找到ipfw+dummynet服务驱动的inf安装文件: 
      这里写图片描述
    3. 在“此连接使用下列项目”中看到ipfw+dummynet之后,即代表ipfw+dummynet服务驱动安装成功,如果安装成功后遇到网卡无法使用的情况,一般会是前一次卸载没有卸载完全,重启电脑可以解决。 
      安装完成后可以以管理员权限运行binary目录下的testme.bat,如果运行结果中没有报警信息或者错误信息,则驱动安装是成功的: 
      这里写图片描述

    利用Dummynet模拟恶劣网络环境

    利用dummynet的pipe,可以设置一些特定的规则,就可以达到模拟恶劣网络环境的目的,且这些设置对于在操作系统中运行的应用程序来说是透明的、自动生效的,不需要像在使用Fiddler来进行模拟时还需要设置http代理。

    1. 低带宽模拟 
      恶劣网络环境最基础的模拟方式就是模拟较小带宽下的情况,利用dummynet中的pipe设置,可以将所有的tcp流和udp流的带宽限制在一定的级别上,运行一个管理员的命令行,并利用binary目录下的ipfw.exe文件就可以设置dummynet中的pipe,在命令行中执行以下命令: 
      ipfw add pipe 2 in proto tcp 
      ipfw pipe 2 config bw 2Mbit/s 
      即可将tcp的下行流量限制在2Mbit/s的带宽上,这里采用和上一篇文章中采用的相同的测速网站speedtest.net来验证限制带宽的效果,在执行以下指令以前的测速结果如下: 
      这里写图片描述
      在执行完上述指令以后的测速结果如下: 
      这里写图片描述
    2. 高延时模拟 
      在管理员权限的命令行中执行以下命令: 
      ipfw add pipe 10 ip from any to any 
      ipfw pipe 10 config delay 200 
      这会使得所有的包都被延时200ms,这里利用ping命令来ping百度的方式来直接测试延时,命令执行以前结果如下: 
      这里写图片描述
      命令执行以后结果如下: 
      这里写图片描述
    3. 高丢包率模拟 
      在管理员权限的命令行中执行以下命令: 
      ipfw add pipe 10 ip from any to any 
      ipfw pipe 10 config plr 0.1 
      这里设置的是10%的丢包率,这里利用ping -t指令继续ping百度,来观察丢包率的变化: 
      执行以前: 
      这里写图片描述 
      执行以后: 
      这里写图片描述
    4. 更加精细化的设置 
      可以看到相比Fiddler来说,利用dummynet可以更加精细化地从各个角度去设置一个恶劣网络环境的参数,上文中提到的带宽、延时和丢包率的模拟当然也可以组合起来使用,同时在设置pipe规则时还可以进一步设置更加精细的规则,比如指定的ip段,指定的协议等,比如这一段指令: 
      ipfw add pipe 4 src-ip 10.1.2.0/24 in 
      ipfw pipe 4 config bw 1Mbit/s delay 123 plr 0.1 
      就设置了一个只会介入源ip来自10.1.2.0/24网段的数据包的pipe,并且这个pipe会限制1Mbit/s的带宽,延时123ms,并且有10%的丢包率,通过组合这些参数,可以模拟出很复杂的恶劣网络环境,从而满足开发和测试的需要。相关的设置参数的说明和设置方法可以参考官网的相关文档和其他的一些说明文档。

    在最后,当完成模拟恶劣网络环境后,执行以下命令: 
    ipfw -q flush 
    ipfw -q pipe flush 
    来清除所有设定的pipe和规则,进一步如果需要还原原来的环境的话可以将驱动删除,并重启计算机即可。

     

     

    三、clumsy 0.2模拟网速

    clumsy 能在 Windows 平台下人工造成不稳定的网络状况,方便你调试应用程序在极端网络状况下的表现。

    简介

    利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果:

    特色:

    • 下载即用,不需要安装任何东西。
    • 不需要额外设置,不需要修改你的程序的代码。
    • 系统级别的网络控制,可以适用于命令行,图形界面等任何 Windows 应用程序。
    • 不仅仅只支持 HTTP,任何 TCP, UDP 的网络连接都可以被处理。
    • 支持本地调试(服务器和客户端都在 localhost)
    • "热插拔",你的程序可以一直运行,而 clumsy 可以随时开启和关闭。
    • 实时调节各种参数,详细控制网络情况。

    实例

    下面的动画展示了 clumsy 作用于一个本地的基于 netcat 的 UDP 服务器/客户端的情况。仔细观察你可以看到数据根据在 clumsy 的影响下产生了相应的变化。 如果你基本知道了 clumsy 是干什么用的,不妨到下载页面选择适用于你系统的版本进行下载。

    详细信息

    clumsy 首先根据用户选择的 filter 来拦截指定的网络数据。在 filter 中可以设定你感兴趣的协议(tcp/udp),端口号,是接收还是发出的端口。你也可以通过简单的逻辑语句来进一步缩小范围。当 clumsy 被激活时,只有符合这些标准的网络数据会被进行处理,而你不感兴趣的数据仍然会由系统正常传输。

    当被 filter 的网络数据包被拦截后,你可以选择 clumsy 提供的功能来有目的性的调整网络情况:

    1. 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况。
    2. 掉包(Drop),随机丢弃一些数据。
    3. 节流(Throttle),把一小段时间内的数据拦截下来后再在之后的同一时间一同发出去。
    4. 重发(Duplicate),随机复制一些数据并与其本身一同发送。
    5. 乱序(Out of order),打乱数据包发送的顺序。
    6. 篡改(Tamper),随机修改小部分的包裹内容。

    尽管当前宽带网络连接十分普及,但网络传输其本身在本质上总不是稳定的。如果你的应用程序中没有应对各种情况的处理,那么有可能一个丢失的 UDP 包裹都会让你的程序崩溃。正确的调试这类行为 显然需要再代码结构上进行仔细的设计和处理,还会很花功夫。而且在某些封装紧密的开发环境(Unity3D 自带的网络库可能是一个例子)下会更麻烦。clumsy 以尽可能减轻程序员负担为目标, 希望提供一个简单方便(但并不完美)的解决方案。

    项目的代码可以在github上获取。在下载页面有编译好的版本。强烈建议在使用前花点时间阅读一下文档,来 了解 clumsy 的功能和限制。

    展开全文
    bbzhangts 2019-07-10 10:00:21
  • weixin_34041003 2019-05-25 17:17:00
  • weixin_40763897 2019-07-14 16:39:47
  • u012100968 2020-10-24 10:57:47
  • 257KB weixin_38624557 2021-01-03 11:13:40
  • qq_37672438 2021-08-21 16:34:03
  • u010782644 2018-02-23 11:39:28
  • pbymw8iwm 2021-10-27 01:21:48
  • BJ1599449 2021-07-13 14:00:35
  • weixin_30426879 2018-08-23 17:43:00
  • tcc374254426 2021-12-16 15:17:02
  • weixin_42519113 2021-05-25 15:28:00
  • 1.34MB njbaige 2021-10-14 13:52:38
  • rikkatheworld 2020-10-15 17:35:46
  • qq_41942457 2021-03-23 09:13:40

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,831
精华内容 1,532
关键字:

弱网问题的解决方案