一、相关概念

报文分组从输入网卡(入口)接收进来,经过路由的查找, 以确定是发给本机的,还是需要转发的。如果是发给本机的,就直接向上递交给上层的协议,比如TCP,如果是转发的, 则会从输出网卡(出口)发出。网络流量的控制通常发生在输出网卡处。虽然在路由器的入口处也可以进行流量控制,Linux也具有相关的功能, 但一般说来, 由于我们无法控制自己网络之外的设备, 入口处的流量控制相对较难。本文将集中介绍出口处的流量控制。流量控制的一个基本概念是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系, 每当内核需要将报文分组从网卡发送出去, 都会首先将该报文分组添加到该网卡所配置的队列中, 由该队列决定报文分组的发送顺序。
因此可以说,所有的流量控制都发生在队列中,详细流程图见下图。

二、TC原理介绍

Linux 操作系统中的流量控制器 TC(Traffic Control) 用于Linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控制。TC 模块实现流量控制功能使用的队列规定分为两类,一类是无类队列规定,另一类是分类队列规定。无类队列规定相对简单,而分类队列规定则引出了分类和过滤器等概念,使其流量控制功能增强。
        无类队列规定是对进入网络设备(网卡)的数据流不加区分统一对待的队列规定。使用无类队列规定形成的队列能够接收数据包以及重新编排、延迟或丢弃数据包。这类队列规定形成的队列可以对整个网络设备(网卡)的流量进行整形,但不能细分各种情况。常用的无类队列规定主要有 pfifo_fast(先进先出)、TBF(令牌桶过滤器)、SFQ(随机公平队列)、ID(前向随机丢包)等等。这类队列规定使用的流量整形手段主要是排序、限速和丢包。
        分类队列规定是对进入网络设备的数据包根据不同的需求以分类的方式区分对待的队列规定。数据包进入一个分类的队列后,它就需要被送到某一个类中,也就是说需要对数据包做分类处理。对数据包进行分类的工具是过滤器,过滤器会返回一个决定,队列规定就根据这个决定把数据包送入相应的类进行排队。每个子类都可以再次使用它们的过滤器进行进一步的分类。直到不需要进一步分类时,数据包才进入该类包含的队列排队。除了能够包含其他队列规定之外,绝大多数分类的队列规定还能够对流量进行整形。

二、规则

2.1 流量控制方式

流量控制包括以下几种方式:

  • SHAPING(限制): 当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。
  • SCHEDULING(调度): 通过调度数据包的传输,可以在带宽范围内,按优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。
  • POLICING(策略): SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
  • DROPPING(丢弃): 如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。

2.2 流量控制处理对象

流量的处理由三种对象控制,它们是:

  • qdisc(排队规则)
  • class(类别)
  • filter(过滤器)

2.2.1 qdisc(排队规则)

QDisc(排队规则)是queueing discipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。 qdisc的类别如下:

  • CLASSLESS QDisc(不可分类QDisc)

    • [p|b]fifo: 使用最简单的qdisc,纯粹的先进先出。只有一个参数:limit,用来设置队列的长度,pfifo是以数据包的个数为单位;bfifo是以字节数为单位。
    • pfifo_fast: 在编译内核时,如果打开了高级路由器(Advanced Router)编译选项,pfifo_fast就是系统的标准QDISC。它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。而三个波段(band)的优先级也不相同,band 0的优先级最高,band 2的最低。如果band0里面有数据包,系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配多三个波段(band)里面的。
    • red: red是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非常适合高带宽应用。
    • sfq: sfq是Stochastic Fairness Queueing的简写。它按照会话(session--对应于每个TCP连接或者UDP流)为流量进行排序,然后循环发送每个会话的数据包。
    • tbf: tbf是Token Bucket Filter的简写,适合于把流速降低到某个值。
  • 不可分类qdisc配置: 如果没有可分类QDisc,不可分类QDisc只能附属于设备的根。它们的用法如下:
tc qdisc add dev DEV root QDISC QDISC-PARAMETERS

要删除一个不可分类QDisc,需要使用如下命令:

tc qdisc del dev DEV root

一个网络接口上如果没有设置QDisc,pfifo_fast就作为缺省的QDisc。

  • CLASSFUL QDISC(分类QDisc): 可分类的qdisc包括:

    • CBQ: CBQ是Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富的连接共享类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接(数据链路层)的带宽。
    • HTB: HTB是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用HTB可以很容易地保证每个类别的带宽,它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBF(Token Bucket Filter)实现带宽限制,也能够划分类别的优先级。
    • PRIO: PRIO QDisc不能限制带宽,因为属于不同类别的数据包是顺序离队的。使用PRIO QDisc可以很容易对流量进行优先级管理,只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包。为了方便管理,需要使用iptables或者ipchains处理数据包的服务类型(Type Of Service,ToS)。

2.2.2 class(类)

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

2.2.3 filter(过滤器)

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

2.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的手册页中。

2.4 命名规则

所有的QDisc、类和过滤器都有ID。ID可以手工设置,也可以有内核自动分配。ID由一个主序列号和一个从序列号组成,两个数字用一个冒号分开。

  • QDISC: 一个QDisc会被分配一个主序列号,叫做句柄(handle),然后把从序列号作为类的命名空间。句柄采用象10:一样的表达方式。习惯上,需要为有子类的QDisc显式地分配一个句柄。
  • class: 在同一个QDisc里面的类分享这个QDisc的主序列号,但是每个类都有自己的从序列号,叫做类识别符(classid)。类识别符只与父QDisc有关,和父类无关。类的命名习惯和QDisc的相同。
  • filter: 过滤器的ID有三部分,只有在对过滤器进行散列组织才会用到。详情请参考tc-filters手册页。

2.5 单位

(注意:这里的字节单位的位,而我们平常看到的单位是字节,1字节=8位)

  • 带宽或流速单位:
  • kbps

    千字节/s

    mbps

    兆字节/s

    kbit

    Kbit/s

    mbit

    Mbit/s

    bps或者一个无单位数字

    字节/s

  • 数据数量单位:
  • kb或者k

    千字节

    mb或者m

    兆字节

    mbit

    兆bit

    kbit

    千bit

    b或者一个无单位数字

    字节数

三、TC命令

tc可以使用以下命令对qdisc、类和过滤器进行操作:

add, 在一个节点里加入一个qdisc、类、或者过滤器。添加时,需要传递一个祖先作为参数,传递参数时既可以使用ID也跨越式直接传递设备的根。如果要建立一个qdisc或者过滤器,可以使用句柄(handle)来命名。如果要建立一个类,可以使用类识别符(classid)来命名。

remove, 删除由某个句柄(handle)指定的qdisc,根qdisc(root)也可以删除。被删除qdisc上所有的子类以及附属于各个类的过滤器都会被自动删除。
 
        change, 以替代的方式修改某些条目。除了句柄(handle)和祖先不能修改以外,change命令的语法和add命令相同。换句话说,change命令不能指定节点的位置。

replace, 对一个现有节点进行近于原子操作的删除/添加。如果节点不存在,这个命令就会建立节点。

link, 只适用于qdisc,替代一个现有的节点。        tc命令的格式:

 tc  qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]tc class [ add | change | replace ] dev DEV parent qdisc-id  [  classid class-id ] qdisc [ qdisc specific parameters ]tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific param‐eters ] flowid flow-idtc [ FORMAT ] qdisc show [ dev DEV ]tc [ FORMAT ] class show dev DEVtc filter show dev DEV###### FORMAT := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | i[ec] }

3.1 具体操作

Linux流量控制主要分为建立队列、建立分类和建立过滤器三个方面。
          基本实现步骤。
                   1) 针对网络物理设备(如以太网卡eth0)绑定一个队列qdisc;
                   2) 在该队列上建立分类class;
                   3) 为每一分类建立一个基于路由的过滤器filter;
                   4) 最后与过滤器相配合,建立特定的路由表。

接下来具体为80,22端口设置限流:

1.使用命令ifconfig查看服务器上的网卡信息,比如网卡eth0是用来对外的网络,也就是用户通过该网卡连接到系统,那么我们就对这个网卡进行带宽限制。

ifconfig

2.建立eth0队列

tc qdisc add dev eth0 root handle 1: htb default 20
命令解释:
add :表示要添加,
dev eth0 :表示要操作的网卡为eth0,
root :表示为网卡eth0添加的是一个根队列,
handle 1: 表示队列的句柄为1:,
htb :表示要添加的队列为HTB队列。
default 20: 是htb特有的队列参数,意思是所有未分类的流量都将分配给类别1:20。

3.建立根分类

tc class add dev eth0 parent 1:0 classid 1:1 htb rate 3Mbit
命令解释:
在队列1:0上创建根分类1:1 限速,类别htb,限速3Mbit。
rate 3Mbit:表示系统将为该类别确保3Mbit的带宽。

4.创建分类

tc class add dev eth0 parent 1:1 classid 1:11 htb rate 2Mbit ceil 3Mbit
命令解释:
以根分类1:1为父类创建分类1:11 ,限速 2Mbit ~3Mbit(htb可借用其它类带宽)。
ceil 3Mbit:表示该类别的最高可占用带宽为3mbit。

5.创建过滤器并制定handle

tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 11 fw flowid 1:11
prio 1:您可以设置额外的带宽优先级,prio数值越低优先级越高。
protocol ip:表示该过滤器应该检查报文分组的协议字段。
flowid 1:11: 表示将把该数据流分配给类别1:11。

6.使用iptable对端口绑定tc队列

iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 11
iptables -A OUTPUT -t mangle -p tcp --sport 22 -j MARK --set-mark 11

如果是对IP进行限流,则示例如下: 

tc filter add dev ens160 parent 1:0 protocol ip prio 10  u32 match ip dst 168.160.164.255 flowid 1:11

四、查看和删除规则

1、 主要包括对现有队列、分类、过滤器和路由状况进行监视。

显示队列的状况

## 详细显示指定设备(这里为eth0)的队列状况     tc -s qdisc ls dev eth0

## 详细显示指定设备(这里为eth0)的分类状况 tc -s class ls dev eth0

## 显示过滤器的状况  tc -s filter ls dev eth0

2、删除规则

1、删除过滤器-路由映射

ip route del  192.168.5.100 dev ens33 via 192.168.5.250 realm 11

2、删除过滤器

tc filter del dev eth0 parent 1:0 protocol ip prio 100 route to 10

3、删除队列 tc qdisc del dev eth0 root

LInux 的流量限制相关推荐

  1. linux 网卡流量脚本,每5分钟统计Linux 网卡流量的脚本

    每5分钟统计Linux 网卡流量的脚本 -- 脚本内容 #!/bin/bash eth="eth0" sec=300 echo -ne "date       start ...

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

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

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

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

  4. Linux路由器流量统计系统

    统计分析师:Linux路由器流量统计系统   发布时间:2007.06.27 11:59     来源:赛迪网    作者:skid 本文首先概述三种常用的Linux路由器计费方式,然后详细介绍Lin ...

  5. Linux 网卡流量工具详细介绍【转】

    http://note.youdao.com/yws/public/redirect/share?id=56628acb62dde190f5398ba36622624f&type=false ...

  6. linux的服务器查看流量,查看linux服务器流量的方法总结

    要查看linux服务器流量有点麻烦没那么直观与现成的方法,经使用总结方法有二种,安装第三方和自制shell脚本工具进行查看网卡流量. 方法一: 通用于linux系统,但安装方法有区别,centos系统 ...

  7. Linux网络流量安全审计

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

  8. Linux 网络流量监控工具

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

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

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

  10. linux查看流量开源,Linux流量监控工具 - iftop

    Linux流量监控工具 - iftop -------------------------------------------------------------------------------- ...

最新文章

  1. 计算机应用技术多久退休,Windows 7正式退休 这些解决办法你必须了解
  2. python动态映射_Python Django框架url反向解析实现动态生成对应的url链接示例
  3. 删库不必跑路,谈数据库删除设计
  4. js控制页面滑动加载
  5. Android 极光IM-基础篇
  6. hash冲突(碰撞)及解决方法
  7. JAVA复习总结 一( 详细,干货!)
  8. windows10强制删除文件_Windows10 初装必设置
  9. QImage缩放后图片更清晰处理
  10. windows开启远程Wmi服务支持
  11. Emacs学习笔记(7):简单的配置
  12. ios 发光字体文字的实现
  13. 有道手机词典(安卓版)离线和发音包…
  14. HBuilderX 连接雷电模拟器
  15. 大数据工程师需要学习哪些?
  16. 06 体脂率案例优化
  17. arduino 与java通信_在Java应用程序与Arduino Uno之间建立串口连接
  18. 简单理解数字签名和验签
  19. IoT 恶意软件攻击剖析
  20. 华为交换机开局Telnet配置

热门文章

  1. 服务器显示board板,IBM x3650M4面板Board亮黄灯 故障维修
  2. html中span怎么写,html的span标签怎么使用
  3. 博科Brocade系列光纤交换机报价 程鹏宇 13829750520
  4. OneFlow源码解析:静态图与运行时
  5. android activity是什么呢
  6. Android P如何去掉电池图标和固定电量显示
  7. [填坑]ubuntu 18.04+Windows 10双硬盘双系统修改默认启动顺序
  8. 防火墙的原理、主要技术、部署及其优缺点
  9. 网站如何做域名转移?闲置域名要及时处理
  10. 女孩起名取名字:聪明美丽、好听委婉的女孩名字