使用 TC 和 Netem 模拟网络异常
Netem 与 TC 简要说明
Netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能。例如:低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多 Linux 发行版都默认开启了该内核模块,比如:Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。
TC 是 Linux 系统中的一个用户态工具,全名为 Traffic Control (流量控制)。TC 可以用来控制 Netem 模块的工作模式,也就是说如果想使用 Netem 需要至少两个条件,一是内核中的 Netem 模块被启用,另一个是要有对应的用户态工具 TC 。
- 所有的报文延迟 100ms 发送:
$ tc qdisc add dev enp0s5 root netem delay 100ms - 模拟丢包率:
$ tc qdisc change dev enp0s5 root netem loss 50% - 模拟包重复:
$ tc qdisc change dev enp0s5 root netem duplicate 50% - 模拟包损坏:
tc qdisc change dev enp0s5 root netem corrupt 2% - 模拟包乱序(每 5 个报文(第 5、10、15…报文)会正常发送,其他的报文延迟 100ms):
tc qdisc change dev enp0s5 root netem reorder 50% gap 3 delay 100ms
查看并显示 enp0s5 网卡的相关传输配置
$ tc qdisc show dev enp0s5
Wondershaper
设置网卡下载速度为 200kb/s,上传速度为 150kb/s
$ sudo wondershaper enp0s5 200 150
速率限制消除
$ sudo wondershaper clear enp0s5
Comcast
$ comcast --device=enp0s5 --latency=250 \
--target-bw=1000 \
--default-bw=1000000 \
--packet-loss=10% \
--target-addr=8.8.8.8,10.0.0.0/24 \
--target-proto=tcp,udp,icmp \
--target-port=80,22,1000:2000
--device说明要控制的网卡为 enp0s5。--latency指定 250ms 的延迟。--target-bw指定目标带宽。--default-bw指定默认带宽。--packet-loss指定丢包率。--target-addr/--target-proto/--target-port参数指定在满足这些条件的报文上实施上面的配置。
