LINUX网络流量限速控制
一、TC原理介绍
Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。
Linux流量控制的基本原理如下图所示。
![](/assets/blank.gif)
接收包从输入接口(Input Interface)进来后,经过流量限制(Ingress Policing)丢弃不符合规定的数据包,由输入多路分配器(Input De-Multiplexing)进行判断选择:如果接收包的目的是本主机,那么将该包送给上层处理;否则需要进行转发,将接收包交到转发块(Forwarding Block)处理。转发块同时也接收本主机上层(TCP、UDP等)产生的包。转发块通过查看路由表,决定所处理包的下一跳。然后,对包进行排列以便将它们传送到输出接口(Output Interface)。一般我们只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以我们可以通过改变发送次序来控制传输速率。Linux流量控制主要是在输出接口排列时进行处理和实现的。
Linux的网络流控,控发不控收 , 所以只能对产生瓶颈网卡处的发包速率进行控制.
二、TC规则
1、流量控制方式
流量控制包括以下几种方式:
SHAPING(限制)
当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。
SCHEDULING(调度)
通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。
POLICING(策略)
SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
DROPPING(丢弃)
如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。
2、流量控制处理对象
流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和filter(过滤器)。
QDISC(排队规则)
QDisc(排队规则)是queueing discipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。
CLASS(类)
某些QDisc(排队规则)可以包含一些类别,不同的类别中可以包含更深入的QDisc(排队规则),通过这些细分的QDisc还可以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据流量的优先级。
FILTER(过滤器)
Filter(过滤器)用于为数据包分类,决定它们按照何种QDisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用fileter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和QDISC有关。需要注意的是,filter(过滤器)是在QDisc内部,它们不能作为主体。
3、操作原理
类(Class)组成一个树,每个类都只有一个父类,而一个类可以有多个子类。某些QDisc(例如:CBQ和HTB)允许在运行时动态添加类,而其它的QDisc(例如:PRIO)不允许动态建立类。允许动态添加类的QDisc可以有零个或者多个子类,由它们为数据包排队。此外,每个类都有一个叶子QDisc,默认情况下,这个叶子QDisc使用pfifo的方式排队,我们也可以使用其它类型的QDisc代替这个默认的QDisc。而且,这个叶子叶子QDisc有可以分类,不过每个子类只能有一个叶子QDisc。
当一个数据包进入一个分类QDisc,它会被归入某个子类。我们可以使用以下三种方式为数据包归类,不过不是所有的QDisc都能够使用这三种方式。
tc过滤器(tc filter)
如果过滤器附属于一个类,相关的指令就会对它们进行查询。过滤器能够匹配数据包头所有的域,也可以匹配由ipchains或者iptables做的标记。
服务类型(Type of Service)
某些QDisc有基于服务类型(Type of Service,ToS)的内置的规则为数据包分类。
skb->priority
用户空间的应用程序可以使用SO_PRIORITY选项在skb->priority域设置一个类的ID。
树的每个节点都可以有自己的过滤器,但是高层的过滤器也可以直接用于其子类。
如果数据包没有被成功归类,就会被排到这个类的叶子QDisc的队中。相关细节在各个QDisc的手册页中。
4、命名规则
所有的QDisc、类和过滤器都有ID。ID可以手工设置,也可以有内核自动分配。ID由一个主序列号和一个从序列号组成,两个数字用一个冒号分开。
QDISC
一个QDisc会被分配一个主序列号,叫做句柄(handle),然后把从序列号作为类的命名空间。句柄采用象10:一样的表达方式。习惯上,需要为有子类的QDisc显式地分配一个句柄。
类(CLASS)
在同一个QDisc里面的类分享这个QDisc的主序列号,但是每个类都有自己的从序列号,叫做类识别符(classid)。类识别符只与父QDisc有关,和父类无关。类的命名习惯和QDisc的相同。
过滤器(FILTER)
过滤器的ID有三部分,只有在对过滤器进行散列组织才会用到。
5、单位
tc命令的所有参数都可以使用浮点数,可能会涉及到以下计数单位。
1》带宽或者流速单位:
kbps 千字节/秒
mbps 兆字节/秒
kbit KBits/秒
mbit MBits/秒
bps或者一个无单位数字 字节数/秒
2》数据的数量单位:
kb或者k 千字节
mb或者m 兆字节
mbit 兆bit
kbit 千bit
3》时间的计量单位:
s、sec或者secs 秒
ms、msec或者msecs 分钟
us、usec、usecs或者一个无单位数字 微秒
三、具体操作场景测试
Linux流量控制主要分为建立队列、建立分类和建立过滤器三个方面。
1、基本实现步骤为:
(1) 针对网络物理设备(如以太网卡ens32)绑定一个队列QDisc;
(2) 在该队列上建立分类class;
(3) 根据需要建立子队列和子分类;
(4) 为每个分类建立过滤器。
2、环境模拟实例:
流量控制器上的以太网卡(ens32) 的IP地址为192.168.100.100。
假如有三种类型的流量需要控制:
1) 是发往主机1的,其IP地址为192.168.100.101。其流量带宽控制在30Mbit,优先级为2;
2) 是发往主机2的,其IP地址为192.168.100.102。其流量带宽控制在20Mbit,优先级为1;
3) 是发往子网1的,其子网号为192.168.101.*,子网掩码为255.255.255.0。流量带宽控制在10Mbit,优先级为6。
a. 建立队列
一般情况下,针对一个网卡只需建立一个队列。
首先,需要为网卡ens32配置一个HTB队列,使用下列命令:
tc qdisc add dev ens32 root handle 10: htb default 256
这里,命令中的"add 表示要添加,"dev ens32 表示要操作的网卡为ens32。"root 表示为网卡ens32添加的是一个根队列。"handle 10: 表示队列的句柄为10:。"htb 表示要添加的队列为HTB队列。命令最后的"default 256 是htb特有的队列参数,意思是所有未分类的流量都将分配给类别10:256。
b、为根队列创建相应的类别
可以利用下面这三个命令为根队列10创建三个类别,分别是10:11、10:12和10:13,它们分别占用30、20和10mb的带宽。
tc class add dev ens32 parent 10: classid 10:1 htb rate 30mbit ceil 30mbit
tc class add dev ens32 parent 10: classid 10:2 htb rate 20mbit ceil 20mbit
tc class add dev ens32 parent 10: classid 10:3 htb rate 10mbit ceil 10mbit
命令中,"parent 10:"表示类别的父亲为根队列1:。"classid10:1"表示创建一个标识为10:1的类别,"rate 30mbit"表示系统将为该类别确保带宽30mbit,"ceil 30mbit",表示该类别的最高可占用带宽为30mbit。
c、为各个类别设置过滤器
创建三个过滤器,如下面的三个命令:
tc filter add dev ens32 parent 10: protocol ip prio 2 handle 100 fw classid 10:1
tc filter add dev ens32 parent 10: protocol ip prio 1 handle 200 fw classid 10:2
tc filter add dev ens32 parent 10: protocol ip prio 6 handle 300 fw classid 10:3
d、结合iptables限速
iptables -t mangle -A POSTROUTING -d 192.168.100.101 -j MARK --set-mark 100
iptables -t mangle -A POSTROUTING -d 192.168.100.102 -j MARK --set-mark 200
iptables -t mangle -A POSTROUTING -d 192.168101.0/24 -j MARK --set-mark 300
e、取消限速操作
tc qdisc del dev ens32 root
iptables -t mangle -F
LINUX网络流量限速控制相关推荐
- Linux 内核 | 网络流量限速方案大 PK
网络流量限速是一个经久不衰的话题,Linux 内核中已经实现了若干种流量限速的方式. 最简单的方式是通过定期采集速率,在超过指定的速率后直接丢包,但这种方案效果不佳,不能精准地将流量控制在指定的速率. ...
- Linux网络流量监控Iftop安装
2019独角兽企业重金招聘Python工程师标准>>> Linux网络流量监控Iftop主要用来显示本机网络流量情况及各相互通信的流量集合,如单独同那台机器间的流量大小,非常适合于代 ...
- linux网络流量实时监控工具之iptraf 【个人比较喜欢用的流量监控软件】
linux网络流量实时监控工具之iptraf IPTraf是一个网络监控工具,功能比nload更强大,可以监控所有的流量,IP流量,按协议分的流量,还可以设置过滤器等,如下图 对监控网络来说,这个更适 ...
- Linux网络流量安全审计
Linux网络流量安全审计 我从cnaaa.com购买了服务器. 介绍 Netcap (NETwork CAPture) 是一个基于命令行的工具,用于对网络流量进行数据包数据分析,该工具能够捕获网络流 ...
- Linux 网络流量监控工具
Linux 网络流量监控 Linux 网络流量监控是捕获和分析企业的 Linux 网络流量的过程. 为什么要监控 Linux 网络流量 深入了解网络流量对于测量和管理带宽使用情况非常重要.分析 Lin ...
- Linux 网络流量监控利器 iftop 中文入门指南
iftop 是什么 在 Linux 系统下即时监控服务器的网络带宽使用情况,有很多工具,比如 iptraf.nethogs 等等,但是推荐使用小巧但功能很强大的 iftop 工具. iftop 是 L ...
- 基于linux网络流量监控与分析软件的设计与实现shell,Shell图形化监控网络流量
网络流量的监控工具有很多,如:Mrtg.Cacti.Zabbix等等,他们都有着各自的特点,不同的侧重,只为适合不同的应用场景的各种特殊需求.除了网络流量监控工具以外,还有Nagios这样的监控主机状 ...
- linux网络流量统计,linux下网络流量监控统计
最近在做虚拟化迁入评估,其中很重要的一项就是流量的问题.现在部署一个工具和脚本用来统计服务器的网络流量. linux下监控流量的工具有很多,比如ifstat.iftop等. 个人还是喜欢ifstat, ...
- Linux网络流量安全审计的神器
介绍 Netcap (NETwork CAPture) 是一个基于命令行的工具,用于对网络流量进行数据包数据分析. Netcap:安全和可扩展的网络流量分析工具 Netcap 在通过网络流量收集数据包 ...
最新文章
- 链表中倒数第k个节点 1
- 实战SSM_O2O商铺_48【用户登录】用户登录Dao-Service-Controller-View层的开发
- 入门Web前端有哪些误区?该如何避免?
- 十大最主流的PHP框架
- 删除context node后遗留的问题
- 神经网络(11)--具体实现:unrolling parameters
- C语言实现魔方阵代码及解析
- mysql sysdate 格式化_MySQL函数汇总
- XMPP的简介和基本概念
- POJ 3264:Balanced Lineup(RMQ模板题)
- 22. Declare data members private
- window对象小结
- webpack配置路径及hash版本号,利用html-webpack-plugin自动生成html模板
- ARINC429硬件层初探
- php match_PHP8.0新功能之Match表达式的使用
- 我在你心中像什么糖?
- 计算机在地理数据的应用,地理信息系统(GIS)在环境监测中的应用
- 软件测试岗位英文自我介绍,软件测试工程师自我介绍_工程师英文自我介绍范文...
- 微信H5移动端真机调试--vConsole
- CSDN《原力计划—打卡挑战》为你而来,新升级, 多流量,抓住春季的小尾巴,冲冲冲!