Liunx模拟网络延时
模拟广区域网络延迟
https://wiki.linuxfoundation.org/networking/netem#dokuwiki__top
恢复:tc qdisc del root dev eth2 2>/dev/null
这是最简单的示例,它只是为来自本地以太网的所有数据包添加固定数量的延迟。
tc qdisc add dev eth0 root netem delay 100ms
现在,在本地网络上托管的简单 ping 测试应显示增加 100 毫秒。延迟受内核 (HZ) 的时钟分辨率限制。在大多数 2.4 系统上,系统时钟以 100hz 的速度运行,允许以 10ms 的增量延迟。 在 2.6 上,该值是 1000 到 100 hz 的配置参数。
以后的示例只需更改参数,而无需重新加载 qdisc
真正的广面积网络显示可变性,因此可以添加随机变异。
tc qdisc change dev eth0 root netem delay 100ms 10ms
这会导致添加的延迟为 100ms ± 10ms。网络延迟变化不是纯粹的随机的,因此要模拟一下,也有相关值。
tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
这将导致添加的延迟为 100ms ± 10ms,下一个随机元素取决于最后一个 25%。这不是真正的统计相关性,而是一个近似值。
延迟分布
通常,网络中的延迟不均匀。使用类似正态分布来描述延迟的变化更为常见。netem 学科可以采取表来指定非统一分布。
tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
实际表(普通表、帕雷托表、帕雷托表)作为iproute2 编译的一部分生成,并放置在 /usr/lib/tc 中;因此,它是可能的,通过一些努力,使你自己的分布基于实验数据。
数据包丢失
随机数据包丢失在"tc"命令中指定百分比。尽可能小的非零值是:
232 = 0.000000232%
tc qdisc change dev eth0 root netem loss 0.1%
这会导致随机丢弃百分之一(即 1000 个数据包中的 1 个)的 1/10。
还可以添加可选关联。这会导致随机数生成器的随机性较小,并可用于模拟数据包突发丢失。
tc qdisc change dev eth0 root netem loss 0.3% 25%
这将导致 0.3% 的数据包丢失,并且每个连续的概率取决于最后一个数据包的四分之一。
Probn =. 25 = Probn - 1 =. 75 = 随机
警告
当在本地使用损耗时(不在网桥或路由器上),损耗将报告给上层协议。这可能会导致 TCP 重新发送和行为,就像没有损失一样。当测试协议响应丢失时,最好在网桥或路由器上使用netem
数据包复制
数据包复制的指定方式与数据包丢失相同。
tc qdisc change dev eth0 root netem duplicate 1%
数据包损坏
可以使用损坏选项模拟随机噪声(在 2.6.16 或更晚)。这将在数据包中的随机偏移量引入一个位错误。
tc qdisc change dev eth0 root netem corrupt 0.1%
数据包重新订购
有两种不同的方法来指定重新排序。第一个方法间隙使用固定序列,并重新排序每个第 N 个数据包。一个简单的用法是:
tc qdisc change dev eth0 root netem gap 5 delay 10ms
这会导致每个第 5 个 (第 10 个,第 15 个,...) 数据包立即发送,并且所有其他数据包延迟 10 毫秒。这是可预测的,对于基础协议测试(如重新组装)非常有用。
第二种形式的重新排序更像现实生活。它会导致一定百分比的数据包被错误排序。
tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
在此示例中,25% 的数据包(相关性为 50%)将立即发送, 其他人将延迟 10 毫秒。
如果随机延迟值出问题,较新版本的 netem 也会重新订购数据包。以下将导致一些重新排序:
tc qdisc change dev eth0 root netem delay 100ms 75ms
如果第一个数据包的随机延迟为 100ms(100ms 基 - 0ms 抖动),而第二个数据包在 1 毫秒后发送,并且获得 50ms 的延迟(100ms 基 - 50ms 抖动);将先发送第二个数据包。这是因为内特姆内部的队列纪律 tfifo,按时间按顺序发送数据包。
警告
混合重新排序形式可能会导致意外的结果
任何重新排序的方法工作,一些延迟是必要的。
如果延迟小于数据包间到达时间,则不会看到重新排序。
速率控制
Netem 学科没有内置的速率控制,而是使用执行速率控制的其他学科之一。在此示例中,我们使用令牌存储桶筛选器(TBF) 来限制输出。
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 )