TC限速原理和TC限速的实现
admin
2023-01-25 07:41:45
0次

这篇文章主要为大家分享TC限速的实现步骤。文中还介绍了TC限速原理和TC限速的队列规则分类器等,希望大家通过这篇文章能有所收获。


一.TC限速相关介绍

1.TC限速原理介绍
Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。
接收包从输入接口进来后,经过流量限制丢弃不符合规定的数据包,由输入多路分配器进行判断选择,如果接收包的目的主机是本主机,那么将该包送给上层处理,否则需要进行转发,将接收包交到转发块(Forwarding Block)处理。转发块同时也接收本主机上层(TCP、UDP等)产生的包,通过查看路由表,决定所处理包的下一跳。然后,对包进行排列以便将它们送到输出接口。
从以上介绍可以看出,TC只能对网卡发出的数据包做分类限制,不能对网卡接收的数据包做分类限制,但是可以对网卡接收的数据包流量做一个整体限制。因为我们项目中只需要对网卡接收的流量做整体限制,所以TC刚好可以满足我们对网卡流量双向限制的要求。

2.TC限速基本概念介绍
TC对流量的处理由三种对象控制,它们是:
队列规则 qdisc(queueing discipline)
类(class)
分类器(Classifiers).

qdisc队列规则(queueing discipline)
qdisc(队列规则)是queueing discipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的qdisc是pfifo,它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。
可分类的qdisc包括:
(1)CBQ
CBQ是Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富的连接共享类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接(数据链路层)的带宽。
(2)HTB
HTB是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用HTB可以很容易地保证每个类别的带宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBF(Token Bucket Filter)实现带宽限制,也能够划分类别的优先级。
(3)PRIO
PRIO qdisc不能限制带宽,因为属于不同类别的数据包是顺序离队的。使用PRIO qdisc可以很容易对流量进行优先级管理,只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包。为了方便管理,需要使用iptables或者ipchains处理数据包的服务类型(Type Of Service,ToS)。

Class 类
某些qdisc可以包含一些类别,不同的类别中可以包含更深入的qdisc,通过这些细分的qdisc还可以为进入队列的数据包排队。通过设置各种类别数据包的离队次序,qdisc可以设置网络数据流量的优先级。

Filter 规则
Filter(过滤器)用于为数据包分类,决定它们按照何种qdisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用fileter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和qdisc有关。需要注意的是,filter(过滤器)是在qdisc内部,它们不能作为主体。

二.TC限速操作

1.虚拟机流入流量限制
(1)清除tap01网卡设备上所有的流入规则,防止与新添加的规则冲突。
# tc qdisc del dev tap01 root
(2)在网络设备tap01上绑定一个htb类型的qdisc根队列
# tc qdisc add dev tap01 root handle 1: htb default 9999
(3)在qdisc根队列1:下创建一个子类1:5,并设置子类的流量速率为50Mb/s
# tc class add dev tap01 parent 1: classid 1:5 htb rate 50Mbit burst 1Mbit
(4)为子类1:5添加随机公平队列sfq,防止该类被某一会话连接独占
# tc qdisc add dev tap01 parent 1:5 handle 5: sfq perturb 10
(5)为子类1:5添加过滤器,用来将目标地址为0.0.0.0/0(指所有网络)的数据包发往类1:5,使用其中的规则出队
# tc filter add dev tap01 parent 1: protocol ip prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:5
注: tap01为虚拟机连接到网桥的网卡,与虚拟机内部的网卡一一对应。因tap01口的出方向的流量就是进入虚拟机内部网卡的流量,所以限制tap01口的出方向的流量,就可以限制流入虚拟机的网络流量。

2.虚拟机流出流量限制
(1)清除tap01网卡设备上所有的流入规则,防止与新添加的规则冲突。
# tc qdisc del dev tap01 ingress
(2)在网络设备tap01上绑定一个处理ingress流量的qdisc根队列
# tc qdisc add dev tap01 ingress handle ffff:
(3)为类ffff:添加过滤器,并限制流量为50Mb/s
# tc filter add dev tap01 parent ffff: protocol all prio 1 basic police rate 50Mbit burst 10Mbit mtu 65535 drop
注: tap01为虚拟机连接到网桥的网卡,与虚拟机内部的网卡一一对应。因tap01口的入方向的流量就是虚拟机内部网卡发出的流量,所以限制tap01口的入方向的流量,即可限制流出虚拟机的网络流量。
命令中的数字10和65535存在关联性,需要一起修改,否则会导致限速不准确。

看完上述内容,你们对TC限速原理和TC限速的实现大概了解了吗?如果想了解更多相关文章内容,欢迎关注行业资讯频道,感谢各位的阅读!

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...