Windows 上的 netem 与 Network Link Conditioner
Linux 上有 tc netem,Mac 上有 Network Link Conditioner。Windows 没有任何内置工具能增加延迟和丢包。本页把你已经熟悉的东西对应到 Bean Network Tester,并指出哪些数字不能照搬。
netem 选项逐项对照
这里的每条命令都要加上 --target 和 --duration,否则会影响整台电脑。
| netem | 窗口中的设置 | 参数 |
|---|---|---|
delay 100ms | 延迟 | --latency 100 |
delay 100ms 20ms | 延迟, 抖动 | --latency 100 --jitter 20 |
loss 5% | 丢包 | --loss 5 |
loss 5% 25% | 丢包, 连续丢包(burst) | --loss 5 --loss-burst 4 |
duplicate 1% | 重复包 | --dup 1 |
corrupt 0.1% | 数据损坏 | --corrupt 0.1 |
reorder 25% | 尖峰概率, 尖峰幅度 | --spike-prob 5 --spike-ms 200 |
rate 1mbit | 下载, 上传 | --down 122 --up 122 |
limit 1000 | 缓冲区 | --buffer 1000 |
- 突发丢包。netem 的相关性数值不是突发长度。连续丢包(burst) 是连续丢失数据包的平均个数,这是最接近的对应项。
- 乱序。没有乱序百分比。一次延迟尖峰会拖慢单个数据包,让之后发送的包超过它,统计页面上的乱序计数会显示是否真的发生了。
- 队列大小。netem 的 limit 以数据包个数计。缓冲区 则是以毫秒计的时间。
需要注意的三点差异
方向。netem 延迟的是离开网卡的数据,回复则原样返回。本工具默认捕获双向流量,所以 --latency 100 会让 ping 增加约 200 毫秒:去程 100,回程 100。要得到 netem 的效果,只捕获出站流量:
BeanNetworkTester.exe --filter out --latency 100 --jitter 20 --target myapp.exe --duration 120
单位。netem 的速率以比特每秒计。速度限制字段以 KB/s 计,其中 K = 1024。兆比特的换算如下:
| netem 速率 | 速度限制字段,单位 KB/s |
|---|---|
1mbit | 122 |
5mbit | 610 |
10mbit | 1221 |
50mbit | 6104 |
100mbit | 12207 |
范围。tc 作用于整个网络接口,并且需要 root 权限。本工具用 --target 只针对一个程序,需要管理员权限。
如果你熟悉 Network Link Conditioner
苹果的工具以命名的配置文件为基础。这里最接近的对应项:
| Network Link Conditioner | 这里最接近的 |
|---|---|
| 100% Loss | 把丢包设为 100 |
| 3G | 3G 网络 |
| DSL | 家庭 DSL(VDSL) |
| LTE | LTE / 4G |
| WiFi | 良好 Wi‑Fi |
| Very Bad Network | 极差网络 |
| Edge | 没有对应的配置。请自己填写速度限制和延迟,然后用“另存为...”按钮保存为自己的配置。 |
这些数值不是苹果的,所以请把配置当作起点。每个配置设置的所有数值都列在参考页上。
在 Windows 上你还能得到什么
- 针对一个程序,而不是整台电脑。把网络损伤对准单个应用,机器上的其他部分保持正常。
- 用时间线代替 shell 脚本。定时场景在设定的秒数改变设置,相当于 Linux 上由
tc和sleep组成的脚本。 - 流水线可以运行它。同一个可执行文件可以在 CI 中运行,并通过退出码报告结果。
在 Linux 或 macOS 上,请使用原版工具。本工具只能在 Windows 上运行。