TC 输入方向的弱网模拟 ( 一 )

本文介绍了如何使用Linux NetEm工具模拟网络状况,包括输入流量的延迟,并提供了详细的步骤及命令行示例。

参考文档

  1. https://wiki.linuxfoundation.org/networking/netem

    How can I use netem on incoming traffic?
    You need to use the Intermediate Functional Block pseudo-device IFB . This network device allows attaching queuing discplines to incoming packets.

        # modprobe ifb
        # ip link set dev ifb0 up
        # tc qdisc add dev eth0 ingress
        # tc filter add dev eth0 parent ffff: \
           protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0
        # tc qdisc add dev ifb0 root netem delay 750ms
    Another way is to use another machine as an Ethernet bridge , and apply netem to both Ethernet devices.

    文中简单提到了,2种方法:

    1. 使用 ifb
    2. 使用 2 台机器 …

操作实践下

按照上文中的提示,依次敲命令,体验下:

  1. modprobe ifb

    执行命令:

    modprobe ifb

    验证,执行命令:

    ip link list

    显示内容:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether 00:16:3e:00:29:30 brd ff:ff:ff:ff:ff:ff
    3: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
        link/ether 02:42:b1:cd:f3:26 brd ff:ff:ff:ff:ff:ff
    4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
        link/ether 02:42:b5:6d:27:f0 brd ff:ff:ff:ff:ff:ff
    6: veth250924d@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
        link/ether 7e:f2:81:b2:06:58 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    12: vethd86893f@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP mode DEFAULT group default
        link/ether 5a:60:84:59:3e:90 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default
        link/ether be:69:e0:c3:61:e6 brd ff:ff:ff:ff:ff:ff
    14: cni0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
        link/ether 0a:58:0a:f4:00:01 brd ff:ff:ff:ff:ff:ff
    405: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 32
        link/ether 2e:21:ac:75:30:3f brd ff:ff:ff:ff:ff:ff
    406: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 32
        link/ether a6:a9:f7:cd:58:06 brd ff:ff:ff:ff:ff:ff

    可以看到新增2块网卡: ifb0、ifb1

    它们的状态为:state DOWN

  2. ip link set dev ifb0 up

    执行命令:

    ip link set dev ifb0 up

    验证,执行命令:

    ip link list

    显示内容:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether 00:16:3e:00:29:30 brd ff:ff:ff:ff:ff:ff
    3: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
        link/ether 02:42:b1:cd:f3:26 brd ff:ff:ff:ff:ff:ff
    4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
        link/ether 02:42:b5:6d:27:f0 brd ff:ff:ff:ff:ff:ff
    6: veth250924d@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
        link/ether 7e:f2:81:b2:06:58 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    12: vethd86893f@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP mode DEFAULT group default
        link/ether 5a:60:84:59:3e:90 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default
        link/ether be:69:e0:c3:61:e6 brd ff:ff:ff:ff:ff:ff
    14: cni0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
        link/ether 0a:58:0a:f4:00:01 brd ff:ff:ff:ff:ff:ff
    405: ifb0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 32
        link/ether 2e:21:ac:75:30:3f brd ff:ff:ff:ff:ff:ff
    406: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 32
        link/ether a6:a9:f7:cd:58:06 brd ff:ff:ff:ff:ff:ff

    可以看到 ifb0 网卡的状态为:state UNKNOWN

  3. tc qdisc add dev eth0 ingress

    执行命令:

    tc qdisc add dev eth0 ingress

    验证,执行命令:

    tc qdisc show dev eth0

    显示内容:

    qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ----------------

    可以看到 多了:qdisc ingress ffff: parent ffff:fff1 —————-

  4. tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0

    执行命令:

    tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0

    验证,执行命令:

    tc filter list dev eth0 parent ffff:fff1

    显示内容:

    filter parent ffff: protocol ip pref 49152 u32
    filter parent ffff: protocol ip pref 49152 u32 fh 800: ht divisor 1
    filter parent ffff: protocol ip pref 49152 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1
    match 00000000/00000000 at 0
        action order 1: mirred (Egress Redirect to device ifb0) stolen
        index 4 ref 1 bind 1

    可以看到 Egress Redirect to device ifb0 ,通过 eth0 的过滤器规则 parent ffff:fff1,把数据重定向到 device ifb0

  5. tc qdisc add dev ifb0 root netem delay 750ms

    执行命令:

    tc qdisc add dev ifb0 root netem delay 750ms

    验证,执行命令:

    tc qdisc show dev ifb0

    显示内容:

    qdisc netem 800d: root refcnt 2 limit 1000 delay 750.0ms

    再在本地 ping 下测试 Linux 机看看:

    这里写图片描述

    可以看出,命令生效啦!

试下输出方向是否正常

执行命令:

tc qdisc add dev eth0 root netem delay 750ms

验证,执行命令:

tc qdisc show dev eth0

显示内容:

qdisc netem 800e: root refcnt 2 limit 1000 delay 750.0ms
qdisc ingress ffff: parent ffff:fff1 ----------------

再在本地 ping 下测试 Linux 机看看:

这里写图片描述

可以看到 输入方向、输出方向都生效了。

恢复正常

  1. tc qdisc del dev ifb0 root netem

    执行命令:

    tc qdisc del dev ifb0 root netem

    验证,执行命令:

    tc qdisc show dev ifb0

    显示内容:

    qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
  2. tc qdisc del dev eth0 root netem

    执行命令:

    tc qdisc del dev eth0 root netem

    验证,执行命令:

    tc qdisc show dev eth0 

    显示内容:

    qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ----------------
  3. tc filter del dev eth0 parent ffff: protocol ip pref 49152 u32

    若不知道过滤器名称:

    tc filter list dev eth0 parent ffff:fff1

    显示内容:

    filter parent ffff: protocol ip pref 49152 u32
    filter parent ffff: protocol ip pref 49152 u32 fh 800: ht divisor 1
    filter parent ffff: protocol ip pref 49152 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1
    match 00000000/00000000 at 0
        action order 1: mirred (Egress Redirect to device ifb0) stolen
        index 4 ref 1 bind 1

    然后执行:

    tc filter del dev eth0 parent ffff: protocol ip pref 49152 u32

    就可以删掉过滤器啦。

  4. tc qdisc del dev eth0 ingress

    最后执行:

    tc qdisc del dev eth0 ingress

以上

结束语

本章主要根据 https://wiki.linuxfoundation.org/networking/netem 中,关于输入方向的例子介绍。

实际操作练习了一遍。

下一章,继续根据 https://wiki.linuxfoundation.org/networking/netem 中的介绍,练习体验下,netem 的模拟网络的 6 个方面:

  • Delay distribution (延迟分发)
  • Packet loss (丢包)
  • Packet duplication (数据包重复)
  • Packet corruption (数据包损坏)
  • Packet re-ordering (数据包乱序)
  • Rate control (速率控制,或称之为带宽)

并在最后给出一些弱网模拟的5个方面的值设置。Rate control 可以不考虑!

<think>嗯,用户想了解如何使用tc工具进行模拟测试。首先,我需要回忆tc工具的基本用法和相关参数。根据之前的引用资料,tc是Linux的流量控制工具,配合netem模块可以模拟延迟、丢包、带宽限制等情况。 用户可能需要具体的步骤,所以得按照安装、基本命令、参数设置的顺序来组织。首先确保系统已经安装了iproute2包,因为tc属于这个包。然后检查内核是否支持netem般主流的Linux发行版都默认支持。 接下来是具体的配置步骤。比如设置延迟,使用tc qdisc add命令,这里需要注意卡接口的名称是否正确,比如eth0或ens33。然后模拟丢包,同样用tc qdisc change命令调整丢包率。带宽限制稍微复杂,需要结合tbf(令牌桶过滤器)来限制速率。 用户可能还想知道如何验证配置是否生效,可以用tc qdisc show命令查看当前规则。测试部分可能需要使用ping或者curl等工具来观察延迟和丢包效果。最后,恢复络配置的步骤也很重要,避免测试后忘记清除规则导致络问题。 还需要考虑用户的实际应用场景,比如测试移动应用或服务器的表现,可以举些例子。另外,引用资料中提到Netemtc的关系,需要解释清楚,确保用户理解底层机制。 可能会遇到的问题,比如命令报错,可能是卡名称不对,或者没有权限。需要提醒用户使用sudo,以及确认卡接口是否正确。还有,复杂的规则组合可能需要更详细的示例,比如同时设置延迟和丢包,这时候需要分步骤说明或者给出复合命令。 最后,生成的相关问题要围绕用户可能进步的需求,比如如何分析下的应用性能,或者结合其他工具进行测试。这样能帮助用户更全面地了解整个测试流程。</think>### 使用 tc 工具进行模拟和测试的步骤 #### 1. **环境准备** - **安装工具**:确保系统已安装 `iproute2` 包(包含 `tc` 命令),般 Linux 发行版默认自带。若需手动安装: ```bash sudo apt-get install iproute2 # Debian/Ubuntu sudo yum install iproute2 # CentOS/RHEL ``` - **验证内核支持**:确认内核模块 `sch_netem` 已加载(大多数现代发行版默认支持): ```bash lsmod | grep sch_netem ``` #### 2. **基本命令格式** tc 的核心语法为: ```bash tc qdisc [add|change|replace|del] dev <卡接口> root netem <参数> ``` #### 3. **模拟典型场景** ##### a. **延迟(Latency)** ```bash # 添加固定延迟(示例:100ms) sudo tc qdisc add dev eth0 root netem delay 100ms # 添加随机延迟(示例:100ms ± 20ms) sudo tc qdisc add dev eth0 root netem delay 100ms 20ms ``` - **验证**:`ping 目标IP` 观察延迟变化[^4]。 ##### b. **丢包(Packet Loss)** ```bash # 添加 10% 的丢包率 sudo tc qdisc change dev eth0 root netem loss 10% # 添加相关性丢包(示例:10%丢包,且连续丢包概率为50%) sudo tc qdisc change dev eth0 root netem loss 10% 50% ``` - **测试**:使用 `curl` 或 `wget` 下载文件,观察传输成功率[^2]。 ##### c. **带宽限制(Bandwidth)** ```bash # 限制带宽为 1Mbps sudo tc qdisc add dev eth0 root handle 1: tbf rate 1mbit burst 32kbit latency 400ms ``` - **验证**:通过 `iperf` 或 `speedtest-cli` 测试实际带宽[^3]。 ##### d. **组合场景** ```bash # 同时设置延迟、丢包和带宽限制 sudo tc qdisc add dev eth0 root netem delay 50ms loss 5% sudo tc qdisc add dev eth0 parent 1:1 handle 10: tbf rate 512kbit burst 10kb ``` #### 4. **查看和清理规则** ```bash # 查看当前规则 tc qdisc show dev eth0 # 删除所有规则 sudo tc qdisc del dev eth0 root ``` #### 5. **应用场景示例** - **测试移动应用**:模拟 3G 络(延迟 100ms,带宽 2Mbps,丢包 2%)。 - **验证服务容错**:注入 30% 丢包率,观察服务重连机制。 - **极端络测试**:模拟 99% 丢包或 1000ms 延迟,测试客户端超时逻辑[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fananchong2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值