TC 简介及原理

tc 是 Linux 系统中的一个工具,全名为traffic control(流量控制), 主要是通过在输出端口处建立一个队列来实现流量控制。tc 可以用来控制 netem 的工作模式,也就是说,想要使用 netem ,则需要内核开启了 netem,而且安装了 tc工具。

tc 控制的是发包动作,不能控制收包动作。它直接对物理接口生效,如果控制了物理的eth0,那么逻辑网卡(比如eth0:1)也会受到影响,反之则不行,控制逻辑网卡是无效的

img

接收包从输入接口(Input Interface)进来后,经过流量限制(Ingress Policing)丢弃不符合规定的数据包,由输入多路分配器(Input De-Multiplexing)进行判断选择:如果接收包的目的是本主机,那么将该包送给上层处理;否则需要进行转发,将接收包交到转发块(Forwarding Block)处理。转发块同时也接收本主机上层(TCP、UDP等)产生的包。转发块通过查看路由表,决定所处理包的下一跳。然后,对包进行排列以便将它们传送到输出接口(Output Interface)。一般我们只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以我们可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。

TC 基础使用

  • 模拟延迟传输:tc qdisc add dev eth0 root netem delay 100ms, 可以通过ping的方式验证是否增加效果成功

  • 模拟延迟波动:tc qdisc add dev eth0 root netem delay 100ms 10ms

  • 延迟波动随机性:tc qdisc add dev eth0 root netem delay 100ms 10ms 30%

  • 模拟网络丢包:tc qdisc add dev eth0 root netem loss 1%

  • 网络丢包成功率:tc qdisc add dev eth0 root netem loss 1% 30%

  • 删除相关配置:tc qdisc del dev eth0 root netem delay 100ms

  • 模拟包重复:tc qdisc add dev eth0 root netem duplicate 1%

  • 模拟包损坏:tc qdisc add dev eth0 root netem corrupt 0.2%

  • 查看网卡配置:tc qdisc show dev eth0

  • 查看丢包率:tc -s qdisc show dev eth0

针对ip段下载速率控制

1
2
3
4
5
6
7
8
9
tc qdisc del dev eth0 root handle 1:       # 删除控制1:
tc qdisc add dev eth0 root handle 1: htb r2q 1         # 添加控制1:
tc class add dev eth0 parent 1: classid 1:1 htb rate 12mbit ceil 15mbit          # 设置速率
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 10.10.10.1/24 flowid 1:1    # 指定ip段控制规则

# 检查命令
tc -s -d qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0为

限制上传下载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
tc qdisc del dev tun0 root
tc qdisc add dev tun0 root handle 2:0 htb
tc class add dev tun0 parent 2:1 classid 2:10 htb rate 30kbps
tc class add dev tun0 parent 2:2 classid 2:11 htb rate 30kbps
tc qdisc add dev tun0 parent 2:10 handle 1: sfq perturb 1
tc filter add dev tun0 protocol ip parent 2:0 u32 match ip dst 10.18.0.0/24 flowid 2:10
tc filter add dev tun0 parent ffff: protocol ip u32 match ip src 10.18.0.0/24 police rate 30kbps burst 10k drop flowid 2:11

tc qdisc del dev tun0 root               # 删除原有策略
tc qdisc add dev tun0 root handle 2:0 htb               # 定义最顶层(根)队列规则,并指定 default 类别编号,为网络接口 eth1 绑定一个队列,类型为 htb,并指定了一个 handle 句柄 2:0 用于标识它下面的子类
tc class add dev tun0 parent 2:1 classid 2:10 htb rate 30kbps  # 设置一个规则速度是30kbps
tc class add dev tun0 parent 2:2 classid 2:11 htb rate 30kbps
tc qdisc add dev tun0 parent 2:10 handle 1: sfq perturb 1      # 调用随机公平算法
tc filter add dev tun0 protocol ip parent 2:0 u32 match ip dst 10.18.0.0/24 flowid 2:10  # 规则2:10应用在目标地址上,即下载
tc filter add dev tun0 parent ffff: protocol ip u32 match ip src 10.18.0.0/24 police rate 30kbps burst 10k drop flowid 2:11 # 上传限速

该文章内容收集于网络。