弱网测试

2,057 阅读7分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

一、前言

什么样的网络属于弱网?

低于 2G 速率的时候都属于弱网,3G 也可划分为弱网,一般 WIFI 不划入弱网测试范畴,弱信号的 WIFI 通常也会被纳入到弱网测试场景中。

以下是弱网下各网络参数,网页端也可参考,如图: 2021-07-2715-58-33.png

更多弱网场景:2021-07-2715-58-58.png

名词解释:

  • 上行速率:用户的电脑向网络发送信息时的数据传输速率
  • 下行速率:是指网络向用户电脑发送信息时的传输速率
  • 丢包率:测试中所丢失数据包数量占所发送数据组的比率
  • 网络抖动:网络延时随时都在不停的变化称为抖动(延时的变化称为抖动)

不同业务下的思考:

  • 不同业务可根据业务可行,选择不同网络状况进行测试
  • PCPC 由于使用有线网络更为通用,网络状态更为稳定。调整上下速率最为常用
  • 移动端:移动端由于环境因素的影响,可考虑:网络延迟,抖动,丢包,网络环境等网络状态
  • 特别网络的一些限制:如部分网络限制 DNS
  • 弱网测试用于覆盖所有场景显然是不合理的,更倾向与选择覆盖高P,显示或数据层面的场景

如何进行弱网测试:

  1. SIM 卡的网络切换

手机-设置-移动网络设置-网络类型选择 3G4G 卡都可以设置关闭 3G/4G,只走 2G 网络。

  1. 具体弱网场景测试,常见场景包括:地铁/巴士、电梯、楼梯间、停车场、山里
  2. 使用虚拟机模拟网络速度
  3. 使用软件 Charlesfiddler 进行网络代理,模拟不同的网络带宽、延时率、丢包率

二、使用

(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)基于 TCNetem 实现网络异常情况的模拟

Linux 内核内置了一个 TCTraffic Control)框架,可以实现流量限速,流量整形,策略应用(丢弃,NAT等)。

原理大致如下图所示,主要是通过在输出端口处建立一个队列来实现流量控制: 2021-07-2716-07-54.png

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)监控网卡

  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
  1. 将这个网卡加入监控列表: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:/# 
  1. 如果不想再监控,可以移除这个网卡:sudo tc qdisc del dev eth0 root netem
$ sudo tc qdisc del dev eth0 root netem
  1. 想查看监控列表,可以使用 tc -s qdisc

qdiscqueueing 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)模拟网络延迟

  1. 固定延迟
# 每个包都固定延迟 100毫秒, 设置好后你可以使用ping命令测试
tc qdisc add dev eth0 root netem delay 100ms
  1. 固定延迟+小随机值
# 延迟时间变成了 100ms ± 10ms
tc qdisc change dev eth0 root netem delay 100ms 10ms
  1. 固定延迟+小随机值+相关系数
tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
  1. 遵循正态分布的延迟

典型情况下延迟并不是均分分布的,而是遵循类似正态分布的规律。所以你可以使用某种分布模拟延迟。

# 分布为normal、 pareto、 paretonormal等
tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

3)模拟丢包

  1. 随机丢包
# 随机丢弃一些包, 丢弃比率可以设置。丢失比最小为 232 = 0.0000000232%

# 命令会随机丢弃千分之一的包
tc qdisc change dev eth0 root netem loss 0.1%
  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)模拟包乱序

  1. 方式一: 使用 gap
# 第 5th 包(5、10、15、20)立即发送,其它的包会延迟10毫秒。
tc qdisc change dev eth0 root netem gap 5 delay 10ms
  1. 方式二:随机性,方式一乱序方式是固定的,可以预测的。
# 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 )