• linux tc 带宽限速


    流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和filter(过滤器)。
    qdisc 分类:
    # todo 1.CLASSLESS QDisc(不可分类QDisc)
    [p|b]fifo
    使用最简单的qdisc,纯粹的先进先出。只有一个参数:limit,用来设置队列的长度,pfifo是以数据包的个数为单位;bfifo是以字节数为单位。

    pfifo_fast
    在编译内核时,如果打开了高级路由器(Advanced Router)编译选项,pfifo_fast就是系统的标准QDISC。它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。而三个波段(band)的优先级也不相同,band 0的优先级最高,band 2的最低。如果band里面有数据包,系统就不会处理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的简写,适合于把流速降低到某个值。

    # todo 2.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可以很容易对流量进行优先级管理,
    只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包
    FILTER(过滤器)
    Filter(过滤器)用于为数据包分类,决定它们按照何种QDisc进入队列
    TC 中的 Filter 规则
    filter 用来将用户划入到具体的控制策略中(即不同的 class 中).比如,现在,我们想对 xxa,xxb两个 IP 实行不同的控制策略(A,B),这时,我们可用 filter 将 xxa 划入到控制策略 A,将 xxb 划入到控制策略 B,filter 划分的标志位可用 u32 打标功能或 IPtables的 set-mark (大多使用iptables 来做标记)功能来实现。
    目前,TC 可以使用的过滤器有:fwmark 分类器,u32 分类器,基于路由的分类器和 RSVP分类器(分别用于 IPV6、IPV4)等;其中,fwmark分类器允许我们使用 Linux netfilter 代码选择流量,而 u32 分类器允许我们选择基于 ANY 头的流量 .需要注意的是,filter (过滤器)是在 QDisc 内部,它们不能作为主体。
    4、命名规则
    所有的QDisc、类和过滤器都有ID。ID可以手工设置,也可以有内核自动分配。
    ID由一个主序列号和一个从序列号组成,两个数字用一个冒号分开。

    ==================
    Linux流量控制主要分为建立队列、建立分类和建立过滤器三个方面。

    1、基本实现步骤为:

    (1) 针对网络物理设备(如以太网卡eth0)绑定一个队列QDisc;

    (2) 在该队列上建立分类class;

    (3) 为每一分类建立一个基于路由的过滤器filter;

    (4) 最后与过滤器相配合,建立特定的路由表。
    #
    要建立一个QDisc或者过滤器,可以使用句柄(handle)来命名;如果要建立一个类,可以使用类识别符(classid)来命名

    # todo 示范案例:
    第一步为网卡创建disc队列:为eth0网卡创建一个qdisc根队列:root表示根队列,handle 表示队列的句柄为1:,htb 表示要添加的队列为HTB队列,r2q 1表示
    ,是指没有 default 的root
    tc disc add dev eth0 root handle 1: htb r2q 1

    第二步骤为队列创建分类class
    prio:用来指示借用带宽优先级,值越小优先越高
    创建分类1:1,其父分类为1:,rate 20mbit"表示系统将为该类别确保带宽20mbit,"ceil 20mbit"
    表示该类别的最高可占用带宽为40mbit
    tc class add dev eth0 parent 1: classid 1:1 htb rate 20mbit ceil 20mbit

    第三步创建过滤器:
    父分类编号为1:;过滤协议为ip,优先级别为16,过滤器为基于$ip。
    tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst $ip flowid 1:1


    #环境还原:
    清除 eth0 所有队列规则
    tc qdisc del dev eth0 root

    #qdisc 查看队列规则使用类型以及设置参数
    sudo tc -s -d qdisc show dev eth0
    #详细显示指定设备(这里为eth0)的分类状况
    sudo tc -s -d class show dev eth0

    显示过滤器的状况
    tc -s filter ls dev eth0
    详细显示指定设备(这里为eth0)的分类状况
    tc -s class ls dev eth0
    简单显示指定设备(这里为eth0)的队列状况
    tc qdisc ls dev eth0

    >>>>>>>语法例:
    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 parameters ] flowid flow-id

    tc [-s | -d ] qdisc show [ dev DEV ]

    tc [-s | -d ] class show dev DEV tc filter show dev DEV

    4.单位
    tc命令的所有参数都可以使用浮点数,可能会涉及到以下计数单位。
    ##4.1 带宽或者流速单位:
    kbps 千字节/秒
    mbps 兆字节/秒
    kbit KBits/秒
    mbit MBits/秒
    bps或者一个无单位数字 字节数/秒

    ## 4.2数据的数量单位:
    kb或者k 千字节
    mb或者m 兆字节
    mbit 兆bit
    kbit 千bit
    b或者一个无单位数字 字节数

    ## 4.3时间的计量单位:
    s、sec或者secs 秒
    ms、msec或者msecs 分钟
    us、usec、usecs或者一个无单位数字 微秒

    4.单位
    tc命令的所有参数都可以使用浮点数,可能会涉及到以下计数单位。
    ##4.1 带宽或者流速单位:
    kbps 千字节/秒
    mbps 兆字节/秒
    kbit KBits/秒
    mbit MBits/秒
    bps或者一个无单位数字 字节数/秒

    ## 4.2数据的数量单位:
    kb或者k 千字节
    mb或者m 兆字节
    mbit 兆bit
    kbit 千bit
    b或者一个无单位数字 字节数

    ## 4.3时间的计量单位:
    s、sec或者secs 秒
    ms、msec或者msecs 分钟
    us、usec、usecs或者一个无单位数字 微秒

    技术群:

  • 相关阅读:
    CIL中间语言浅谈
    keepalived实现nginx高可用
    centos 开启关闭网卡
    CentOS7下安装httpd服务
    freeswitch socket连接报错
    centos安装nodejs
    CronTrigger
    mysql 表增加索引
    FreeSWITCH呼叫参数之sip_cid_type
    中继网关开启呼入
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/12575338.html
Copyright © 2020-2023  润新知