目录
1.背景
需要使用tc 构造丢包场景,注意tc 丢包不能确定丢弃的是否是payload 数据包,有可能丢弃 ack 包。
2. tc介绍
1. 无法正常使用
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# tc qdisc add dev swift1f0 root netem delay 500ms loss 40%
Error: Specified qdisc kind is unknown.
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# tc -h
Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }
tc [-force] -batch filename
where OBJECT := { qdisc | class | filter | chain |
action | monitor | exec }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[aw] |
-o[neline] | -j[son] | -p[retty] | -c[olor]
-b[atch] [filename] | -n[etns] name | -N[umeric] |
-nm | -nam[es] | { -cf | -conf } path
-br[ief] }
[root@pool-100-1-1-18 /]#
2. 修复此问题
# 加载模块
sudo modprobe sch_netem
# 再次检查是否加载成功
lsmod | grep sch_netem
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# lsmod |grep sch_netem # 加载模块
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc fq_codel 0: dev enp4s0 root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64
qdisc fq_codel 0: dev swift1f0 root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64
qdisc fq_codel 0: dev swift1f1 root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64
qdisc noqueue 0: dev virbr0 root refcnt 2
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# modprobe sch_netem # 再次检查是否加载成功
modprobe: FATAL: Module sch_netem not found in directory /lib/modules/4.18.0-553.6.1.el8.x86_64
[root@pool-100-1-1-18 /]#
# 安装 kernel-modules-extra(包含 sch_netem)
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# yum install kernel-modules-extra
Repository extras is listed more than once in the configuration
Last metadata expiration check: 0:02:56 ago on Tue 05 Aug 2025 12:00:48 AM CST.
Dependencies resolved.
=========================================================================================================================================================
Package Architecture Version Repository Size
=========================================================================================================================================================
Installing:
kernel-modules-extra x86_64 4.18.0-553.6.1.el8 baseos 11 M
Transaction Summary
=========================================================================================================================================================
Install 1 Package
Total download size: 11 M
Installed size: 687 k
Is this ok [y/N]: y
Downloading Packages:
kernel-modules-extra-4.18.0-553.6.1.el8.x86_64.rpm 2.8 MB/s | 11 MB 00:04
---------------------------------------------------------------------------------------------------------------------------------------------------------
Total 2.8 MB/s | 11 MB 00:04
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : kernel-modules-extra-4.18.0-553.6.1.el8.x86_64 1/1
Running scriptlet: kernel-modules-extra-4.18.0-553.6.1.el8.x86_64 1/1
Verifying : kernel-modules-extra-4.18.0-553.6.1.el8.x86_64 1/1
Installed:
kernel-modules-extra-4.18.0-553.6.1.el8.x86_64
Complete!
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# modprobe sch_netem # 加载模块
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# lsmod |grep sch_netem # 再次检查是否加载成功
sch_netem 24576 0
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
到此已加载成功,可以使用tc
3. tc 丢包
1. 查看当前规则
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# tc qdisc show dev swift1f0
qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64
[root@pool-100-1-1-18 /]#
2.丢包规则
2.1 固定间隔丢包
# tc qdisc add dev <网卡名> root netem gap 10 delay 5000ms # 每10个包丢1个,其余延迟5s
[root@pool-100-1-1-18 /]# tc qdisc add dev swift1f0 root netem delay 500ms loss 50%
[root@pool-100-1-1-18 /]#
3. 查看当前规则
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# tc qdisc show dev swift1f0
qdisc netem 8009: root refcnt 2 limit 1000 delay 500ms loss 50%
[root@pool-100-1-1-18 /]#
4. 查看统计信息
# 发包后查看统计信息
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# tc -s qdisc show dev swift1f0
qdisc netem 8009: root refcnt 2 limit 1000 delay 500ms loss 50%
Sent 168 bytes 4 pkt (dropped 3, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
5. 删除丢包规则
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# tc qdisc del dev swift1f0 root
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]# tc qdisc show dev swift1f0
qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64
[root@pool-100-1-1-18 /]#
[root@pool-100-1-1-18 /]#
到此tc 丢包已实现