【Linux】tc 与 Netem 弱网仿真:网络延迟、丢包、乱序与限速实战指南

admin / Linux / 已更新 2026-09-22 / 1918 字 · 约 11 分钟 / 642 次阅读 /

在微服务、分布式存储以及跨数据中心多活架构中,网络波动(高延迟、抖动、丢包、乱序)是引发级联故障的头号元凶。

在没有复杂第三方模拟软件的情况下,Linux 内核自 2.6 版本起便原生内置了极度强大的流量控制体系——tc(Traffic Control) 及其网络仿真模块 netem(Network Emulator)

无需安装任何第三方侵入性组件,仅凭内核级指令即可精准模拟广域网延迟、突发丢包、数据损坏和带宽瓶颈,是进行混沌工程(Chaos Engineering)与容灾演练的核心利器。

本文将深入拆解 tc netem 的底层工作机理,提供全场景故障注入矩阵、典型弱网实战命令以及防失联的安全恢复规范。


一、Linux 流量控制架构与 Netem 原理

Linux 内核的网络流量控制(Traffic Control)架构主要由三大核心要素构成: 1. 排队规则 (Qdisc, Queueing Discipline):控制数据包在网卡发送队列中的调度算法(如 FIFO、SFQ、TBF 等); 2. 类别 (Class):对带宽或流量进行分级分类(用于有类队列); 3. 过滤器 (Filter):根据源/目的 IP、端口或协议对数据包分类,并将其分流至指定 Class。

+---------------------------------------------------------------+
|                      Linux 内核网络栈                          |
+---------------------------------------------------------------+
                               |  (出口数据包 Egress Packets)
                               v
+---------------------------------------------------------------+
|               Qdisc 根排队规则 (Root Queue)                   |
|   [ netem: 注入延迟 delay / 丢包 loss / 损坏 corrupt / 乱序 ]    |
+---------------------------------------------------------------+
                               |
                               v
+---------------------------------------------------------------+
|                    物理/虚拟网卡 (如 eth0)                     |
+---------------------------------------------------------------+

[!TIP] 单向限制特性tc 默认直接作用于网络接口的出口流量(Egress)。从当前机器发出的数据包会被注入弱网,而流入(Ingress)的数据包默认不受影响。若要实现双向模拟,需借助虚拟镜像网卡(ifb)重定向。


二、Netem 弱网故障注入核心场景速查矩阵

故障注入场景 核心子命令与参数示例 生产仿真应用场景
固定延迟 delay 100ms 模拟跨地域机房物理距离传输延迟
波动延迟 (抖动) delay 100ms 10ms 模拟 90ms ~ 110ms 的网络抖动波动
正态分布延迟 delay 100ms 20ms distribution normal 模拟真实互联网正态分布的网络延迟
随机丢包 loss 2% 模拟偶发性丢包环境(测试 TCP 重传)
相关突发丢包 loss 2% 25% 模拟连续突发丢包(第二个包丢弃概率 25%)
报文重复 duplicate 1% 模拟网络链路重发导致的数据包重复
报文损坏 corrupt 0.2% 模拟物理线路电磁干扰造成的校验和损坏
报文乱序 delay 10ms reorder 25% 50% 模拟多路径路由导致的 TCP 乱序接收

三、典型弱网场景模拟实战

1. 模拟网络高延迟与正态抖动

真实网络中的网络延迟从来不是恒定不变的,通常伴随特定幅度的抖动(Jitter):

# 1. 基础固定延迟:为 eth0 网卡出口添加 100ms 延迟
sudo tc qdisc add dev eth0 root netem delay 100ms

# 2. 带有波动的延迟:100ms ± 10ms (即 90ms ~ 110ms 之间均匀分布)
sudo tc qdisc change dev eth0 root netem delay 100ms 10ms

# 3. 带有相关性 (Correlation) 的抖动:
# 当前包的延迟有 30% 取决于前一个包的延迟
sudo tc qdisc change dev eth0 root netem delay 100ms 10ms 30%

# 4. 模拟真实互联网的正态分布 (Bell Curve) 延迟模型
sudo tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

2. 模拟网络丢包(随机与突发模型)

丢包是检验分布式系统心跳保活、TCP 重传以及 RPC 超时重试最关键的指标:

# 1. 独立随机丢包:均匀随机丢弃 1% 的出站数据包
sudo tc qdisc change dev eth0 root netem loss 1%

# 2. 突发丢包模型 (Burst Loss):
# 丢包率为 1%,但如果上一个包丢了,下一个包被丢弃的概率增加 30% (模拟突发链路中断)
sudo tc qdisc change dev eth0 root netem loss 1% 30%

3. 模拟数据包损坏与报文重复

用于测试通信协议的 Checksum 校验、应用层解包与防重放逻辑:

# 1. 报文随机重复:产生 1% 的重复数据包 (Duplicate Packets)
sudo tc qdisc change dev eth0 root netem duplicate 1%

# 2. 报文内容损坏:产生 0.2% 的随机翻转比特坏包 (Corrupt Packets)
sudo tc qdisc change dev eth0 root netem corrupt 0.2%

4. 模拟数据包乱序(Reorder)

在网络多路径传输或负载均衡时,后发的数据包可能先到达对端:

# 25% 的数据包立即发送,其余 75% 的数据包延迟 10ms 发送,从而导致乱序
sudo tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

5. 模拟带宽瓶颈限制(令牌桶算法 TBF)

若需要限制特定网卡的峰值出站带宽,可以使用 tbf(Token Bucket Filter)排队规则:

# 将 eth0 出口带宽限制为 10Mbps,突发缓冲 10KB,延迟上限 50ms
sudo tc qdisc change dev eth0 root tbf rate 10mbit burst 10kb latency 50ms

四、规则检查、动态变更与安全还原

1. 实时查看当前网卡队列规则

在设置了规则后,可以通过 show 子命令确认当前生效的状态与配置:

# 查看 eth0 网卡当前挂载的 qdisc 规则详情
tc qdisc show dev eth0

2. 动态调整已有规则(changereplace

  • 当网卡上尚无自定义 Qdisc 时,使用 add
  • 当网卡上已经存在 Qdisc 时,使用 changereplace 平滑修改参数,无需先删除再添加。

3. 快速恢复网络环境(清理规则)

测试演练结束后,必须彻底删除添加的 Qdisc 规则,使网卡恢复为 Linux 默认的 mqpfifo_fast 排队策略:

# 彻底清空 eth0 网卡上的根 Qdisc,恢复原生网络性能
sudo tc qdisc del dev eth0 root

五、混沌工程实战避坑与安全防线

[!WARNING] 绝对避坑:防止高延迟/丢包把自己踢出 SSH 远程会话! 如果直接在唯一的 SSH 管理网卡上执行 tc qdisc add dev eth0 root netem loss 50% 或超大延迟,你当前的 SSH 终端可能会瞬间卡死断开,导致无法重新登录服务器进行规则清理!

安全演练防线:设置定时自毁机制

在远程云服务器上执行任何 tc 破坏性实验前,务必先设置一条 5 分钟后自动还原的兜底定时任务

# 构筑自愈防线:5 分钟后即使 SSH 断开,系统也会自动恢复正常网络
echo "tc qdisc del dev eth0 root" | at now + 5 minutes

# 确认定时恢复任务已就绪
atq

# 开始放心执行弱网测试
sudo tc qdisc add dev eth0 root netem delay 200ms loss 5%
admin

admin

云原生架构 · 全栈开发

感谢阅读本文!记录系统架构思考与实战复盘。专注于 Python、Django、PostgreSQL 与云原生容器化工程实践。