1 HTB(Hierarchical Token Bucket, 分层的令牌桶)

HTB 使用令牌和存储桶的概念,以及基于类的系统和过滤器,以允许对流量进行复杂和精细的控制。借助复杂的借用模型,HTB 可以执行各种复杂的流量控制技术。该队列规则允许用户定义所使用的令牌和桶的特征,并允许用户以任意方式嵌套这些桶。当与分类方案结合使用时,可以非常精细地控制流量。HTB 非常适用于这种情况:如果有一个固定速率的链路,希望分割给多种不同的用途使用,为每种用途做出带宽承诺并实现定量的带宽借用。HTB 不同于 CBQ 的是并不靠计算闲置时间来整形。它是一个分类的令牌桶过滤器。

1.1 HTB 的参数介绍

default

每个 HTB 队列的可选参数,默认值为 0,其意义是任何未分类的流量以物理网卡的速率出队,完全绕过连接到根队列的任何分类。如果指定了 default 的值,未分类(不能和 filter 匹配)的流量(默认的)会被送到这个参数所指定的类中。

rate

用来设置限制传输的流量速率。

ceil

用来设置限制传输流量的最大所需速率。如果需要设置共享带宽,则需使用此参数。这个参数可以被认为相当于“可突发带宽”

burst

桶的大小。前面在讨论不可分类的队列规则时提到过令牌桶过滤器 TBF,桶的概念就是其中的令牌,用于处理数据的传输时必要的参数,如果需要具体了解可以参考前面的内容

cburst

这是 ceil 桶的大小。在等待更多的令牌到来之前,HTB 会使 cburst 字节出列。这里涉及令牌流与数据流的概念与关系,具体可参考前面不可分类的队列规定

quantum

每轮当前的类能发送的字节数,这是用来控制租借带宽的关键参数。其默认计算 quantum = rate / r2q。quantum 必须大于 1500 小于 60000。quantum 只在 class 的流量超过了 rate 但是没有超过 ceil 时使用,它的值越小,带宽共享的效果就越好。

 

1.2 配置范例 

这个配置把 WEB 服务器的流量控制为 5Mbps、SMTP 流量控制在 3Mbps。而且二者一共不得超过 6Mbps,互相之间允许借用带宽。

# sudo tc qdisc add dev enp0s5 root handle 1: htb default 30
# sudo tc class add dev enp0s5 parent 1:0 classid 1:1 htb rate 6Mbit burst 15k # sudo tc class add dev enp0s5 parent 1:1 classid 1:10 htb rate 5Mbit burst 15k
# sudo tc class add dev enp0s5 parent 1:1 classid 1:20 htb rate 3Mbit ceil 6Mbit burst 15k # sudo tc class add dev enp0s5 parent 1:1 classid 1:30 htb rate 1kbit ceil 6Mbit burst 15k 

在那些类的下方放置 SFQ:

# sudo tc qdisc add dev enp0s5 parent 1:10 handle 10: sfq perturb 10 # sudo tc qdisc add dev enp0s5 parent 1:20 handle 20: sfq perturb 10 # sudo tc qdisc add dev enp0s5 parent 1:30 handle 30: sfq perturb 10 

添加过滤器,直接把流量导向相应的类:

# U32="sudo tc filter add dev enp0s5  protocol ip parent 1:0 prio 1 u32" # $U32 match ip dport 80 0xffff flowid 1:10
# $U32 match ip sport 25 0xffff flowid 1:20 

如果 10: 和 20: 都得到了保证的速率,剩下的就是分割了,它们借用的比率是 5:3。未被分类的流量被送到了 30:,仅有一点点带宽,但是却可以任意借用剩下的带宽。因为其内部使用了 SFQ,而可以公平发包。

控制服务器对外的速度为 20Mbit,服务器只能向外发 20Mbit 的数据包。

# sudo tc qdisc del dev enp0s5 root 2> /dev/null > /dev/null# sudo tc qdisc add dev enp0s5 root handle 1: htb# sudo tc class add dev enp0s5 parent 1:0 classid 1:1 rate 100Mbit ceil 100Mbit# sudo tc class add dev enp0s5 parent 1:1 classid 1:10 rate 20Mbit ceil 20Mbit# sudo tc qdisc add dev enp0s5 parent 1:10 sfq perturb 10# sudo tc filter add dev enp0s5 protocol ip parent 1:0 prio 2 u32 match ip dst 192.168.224.60 flowid 1:1# sudo tc filter add dev enp0s5 protocol ip parent 1:0 prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:10

上面的命令中创建了两个分类,第一个分类的速率为 100Mbit,假设服务器的 IP 为 192.168.224.60,第一个过滤器是用来处理发往服务器的数据包,让所有发往服务器的数据包由 1:1 直接处理,相当于不受限制。而发往其他目标主机的数据包由 1:10 处理,即服务器只能向外发送 20Mbit 的数据包。如果这里只创建了一个分类,即上面的 1:10,则所有没有被分类的数据包会被网卡直接处理,也能达到不对其限制的目的,但是发往服务器的数据包也会被 1:10 所处理,但这并不是我们所需要的,因此需要再创建一个分类,用来单独处理发往服务器的数据包,使其不受限制,这个分类的速率可以尽情的设置很大。

2 使用过滤器对数据包进行分类 

为了决定用哪个类处理数据包,必须调用“分类器链”进行选择。这个链中包含了这个分类队列规定所需的所有过滤器。在前面的队列规定中已经用到了过滤器对数据分类进行处理了,但是没有做任何介绍,这里先对其简单的说明,后面会对常用的过滤器再做稍微详细的说明。

重复前面那棵树:

当一个数据包入队的时候,每一个分支处都会咨询过滤器链如何进行下一步。典型的配置是在 1:1 处有一个过滤器把数据包交给 12:,然后 12: 处的过滤器在把包交给 12:2。你可以把后一个过滤器同时放在 1:1 处,从而提高效率。另外,不能用过滤器把数据包向“上”送。而且,使用 HTB 的时候应该把所有的规则放到根上。再次强调:数据包只能向“下”进行入队操作,只有出队的时候才会上到网卡所在的位置来。他们不会落到树的最底层后送到网卡。

2.1 过滤器的一些简单范例

下面我们就开始,从简单地匹配一些比较明显的特征开始。比方说,我们有一个 PRIO 队列规定,叫做“10:”,包含 3 个类,我们希望把去往 22 口的数据流发送到最优先的频道中去。应该这样设置过滤器:

# sudo tc filter add dev enp0s5 protocol ip parent 10: prio 1 u32 match ip dport 22 0xffff flowid 10:1 
# sudo tc filter add dev enp0s5 protocol ip parent 10: prio 1 u32 match ip sport 80 0xffff flowid 10:1 
# sudo tc filter add dev enp0s5 protocol ip parent 10: prio 2 flowid 10:2 

上述配置是说:向 enp0s5 上的 10: 节点添加一个 u32 过滤规则,它的优先权是 1,凡是去往 22 端口(精确匹配)的 IP 数据包,发送到频道 10:1。向 enp0s5 上的 10: 节点添加一个 u32 过滤规则,它的优先权是 1,凡是来自 80 端口(精确匹配)的 IP 数据包,发送到频道 10:1。向 enp0s5 上的 10: 节点添加一个过滤规则,它的优先权是 2,凡是上面未匹配的 IP 数据包,发送到频道 10:2。别忘了添加“dev enp0s5”(你的网卡或许叫别的名字),因为每个网卡的句柄都有完全相同的命名空间。如果想通过 IP 地址进行筛选,可以采用如下命令: 


# sudo tc filter add dev enp0s5 parent 10:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1 
# sudo tc filter add dev enp0s5 parent 10:0 protocol ip prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1 
# sudo tc filter add dev enp0s5 protocol ip parent 10: prio 2 flowid 10:2

这个例子把去往 4.3.2.1 和来自 1.2.3.4 的数据包送到了最高优先的队列,其它的则送到次高优先的队列。可以连续使用 match,如果想匹配来自 1.2.3.4 的 80 口的数据包,可以做如下配置:

# sudo tc filter add dev enp0s5 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match ip sport 80 0xffff flowid 10:1

2.2 常用到的过滤命令一览

这里列出的绝大多数命令都根据这个命令改编而来:

# sudo tc filter add dev enp0s5 parent 1:0 protocol ip prio 1 u32 ⋯⋯

这些是“u32”的匹配,可以匹配数据包的任意部分。

根据源/目的地址:

源地址段  'match ip src 1.2.3.0/24'

目的地址段  'match ip dst 4.3.2.0/24'

单个 IP 地址使用“/32”作为掩码即可。

根据源/目的端口,所有 IP 协议:

源 'match ip sport 80 0xffff'

目的 'match ip dport 80 0xffff'

根据 IP 协议(tcp, udp, icmp, gre, ipsec) :

使用 /etc/protocols 所指定的数字。比如: icmp 是 1: 'match ip protocol 1 0xff'。

根据 fwmark:

可以使用 ipchains/iptables 给数据包做上标记,并且这个标记会在穿过网卡的路由过程中保留下来。如果希望对来自 eth0 并从 eth1 发出的数据包做整形,这就很有用了。语法是这样的:

# sudo tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6fw flowid 1:1 

注意,这不是一个 u32 匹配。可以象这样给数据包打标记:

# sudo iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6

数字 6 是可以任意指定的。

按TOS 字段:

选择交互和最小延迟的数据流:

# sudo tc filter add dev enp0s5 parent 1:0 protocol ip prio 10 u32 atch ip tos 0x10 0xff flowid 1:4 

想匹配大量传输的话,使用“0x08 0xff”。

转载于:https://www.cnblogs.com/chenjin2018/p/10123981.html

Linux内核TC工具链路带宽设计--HTB队列规定及简单的过滤器介绍相关推荐

  1. Linux内核TC工具链路带宽设计--CBQ队列规定

    1.1 著名的 CBQ 队列规定 除了可以分类之外,CBQ 也是一个整形器.如果想把一个 10Mbps 的连接整形成 1Mbps 的速率,就应该让链路 90%的时间处于闲置状态,必要的话就强制,以保证 ...

  2. Linux内核TC工具链路带宽设计--无类队列规定

    Linux 内核的 TC(traffic control)工具可以用来对网络带宽做一定的设计和管理,这里将对这一工具的使用做一定的介绍,在正式开始介绍TC 之前,先对一些基本的单位做一个说明.为了避免 ...

  3. 孙玄辜教授:基于Linux内核的时间轮算法设计实现【附代码】

    文章目录 1.时间轮算法基本思想 2.定时器的添加 3.定时器到期处理 孙玄:毕业于浙江大学,现任转转公司首席架构师,技术委员会主席,大中后台技术负责人(交易平台.基础服务.智能客服.基础架构.智能运 ...

  4. linux下载流量和上传流量,通过linux的tc工具简单实现上传和下载的流量控制

    1.  实现原理: Linux内核版本2.4以上,就开始支持网络传输带宽控制(Traffic Contol),可以控制某个网卡的包发送延迟时间和带宽分配. 实现对网络下载速率的控制可以直接通过tc命令 ...

  5. linux内核发包工具,Linux内核发包工具pktgen测试方案说明

    简介 pktgen是Linux内核里包含的一个高性能发包工具,主要用来测试网络性能.一般情况下,使用pktgen就可以满足千兆网卡的测试需要. pktgen运行在"内核态",并不占 ...

  6. 嵌入式linux内核开启键盘,- 基于嵌入式Linux内核的特殊矩阵键盘设计完整驱动控制模块方案...

    首先设置输入设备的功能,input_set_capability(&sim_key,EV_KEY,KEY_A)函数完成键盘A键的输入使能,类似可完成B-X共24个按键的输入使能.然后设置键盘的 ...

  7. linux 内核分析工具 Dtrace、SystemTap、火焰图、crash等

    << System语言详解 >> 关于 SystemTap 的书. 我们在分析各种系统异常和故障的时候,通常会用到 pstack(jstack) /pldd/ lsof/ tc ...

  8. 在Linux内核层面集成图形界面,技德操作系统(Jide OS)详细介绍

    技德操作系统(Jide OS)是一款采用Linux内核的国产操作系统,兼容性好且功能强大,为用户提供个人电脑和移动设备良好体验的国产研发操作系统.它实现了跨平台的CPU指令集兼容.跨平台应用兼容.跨平 ...

  9. Linux内核性能测试工具全景图

    1.Linux性能监控工具及对应的内核层 2.Linux性能基础测试工具及对应内核层 3.Linux性能监控工具Sar及对应内核层 4.Linux性能调优工具及对应的内核层

最新文章

  1. 柜位预測(一)——显示柜位曲线图
  2. 【转】用例结构优化心得
  3. c++ primer 5th,习题13.3 答案是不是错了?(未解决)
  4. settype where used list - set type where use list - equipment download environme
  5. equals, hashCode, toString方法重写,深入探究equals
  6. mysql大量数据合并_mysql中将多行数据合并成一行数据
  7. 索要 2.3 亿元赎金!富士康遭遇黑客攻击
  8. java11新特性_Java11 发布前抓紧掌握这些新特性
  9. golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法
  10. mysql 垂直分表技术的实战演练,有实战代码。
  11. Spark MLlib(一)正则化特征
  12. CMU15213 Intro to Computer Systems学习笔记(14) Exceptional Control Flow: Signals and Nonlocal Jumps
  13. VMware密钥激活
  14. ps制作计算机考试证件照,证件照电子版怎么弄-利用PS制作证件照的简单小教程,可以直接拿去打印了...
  15. jmp软件(jMP软件正交设计交互作用)
  16. 有关Intel主板驱动静默安装的一个坑
  17. C++判断一个数是否是质数(极简版)
  18. 第四周项目3--单链表应用之逆置
  19. 软件集成测试采用,集成测试的组成以及流程
  20. 俞敏洪:人生最重要的两件事是什么?

热门文章

  1. 魅族浏览器android,魅族浏览器,Flyme让原配更懂你
  2. 一套完整的大型三甲医院信息管理(HIS)系统源码【免费分享源代码 】
  3. 【送书福利-第五期】《网络结构数据分析与应用》
  4. error: .repo/manifests/: contains uncommitted changes
  5. 【电源专题】案例:用电子负载模拟电池测试充电芯片
  6. STM32定时器同步功能1
  7. STM32之添加工程文件(参考洋桃电子视频)
  8. 关于视频中的速率问题,海思视频速率(高速信号与高频信号区分与解释)
  9. 新大陆物联网竞赛-Android开发-导入JAR包与添加依赖
  10. 听完玉伯的直播,我学到了这些。