模拟手机弱网络测试
模拟手机弱网络测试在不同操作系统上的方法在本文最后的参考小节有简介,本文主要介绍 Linux 上 tc 的使用,以及使用代理软件来让手机连接到 Linux 上被 tc 减弱过的网络去上网。
1. tc 安装
Linux 发行版一般自带 tc 命令,如果没有则可安装之:
sudo apt-get install iproute
2. tc 快速入门
tc 是用来控制物理网卡的,所以首先要使用 ifconfig
命令确定你的 Linux 中物理网卡的名称。为方便起见,可以用如下命令将比如 eth0 赋值给环境变量,后面的 tc 命令即可直接复制粘帖拿来使用了:
export ETH=eth0
2.1 查看已经配置的网络条件
tc qdisc show dev $ETH
之前没有运行过任何 tc 命令时,此命令的输出是例如 qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
2.2 模拟延迟传输
sudo tc qdisc add dev $ETH root netem delay 100ms
该命令将网卡的传输设置为延迟 100 毫秒发送。比如在此命令前后分别运行 ping -c 3 www.baidu.com
,则你会发现延时分别是 10 毫秒和 110 毫秒左右。
此时运行前面的 tc qdisc show dev $ETH
,输出是 qdisc netem 8001: root refcnt 2 limit 1000 delay 100.0ms
2.3 删除网卡上面的相关配置
将之前命令中的 add 改为 del 即可删除配置,该命令将删除网卡的相关传输配置:
sudo tc qdisc del dev $ETH XXXXXXXXXXX(自己加的配置)
或是简单地:
sudo tc qdisc del dev $ETH root
比如删除前面的“模拟延迟传输”配置:
sudo tc qdisc del dev $ETH root netem delay 100ms
此时运行前面的 tc qdisc show dev $ETH
,输出又变回了 qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
3. tc 配置示例
3.1 带有波动性的延迟值
sudo tc qdisc add dev $ETH root netem delay 100ms 10ms
该命令将网卡的传输设置为延迟 100ms ± 10ms ( 90 ~ 110 ms 之间的任意值)发送。
还可以更进一步加强这种波动的随机性:
sudo tc qdisc add dev $ETH root netem delay 100ms 10ms 30%
该命令将网卡的传输设置为 100ms ,同时,大约有 30% 的包会延迟 ± 10ms 发送。
3.2 模拟网络丢包
sudo tc qdisc add dev $ETH root netem loss 1%
该命令将网卡的传输设置为随机丢掉 1% 的数据包。比如 sudo tc qdisc add dev eth0 root netem loss 10%
会显示 16 个包只有 13 个收到了。
也可以设置丢包的成功率:
sudo tc qdisc add dev $ETH root netem loss 1% 30%
该命令将网卡的传输设置为随机丢掉 1% 的数据包,成功率为 30% 。
3.3 模拟包重复
sudo tc qdisc add dev $ETH root netem duplicate 1%
该命令将网卡的传输设置为随机产生 1% 的重复数据包。
3.4 模拟数据包损坏
sudo qdisc add dev $ETH root netem corrupt 0.2%
该命令将网卡的传输设置为随机产生 0.2% 的损坏的数据包。( Linux 内核版本需在 2.6.16 以上)
3.5 模拟数据包乱序
sudo tc qdisc change dev $ETH root netem delay 10ms reorder 25% 50%
该命令将网卡的传输设置为有 25% 的数据包( 50% 相关)会被立即发送,其他的延迟 10 秒。 新版本中,如下命令也会在一定程度上打乱发包的次序:
sudo tc qdisc add dev $ETH root netem delay 100ms 10ms
4. 手机通过代理连上弱网络
4.1 安装并配置代理软件
这里以 privoxy 为例。
sudo apt install privoxy
然后打开配置文件比如 sudo vi /etc/privoxy/config
,将里面的
#listen-address 127.0.0.1:8118
或
listen-address localhost:8118
修改为
listen-address 0.0.0.0:8118
最后重启 privoxy 服务进程
sudo service privoxy restart
这样就将 Linux 机器做成了一台代理服务器,监听 8118 端口,任何连上该代理服务器的设备都会受到它的网络环境比如 tc 调整的弱网络环境的影响。
4.2 手机连接该代理服务器
确保手机和上面的代理服务器在同一个局域网,然后在手机上已连接的 wifi 热点的设置的高级选项中将代理设置为手动,就可以接着设置“服务器主机名”为上面的代理服务器的 IP 地址比如 192.168.1.7 ,“服务器端口”为 8118
5. 参考
- Windows 上可以参考这篇文章 如何模拟手机弱网络测试 用 Network Emulation for Windows Toolkit 这款工具,或是参考这篇文章 移动端弱网络测试问题总结 用 Charles 这款工具。
- macOS 上可以参考这篇文章 Network Emulation 网络仿真 - Unity圣典 用 Unity->Edit->Network Emulation 这款工具。
- Linux 上可以参考这篇文章 基于facebook atc搭建企业级弱网络模拟平台 及 FaceBook ATC 弱网测试工具环境搭建 来用 Facebook ATC 这款工具搭建完善的环境;或是参考这些文档来用 Linux 自带的 tc 命令搭建简单的环境 linux下使用TC模拟弱网络环境(网络延迟和丢包) Linux下TC使用说明 Network Latency and Packet Loss Emulation 。