一、TC原理介绍

Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。

Linux流量控制的基本原理如下图所示。

接收包从输入接口(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网络流量限速控制相关推荐

  1. Linux 内核 | 网络流量限速方案大 PK

    网络流量限速是一个经久不衰的话题,Linux 内核中已经实现了若干种流量限速的方式. 最简单的方式是通过定期采集速率,在超过指定的速率后直接丢包,但这种方案效果不佳,不能精准地将流量控制在指定的速率. ...

  2. Linux网络流量监控Iftop安装

    2019独角兽企业重金招聘Python工程师标准>>> Linux网络流量监控Iftop主要用来显示本机网络流量情况及各相互通信的流量集合,如单独同那台机器间的流量大小,非常适合于代 ...

  3. linux网络流量实时监控工具之iptraf 【个人比较喜欢用的流量监控软件】

    linux网络流量实时监控工具之iptraf IPTraf是一个网络监控工具,功能比nload更强大,可以监控所有的流量,IP流量,按协议分的流量,还可以设置过滤器等,如下图 对监控网络来说,这个更适 ...

  4. Linux网络流量安全审计

    Linux网络流量安全审计 我从cnaaa.com购买了服务器. 介绍 Netcap (NETwork CAPture) 是一个基于命令行的工具,用于对网络流量进行数据包数据分析,该工具能够捕获网络流 ...

  5. Linux 网络流量监控工具

    Linux 网络流量监控 Linux 网络流量监控是捕获和分析企业的 Linux 网络流量的过程. 为什么要监控 Linux 网络流量 深入了解网络流量对于测量和管理带宽使用情况非常重要.分析 Lin ...

  6. Linux 网络流量监控利器 iftop 中文入门指南

    iftop 是什么 在 Linux 系统下即时监控服务器的网络带宽使用情况,有很多工具,比如 iptraf.nethogs 等等,但是推荐使用小巧但功能很强大的 iftop 工具. iftop 是 L ...

  7. 基于linux网络流量监控与分析软件的设计与实现shell,Shell图形化监控网络流量

    网络流量的监控工具有很多,如:Mrtg.Cacti.Zabbix等等,他们都有着各自的特点,不同的侧重,只为适合不同的应用场景的各种特殊需求.除了网络流量监控工具以外,还有Nagios这样的监控主机状 ...

  8. linux网络流量统计,linux下网络流量监控统计

    最近在做虚拟化迁入评估,其中很重要的一项就是流量的问题.现在部署一个工具和脚本用来统计服务器的网络流量. linux下监控流量的工具有很多,比如ifstat.iftop等. 个人还是喜欢ifstat, ...

  9. Linux网络流量安全审计的神器

    介绍 Netcap (NETwork CAPture) 是一个基于命令行的工具,用于对网络流量进行数据包数据分析. Netcap:安全和可扩展的网络流量分析工具 Netcap 在通过网络流量收集数据包 ...

最新文章

  1. 链表中倒数第k个节点 1
  2. 实战SSM_O2O商铺_48【用户登录】用户登录Dao-Service-Controller-View层的开发
  3. 入门Web前端有哪些误区?该如何避免?
  4. 十大最主流的PHP框架
  5. 删除context node后遗留的问题
  6. 神经网络(11)--具体实现:unrolling parameters
  7. C语言实现魔方阵代码及解析
  8. mysql sysdate 格式化_MySQL函数汇总
  9. XMPP的简介和基本概念
  10. POJ 3264:Balanced Lineup(RMQ模板题)
  11. 22. Declare data members private
  12. window对象小结
  13. webpack配置路径及hash版本号,利用html-webpack-plugin自动生成html模板
  14. ARINC429硬件层初探
  15. php match_PHP8.0新功能之Match表达式的使用
  16. 我在你心中像什么糖?
  17. 计算机在地理数据的应用,地理信息系统(GIS)在环境监测中的应用
  18. 软件测试岗位英文自我介绍,软件测试工程师自我介绍_工程师英文自我介绍范文...
  19. 微信H5移动端真机调试--vConsole
  20. CSDN《原力计划—打卡挑战》为你而来,新升级, 多流量,抓住春季的小尾巴,冲冲冲!

热门文章

  1. autojs Pro免root脚本引擎编写的获取本地时间及网络时间验证
  2. 如何解决Web高并发?
  3. 课设项目之——教学辅助系统(学生考试监考系统)
  4. 旁路openwrt启用ipv6
  5. 《商用密码-应用与安全性评估》学习2:商用密码应用与安全性评估政策法规
  6. 什么是商用密码安全性评估?
  7. 无基础如何准备考初级会计?
  8. 雷军出糗 全球宕机 干扰议会 2018年的智能音箱尴尬往事
  9. 网络安全 ❀ ARP攻击
  10. centos7与win7虚拟机的安装(m1 mac)