为应用增加延迟和抖动
在快速的本地连接上一切都正常。给应用 300 ms 的 ping,你就会发现哪些界面是按“答复瞬间到达”来写的。
三种不同的东西
| 设置 | 作用 | 现实中的来源 |
|---|---|---|
| 延迟 | 为每个数据包增加相同的延迟,单位为毫秒。 | 距离。位于另一个大洲的服务器,或者卫星。 |
| 抖动 | 在此基础上再叠加一个随机量,让延迟不断变化。 | 共享 Wi-Fi、移动网络,以及任何拥塞的网络。 |
| 延迟尖峰 | 偶尔出现的长时间停顿,由发生频率和持续时间决定。 | 基站之间的切换,负载过高的路由器。 |
三者的单位都是毫秒,可以同时使用。两个延迟数值都接受从 0 起的任意值,所以你可以从合理的 40 ms 一路调到离谱的 60 秒。
从命令行运行
对一个应用施加稳定的 200 ms 延迟和 80 ms 抖动:
BeanNetworkTester.exe --latency 200 --jitter 80 --target myapp.exe --duration 60
改为罕见但很长的停顿,大约每二十个数据包就有一个多等待一秒:
BeanNetworkTester.exe --spike-prob 5 --spike-ms 1000 --target myapp.exe
值得尝试的数值
- 40 ms:同一个国家内的服务器。应该没有任何变化。
- 150 ms:另一个大洲。任何频繁交互的东西都会开始变慢,因为每一次往返都有代价。
- 600 ms 及以上:地球同步卫星或机上 Wi-Fi。进度条会在这里停滞,重试逻辑也终于会跑起来。
现成的配置方案带有实测数值:“远距离服务器(另一大洲)”、“卫星网络(低轨)”、“卫星网络(地球同步轨道)”、“机上 Wi‑Fi”、“LTE / 4G”。
测量方法:看最坏情况,而不是平均值
抖动几乎不会改变平均值,也几乎不会改变中位数。一次带 30 ms 抖动的运行和一次没有抖动的运行,可能报告出几乎相同的“典型”ping,体验却完全不同。
改为比较第 95 百分位和中位数。两者之间的差距就是抖动,而正是这个差距让语音通话断断续续、让游戏无法游玩,尽管平均值看起来一切正常。