一、概念
Linux操作系统中的流量控制器TC;Traffic Control;用于Linux内核的流量控制;比如;数据包的接收速率、发送速率、多个数据包的发送顺序等。
Traffic Control的作用包括以下几种:
- 调整(Shaping): 通过推迟数据包发送来控制发送速率;只用于网络出方向(egress)
- 时序(Scheduling);调度不同类型数据包发送顺序;比如在交互流量和批量下载类型数据包之间进行发送顺序的调整。只用于网络出方向(egress)
- 监督(Policing): 根据到达速率决策接收还是丢弃数据包;用于网络入方向(ingress)
- 丢弃(Dropping): 根据带宽丢弃数据包;可以用于出入两个方向
二、基本原理
tc由qdisc、fitler和class三部分组成;
1、qdisc:
要实现流量控制;需要通过队列将数据包缓存起来;用来控制网络收发的速度。在Linux实现中;把这种包括数据结构和算法实现的控制机制抽象为结构队列规程:Queuing discipline;简称为qdisc。qdisc对外暴露两个回调接口enqueue和dequeue分别用于数据包入队和数据包出队;而具体的排队算法实现则在qdisc内部隐藏。
实际上;每个网卡都有一个关联的qdisc。它包括以下几种;
- 无分类qdisc;只能应用于root队列;
- [p|b]fifo;简单先进先出
- pfifo_fast;根据数据包的tos将队列划分到3个band;每个band内部先进先出
- red;Random Early Detection;带带宽接近限制时随机丢包;适合高带宽应用
- sfq;Stochastic Fairness Queueing;按照会话对流量排序并循环发送每个会话的数据包
- tbf;Token Bucket Filter;只允许以不超过事先设定的速率到来的数据包通过 , 但可能允许短暂突发流量朝过设定值
- 有分类qdisc;可以包括多个队列;
- cbq;Class Based Queueing;借助EWMA(exponential weighted moving average, 指数加权移动均值 ) 算法确认链路的闲置时间足够长 , 以达到降低链路实际带宽的目的。如果发生越限 ,CBQ 就会禁止发包一段时间。
- htb;Hierarchy Token Bucket;在tbf的基础上增加了分层
- prio;分类优先算法并不进行整形 , 它仅仅根据你配置的过滤器把流量进一步细分。缺省会自动创建三个FIFO类。
2、filter;
用来将数据包划分到具体的控制策略中
- u32;根据协议、IP、端口等过滤数据包
- fwmark;根据iptables MARK来过滤数据包
- tos;根据tos字段过滤数据包
3、class;
用来表示具体的控制策略;只用于有分类的qdisc上。每个class要么包含多个子类;要么只包含一个子qdisc。当然;每个class还包括一些列的filter;控制数据包流向不同的子类;或者是直接丢掉。
基于qdisc, class和filter种三元素可以构建出非常复杂的树形qdisc结构;极大扩展流量控制的能力。
ref;
Linux Traffic Control | Houmin
流量控制 · GitBook
TC - Linux 流量控制工具 | Life is magic. Coding is art.
linux tc流量控制;一;;classless qdisc - 知乎
https://tldp.org/HOWTO/Traffic-Control-HOWTO/
Linux流量控制(Traffic Control)介绍 | Just For Coding
TC 流量控制工具