https://cloud.tencent.com/developer/article/1409664
Traffic control(流量控制)是指在计算机网络中对数据流进行管理和调节的一系列技术手段。它可以用于优化网络性能、提高网络吞吐量、保证网络服务质量(QoS)以及实现网络安全等目的。在Linux系统中,可以使用一些工具和技术来实现流量控制,其中最常用的工具是 tc(Traffic Control)
Linux内核内置了一个Traffic Control框架。能够实现流量限速。流量整形,策略应用(丢弃,NAT等);通过在输出端口处建立一个队列来实现流量控制;限制网卡发送的数据包。
- 队列调度器(Queueing Discipline,qdisc): 队列调度器用于管理数据包的排队和调度。它可以控制数据包的发送顺序、丢包、延迟等。在 tc 中,你可以使用 tc qdisc 命令来配置队列调度器。
- 分类器(Classifier): 分类器用于根据数据包的特征将数据包分成不同的类别。在 tc 中,你可以使用 tc filter 命令来配置分类器。
- 类别(Class): 类别用于对不同类别的数据包进行不同的处理。你可以为每个类别指定特定的处理规则,如带宽限制、延迟、丢包率等。在 tc 中,你可以使用 tc class 命令来配置类别。
#这个命令将在 eth0 接口上添加一个 Token Bucket Filter (TBF) 队列调度器。这个调度器将带宽限制为 1mbps,延迟为 50ms,burst 为 1540 字节
sudo tc qdisc add dev eth0 root tbf rate 1mbit latency 50ms burst 1540
#这个命令将在 eth0 接口上添加一个 netem 队列调度器,增加数据包的延迟为 100ms
sudo tc qdisc add dev eth0 root netem delay 100ms
#这个命令将在 eth0 接口上添加一个 netem 队列调度器,设置数据包丢包率为 10%。
sudo tc qdisc add dev eth0 root netem loss 10%
#这个命令将在 eth0 接口上添加一个 HTB (Hierarchical Token Bucket) 队列调度器,创建两个类别:1:10 和 1:20。其中,1:10 类别的带宽限制为 10mbps,1:20 类别的带宽限制为5mbps
sudo tc qdisc add dev eth0 root handle 1:0 htb default 10
sudo tc class add dev eth0 parent 1:0 classid 1:10 htb rate 10mbit
sudo tc class add dev eth0 parent 1:0 classid 1:20 htb rate 5mbit
不同调度器作用不同:
- Token Bucket Filter (TBF): TBF 是一种基于令牌桶算法的队列调度器,它可以限制网络接口的传输速率,并控制数据包的发送频率。TBF 可以帮助你实现带宽限制、延迟控制和数据包调度等功能,适用于需要限制网络带宽的场景。
- Stochastic Fairness Queueing (SFQ): SFQ 是一种公平队列调度器,它可以确保不同数据流之间的公平共享带宽,避免某些数据流占用过多的带宽资源而导致其他数据流受到影响。SFQ 可以帮助你实现公平的带宽分配和流量调度,适用于多用户共享网络的场景。
- Class-Based Queueing (CBQ): CBQ 是一种基于类别的队列调度器,它可以根据数据包的特性将数据流分成不同的类别,并为每个类别分配特定的带宽和优先级。CBQ 可以帮助你实现流量分类、优先级控制和带宽管理,适用于需要对不同类型的流量进行个性化管理的场景。
- Hierarchical Token Bucket (HTB): HTB 是一种层次化的令牌桶队列调度器,它可以为不同的数据流创建多级队列层次结构,并为每个队列层次分配特定的带宽和优先级。HTB 可以帮助你实现复杂的带宽限制和流量控制策略,适用于需要精细化流量管理和优化的场景。
- Network Emulator (netem): netem 是一种网络仿真队列调度器,它可以模拟网络中的各种条件,如延迟、丢包率、带宽限制等。netem 可以帮助你在测试和开发过程中模拟真实网络环境,评估应用程序在不同网络条件下的性能表现。
应用场景
# 1. 清除现有的队列调度器
sudo tc qdisc del dev eth0 root
# 2. 添加 HTB 根队列调度器
sudo tc qdisc add dev eth0 root handle 1: htb default 30
# 3. 创建一个限速为 1 Mbps 的类别
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 1mbit
# 4. 创建一个默认的类别,使用更小的带宽
sudo tc class add dev eth0 parent 1: classid 1:30 htb rate 512kbit ceil 1mbit
# 5. 添加过滤器匹配所有流量到 1:1 类别
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:1
# 6. 查看配置
tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
#!/bin/bash
# 网络接口
IFACE="eth0"
# 目标 IP 地址
TARGET_IP="192.168.1.100"
# 清除现有的队列调度器
sudo tc qdisc del dev $IFACE root
# 添加 HTB 根队列调度器
sudo tc qdisc add dev $IFACE root handle 1: htb default 30
# 创建限速为 1 Mbps 的类别
sudo tc class add dev $IFACE parent 1: classid 1:1 htb rate 1mbit ceil 1mbit
# 创建默认类别,带宽为 100 Mbps
sudo tc class add dev $IFACE parent 1: classid 1:30 htb rate 100mbit ceil 100mbit
# 添加过滤器匹配目标 IP 地址,将其流量发送到 1:1 类别
sudo tc filter add dev $IFACE protocol ip parent 1:0 prio 1 u32 match ip dst $TARGET_IP/32 flowid 1:1
# 查看配置
tc qdisc show dev $IFACE
tc class show dev $IFACE
tc filter show dev $IFACE
#!/bin/bash
# 虚拟以太网接口
IFACE="veth0"
# 清除现有的队列调度器
sudo tc qdisc del dev $IFACE root
# 添加 HTB 根队列调度器
sudo tc qdisc add dev $IFACE root handle 1: htb
# 创建限速为 1 Mbps 的类别
sudo tc class add dev $IFACE parent 1: classid 1:1 htb rate 1mbit ceil 1mbit
# 将所有流量发送到限速类别
sudo tc filter add dev $IFACE protocol ip parent 1: prio 1 u32 match u32 0 0 flowid 1:1
# 查看配置
tc qdisc show dev $IFACE
tc class show dev $IFACE
tc filter show dev $IFACE
- sudo tc filter add dev $IFACE protocol ip parent 1: prio 1 u32:在设备 $IFACE 上添加一个 u32 过滤器,protocol ip 指定过滤器处理 IP 协议的数据包,parent 1: 表示过滤器隶属于根队列调度器 1:,prio 1 设置过滤器的优先级为 1。
- match u32 0 0:这个匹配条件表示匹配所有数据包,u32 0 0 是一个通用匹配器,匹配所有的数据包头。
- flowid 1:1:将匹配的数据包发送到 1:1 类别
用例:
千兆口限流
tc qdisc add dev vethOut-1 root tbf rate 100mbit burst 100kb latency 10ms