fiddler模拟限速的原理
我们可以通过fiddler来模拟限速,因为fiddler本来就是个代理,它提供了客户端请求前和服务器响应前的回调接口,我们可以在这些接口里 面自定义一些逻辑。Fiddler的模拟限速正是在客户端请求前来自定义限速的逻辑,此逻辑是通过延迟发送数据或接收的数据的时间来限制网络的下载速度和 上传速度,从而达到限速的效果。
他提供了一个功能,让我们模拟低速网路环境…启用方法如下:
Rules → Performances → Simulate Modem Speeds :模拟调制解调器的速度
启动fiddler需要进行如下设置:
1.设置端口号:
Tools →Fiddler options →Connections
allow remote computers to connect “允许远程计算机连接”为设置的代理可以连接到fiddle上,必须勾选.
2.重启fiddler
3.设置模拟调制解调器的速度
4.设置手机代理
手机代理设置“ip地址为本机的ip,端口号为之前设置的端口号(确保端口号不被占用)”
在本机命令行输入:ipconfig,找到本机的ip地址。
5.手动设置设置上行,下行速率,模拟网路速度的原理,每上传/下载1KB 要delay 多久…
网络取值的算法就是 1000/下载速度 = 需要delay的时间(毫秒),比如50kb/s 需要delay200毫秒来接收数据。
查找代码如下:
if (m_SimulateModem) {
//Delay sends by 300ms per KB uploaded. //每延迟300ms发送1kb的数据,也就是每1s发送3kb的数据
oSession["request-trickle-delay"] = 300
//Delay receives by 150ms per KB downloaded.
oSession["response-trickle-delay"] = 150//每延迟150ms下行1kb的数据
}
(1).首先来判断m_SimulateModem是否为true,也就是是否设置了弱网模式。
(2).如果为弱网模式。则分析代码:
- oSession[“request-trickle-delay”] = “300”; 注释的也很明白,Delay sends by 300ms per KB uploaded.上传1KB需要300ms,转化一下上传速度:1Kb/0.3s = 10/3(KB/s)
- 如果你想设置上传的速度为50KB/s,你则需要设置Delay 时间为 20ms
- 同样的方法,也可以限制上传的速度,调整oSession[“response-trickle-delay”]即可。
代码中 oSession["request-trickle-delay"] = "50";表示上传的速度,表示每50ms每KB的上传速度
oSession["response-trickle-delay"] = "50";表示下行的速度,表示每50ms每KB的上行速度
(3).点击保存,就可模拟各种限速的情况了。
PS:目前2G网络的的下行速度约在20kb/s,换算好后约是每50ms每KB的下行速度
目前2G网络的的下行速度约在180kb/s,换算好后约是每6ms每KB的下行速度
2G:150Kbps,折合下载速度15-20K/s;
3G:1-6Mbps,折合下载速度120K/s-600K/s
4G:10-100Mbps,折合下载速度1.5M/s-10M/s
请注意,当你存档之后,原本已经勾选的SimulateModem Speeds 会被取消勾选,要记得再到Rules → Performances → Simulate Modem Speeds 勾选喔!
6.设置完成后,清空原有的log,并使用你的app进行弱网条件下的操作,
打开android设备的“设置”->“WLAN”,找到你要连接的网络,在上面长按,然后选择“修改网络”,弹出网络设置对话框,然后勾选“显示高级选项”。
在这里我用的是夜神模拟器.
在“代理”后面的输入框选择“手动”,在“代理服务器主机名”后面的输入框输入电脑的ip地址,在“代理服务器端口”后面的输入框输入8888,然后点击“保存”按钮。
然后启动android设备中的浏览器,访问百度的首页,在fiddler中可以看到完成的请求和响应数据。
弱网测试的现象及原因
1、 现象:用户登录应用时下载初始化数据,下载过程中因网速太慢点击取消并重新登录,数据初始化完成后出现重复,造成数据不一致。
原因:数据下载过程中、下载失败后,未进行数据回滚,中止后重新下载,出现数据重复
解决方案:通过事务处理数据下载逻辑,下载失败后,应用本地数据库进行数据回滚。
2、 现象:用户点击数据上传,数据上传过程中网络弱且不稳定,基于联网状态自动触发数据上传,导致出现数据重复写入,形成脏数据
原因:数据上传过程中,由于失败重传机制,会出现连续两次写操作,并且未做唯一识别处理
解决方案:根据数据特性,对可能造成脏数据的地方,通过关键字段,例如创建时间,key-value值等生成hash键,标记记录唯一性,即数据写入时,检查hash键是否存在,如果已经存在,当前重复数据丢弃。
3、 现象:在弱网环境下,用户输入用户名和密码点击登录,应用链接超时返回用户名和密码错误提示。
原因:在弱网环境下的连接超时后,按照强网业务逻辑处理,导致返回超时异常。
解决方案: 弱网连接超时后,检查应用本地数据库是否有用户登录信息,若存在,获取应用本地用户信息进行登录。
4、 现象:在弱网环境下,用户输入用户名和密码后点击登录,登录过程中应用崩溃并且闪退。
原因:弱网环境下数据下载超时,加载数据严重依赖于后来的异步加载。数据还没来得及返回,应用跳转到下个activity,导致崩溃。
解决方案:健壮数据加载流程,通过标记后台数据下载状态加载界面,依赖数据下载完成后,再进行页面跳转。
5、 现象:弱网络环境下,用户请求页面响应时间较长,等待的过程中,页面上的部分控件仍然可以操作,当用户点击控件时,出现应用闪退现象;
原因:没有对数据加载流程进行判断,直接暴露控件可控,当出现依赖数据的控件操作时,没有在数据返回前做兼容处理。
解决方案:在数据加载过程中,设置页面对外暴露的控件为“不可操作”,当数据加载完再释放。
6、 现象:在弱网环境下,用户第一次输入搜索关键字没有得到响应后,再次输入全新关键字并发送请求,等待搜索结果返回后,当前结果页被之前的关键字搜索结果刷新覆盖
原因:中间的请求返回较慢,显示最终的结果后,之前请求返回的数据应不做处理。
解决方案:对异步请求未完成的任务进行cancel.