这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
一、前言
什么样的网络属于弱网?
低于
2G速率的时候都属于弱网,3G也可划分为弱网,一般WIFI不划入弱网测试范畴,弱信号的WIFI通常也会被纳入到弱网测试场景中。
以下是弱网下各网络参数,网页端也可参考,如图:
更多弱网场景:
名词解释:
- 上行速率:用户的电脑向网络发送信息时的数据传输速率
- 下行速率:是指网络向用户电脑发送信息时的传输速率
- 丢包率:测试中所丢失数据包数量占所发送数据组的比率
- 网络抖动:网络延时随时都在不停的变化称为抖动(延时的变化称为抖动)
不同业务下的思考:
- 不同业务可根据业务可行,选择不同网络状况进行测试
PC:PC由于使用有线网络更为通用,网络状态更为稳定。调整上下速率最为常用- 移动端:移动端由于环境因素的影响,可考虑:网络延迟,抖动,丢包,网络环境等网络状态
- 特别网络的一些限制:如部分网络限制
DNS等 - 弱网测试用于覆盖所有场景显然是不合理的,更倾向与选择覆盖高P,显示或数据层面的场景
如何进行弱网测试:
SIM卡的网络切换
手机-设置-移动网络设置-网络类型选择
3G、4G卡都可以设置关闭3G/4G,只走2G网络。
- 具体弱网场景测试,常见场景包括:地铁/巴士、电梯、楼梯间、停车场、山里
- 使用虚拟机模拟网络速度
- 使用软件
Charles,fiddler进行网络代理,模拟不同的网络带宽、延时率、丢包率
二、使用
(1)Charles
Throttling Settings 网络模拟设置】页面字段说明:
Enable Throttling: 可以指定域名拦截,也可以所有请求拦截Bandwidth(带宽):带宽,即上行、下行数据传输速度Utilistation(利用百分比):带宽可用率,大部分modern是100%Round-trip latecy(往返延迟):第一个请求的时延,单位是ms。MTU(最大传输单元):最大传输单元,即TCP包的最大size,可以更真实模拟TCP层,每次传输的分包情况。Reliability(可靠率):指连接的可靠性。这里指的是10kb的可靠率。用于模拟网络不稳定。Stability(稳定率):连接稳定性,也会影响带宽可用性。用于模拟移动网络,移动网络连接一般不可靠。Unstable quality range(不稳定数量范围)
(2)chrome 浏览器设置网络
(3)fiddler 代理设置弱网
(4)基于 TC 和 Netem 实现网络异常情况的模拟
Linux 内核内置了一个 TC(Traffic Control)框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。
原理大致如下图所示,主要是通过在输出端口处建立一个队列来实现流量控制:
netem是直接添加到网卡上的,也就是说所有从网卡发送出去的包都会收到配置参数的影响!
环境准备:
# 创建 ubuntu 容器
# --cap-add=NET_ADMIN 用于 tc
$ docker run -itd --name ubuntu-test --cap-add=NET_ADMIN ubuntu
# 进入容器后:
$ apt-get update
# 安装 ping
$ apt install iputils-ping
# 安装 ifconfig
$ apt install net-tools
# 安装 tc
$ apt-get install -y iproute2
# 安装 curl
$ apt-get install curl
# 容器访问宿主机
# 在宿主机 ifconfig 找到 docker0的ip: 172.17.0.1
# 在容器中访问 172.17.0.1 即可
# 本地起了端口为 8080 的web容器,/file/ping 为路径
root@2cb9386257cf:/# curl http://172.17.0.1:8080/file/ping
pong
1)监控网卡
- 首先要查看你的网卡信息,如:
eth0
root@2cb9386257cf:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8085 bytes 23953285 (23.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6858 bytes 598652 (598.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 将这个网卡加入监控列表:
sudo tc qdisc add dev eth0 root netem
$ sudo tc qdisc add dev eth0 root netem
# 实操如下
root@2cb9386257cf:/# tc qdisc add dev eth0 root netem
root@2cb9386257cf:/#
- 如果不想再监控,可以移除这个网卡:
sudo tc qdisc del dev eth0 root netem
$ sudo tc qdisc del dev eth0 root netem
- 想查看监控列表,可以使用
tc -s qdisc
qdisc是queueing discipline的缩写。
root@2cb9386257cf:/# tc -s qdisc
qdisc noqueue 0: dev lo root refcnt 2
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc netem 8001: dev eth0 root refcnt 2 limit 1000
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
2)模拟网络延迟
- 固定延迟
# 每个包都固定延迟 100毫秒, 设置好后你可以使用ping命令测试
tc qdisc add dev eth0 root netem delay 100ms
- 固定延迟+小随机值
# 延迟时间变成了 100ms ± 10ms
tc qdisc change dev eth0 root netem delay 100ms 10ms
- 固定延迟+小随机值+相关系数
tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
- 遵循正态分布的延迟
典型情况下延迟并不是均分分布的,而是遵循类似正态分布的规律。所以你可以使用某种分布模拟延迟。
# 分布为normal、 pareto、 paretonormal等
tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
3)模拟丢包
- 随机丢包
# 随机丢弃一些包, 丢弃比率可以设置。丢失比最小为 232 = 0.0000000232%
# 命令会随机丢弃千分之一的包
tc qdisc change dev eth0 root netem loss 0.1%
- 增加一个相关参数
# 丢弃率为千分之三, 后一个的丢弃的可能性和前一个的可能性的25%相关:
tc qdisc change dev eth0 root netem loss 0.3% 25%
Probn = .25 Probn-1 + .75 Random
实战:
# 丢包 100%
$ tc qdisc change dev eth0 root netem loss 100%
# curl 访问
root@2cb9386257cf:/# curl http://172.17.0.1:8080/file/ping -v
* Trying 172.17.0.1...
* TCP_NODELAY set
* connect to 172.17.0.1 port 8080 failed: No route to host
* Failed to connect to 172.17.0.1 port 8080: No route to host
* Closing connection 0
curl: (7) Failed to connect to 172.17.0.1 port 8080: No route to host
4)模拟包重复
# 类似丢包的命令,上面命令产生百分之一的重复包
tc qdisc change dev eth0 root netem duplicate 1%
5)模拟错误包
模拟随机噪音(错误包), 这个功能在 2.6.16 以及以后的版本中才加入。 它会在包中随机位置更改一个
bit。
tc qdisc change dev eth0 root netem corrupt 0.1%
6)模拟包乱序
- 方式一: 使用
gap
# 第 5th 包(5、10、15、20)立即发送,其它的包会延迟10毫秒。
tc qdisc change dev eth0 root netem gap 5 delay 10ms
- 方式二:随机性,方式一乱序方式是固定的,可以预测的。
# 25%的包会立即发送, 其它的包会延迟10毫秒。相关系数为50%。
tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
# 新版的netem的包延迟设置也可能导致包乱序,如果包延迟的有一定的随机性的话:
# 因为延迟时间在100ms ± 75ms返回内, 就有可能第二包的延迟比第一个包的延迟小,先发出去。
tc qdisc change dev eth0 root netem delay 100ms 75ms
7)控制包速(带宽)
没有直接命令,需要两条命令配合使用。
# tc qdisc add dev eth0 root handle 1:0 netem delay 100ms
# tc qdisc add dev eth0 parent 1:1 handle 10: tbf rate 256kbit buffer 1600 limit 3000
# tc -s qdisc ls dev eth0
qdisc netem 1: limit 1000 delay 100.0ms
Sent 0 bytes 0 pkts (dropped 0, overlimits 0 )
qdisc tbf 10: rate 256Kbit burst 1599b lat 26.6ms
Sent 0 bytes 0 pkts (dropped 0, overlimits 0 )