使用Kernel NetEm和tc模拟复杂网络环境

时间:2023-03-09 00:32:06
使用Kernel NetEm和tc模拟复杂网络环境

关键词:netem(Network Emulator)、tc(Traffic Control)。

大部*域网环境良好,但是产品实际网络环境可能千差万别,为了对产品进行各种情况测试就需要模拟网络环境。

Linux内核network模块提供了NetworkEmulator功能,结合iproute2的tc功能可以模拟各种网络环境。

还有一点好处就是可以固定特殊网络环境,进行bug复现。

1. 环境准备

要模拟网络环境,首先需要Kernel支持netem,并且需要tc工具。

使能netem功能,在make emnuconfig界面输入"/",然后“netem”,即可找到配置netem的路径。

使用Kernel NetEm和tc模拟复杂网络环境

稍微了解tc就知道它是iproue2的一部分,在buildroot中配置iproute2.

使用Kernel NetEm和tc模拟复杂网络环境

在配置好两者之后,编译即可使用。

2. 原理

netem是内核提供的网络模拟功能模块,该功能模块可以用来在性能良好的局域网中,模拟出复杂网络传输性能,比如不同时延、丢包、乱序、重复等问题。

netem的功能模拟通过tc进行配置。通过tc在用户空间对网卡进行配置,可以模拟出netem提供的各种网络环境。

netem相关源码在net/sched/sch_netem.c中,tc在iproute2-4.14.1/tc中。

3. 使用

3.1 模拟延迟传输

将 eth0 网卡的传输设置为延迟100毫秒发送。

tc  qdisc  add  dev  eth0  root  netem  delay  100ms

真实的情况下,延迟值不会这么精确,会有一定的波动,下面命令模拟带有波动性的延迟值:

tc  qdisc  add  dev  eth0  root  netem  delay  100ms  10ms

该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送。
由于各个包的延迟值不通,也会在一定程度上打乱发包的次序。

还可以更进一步加强这种波动的随机性,将 eth0 网卡的传输设置为 100ms ,同时,大约有30%的包会延迟 ± 10ms 发送:

tc  qdisc  add  dev  eth0  root  netem  delay  100ms  10ms  30%

3.2 模拟网络丢包

将 eth0 网卡的传输设置为随机丢掉 1% 的数据包。

tc  qdisc  add  dev  eth0  root  netem  loss  1%

也可以设置丢包的成功率,将 eth0 网卡的传输设置为随机丢掉 1% 的数据包,成功率为30% :

tc  qdisc  add  dev  eth0  root  netem  loss  1%  30%

3.3 模拟包重复

将 eth0 网卡的传输设置为随机产生 1% 的重复数据包。

tc  qdisc  add  dev  eth0  root  netem  duplicate 1%

3.4 模拟数据包损坏

将 eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包。

tc  qdisc  add  dev  eth0  root  netem  corrupt  0.2%

3.5 模拟数据包乱序

将 eth0 网卡的传输设置为:有25%的数据包(50%相关)会被立即发送,其他的延迟10秒。

tc  qdisc  change  dev  eth0  root  netem  delay  10ms   reorder  25%  50%

详细信息请参考:Linux Foundation的《netem》。