热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Linux流量控制(一)--排队规则

文章标题:Linux流量控制(一)--排队规则。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

    Linux操作系统中的流量控制框架创建了一个通用环境,它集成了所有用于限制和流量整形的可以互联的不同元素。在实际操作中这些元素甚至可以作为一个模块动态地加载和卸载。

    TC(Traffic Control)工具提供了一个命令行用户接口来配置Linux流量控制。该工具让用户可以设定并配置几乎所有的流量控制框架要素,比如排队规则(qdisc)、类(class)及过滤器(filter),他们之间的关系见下图。

    排队规则:每个网络设备配有一个排队规则。通常,要发送的报文被送到一个排队规则中并且按照特定规则在此队列中排序。

    类:排队规则可以有多个接口,这些接口用于向队列管理插入报文。在单个排队规则中,可以把报文分配到不同的类。

    过滤器:通常用来将外发报文分片到排队规则的类中。

    排队规则

    Linux可支持无类排队规则和分类排队规则。无类排队规则包括FIFO(先进先出)、TBF(令牌桶过滤器)、SFQ(随机公平队列)等;分类排队规则包括PRIO(优先级)、CBQ(类基队列)、HTB(分层令牌桶)等。

    FIFO

    FIFO(pfifo_fast)

    先进先出。它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。而三个波段的优先级也不相同,band 0的优先级最高,band 2的最低。如果band 0里面有数据包,系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配多三个波段里面的。

    pfifo_fast 队列规定作为硬性的缺省设置,不能对它进行配置。

    TBF & HTB

    令牌桶过滤器(Token Bucket Filter,TBF)是一个简单的队列,它只允许以不超过事先设定的速率到来的数据包通过,但可能允许短暂突发流量超过设定值。

    TBF 的实现在于一个缓冲器(桶),它不断地被一些称为令牌的虚拟数据以特定速率填充。桶最重要的参数就是它的大小,也就是它能够存储令牌的数量。每个到来的令牌从数据队列中收集一个数据包,然后从桶中被删除。如下图。

    这个算法将令牌流和数据流进行了紧密的关联,我们有以下三种情景:

    数据流以等于令牌流的速率到达TBF。这种情况下,每个到来的数据包都能对应一个令牌,然后无延迟地通过队列。

    数据流以小于令牌流的速度到达TBF。通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里积累下来,直到桶被装满。剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉,这种情况下会发生突发传输。

    数据流以大于令牌流的速率到达TBF。这意味着桶里的令牌很快就会被耗尽。导致TBF中断一段时间,称为“越限”。如果数据包持续到来,将发生丢包。

    TBF提供了一些可控参数,如令牌桶大小、令牌流入速率、峰值速率、排队时延等。

    例如:

    # tc qdisc add dev eth0 root tbf rate 512kbit latency 30ms burst 1600

    它的意思是在eth0上设置一个tbf过滤队列,网络带宽为512kbit,延迟为30m,突发数据量(缓冲区)为1600个字节。

    分层令牌桶(Hierarchical Token Bucket,HTB)即分类的令牌桶过滤器,它可以通过TBF实现带宽限制,也能够划分类别的优先级。

    SFQ

    SFQ(Stochastic Fairness Queueing,随机公平队列)是公平队列算法家族中的一个简单实现。它的精确性不如其它的方法,但是它在实现高度公平的同时,需要的计算量却很少。

    SFQ的关键词是“会话”(或称作“流”),主要针对一个TCP会话或者UDP流。流量被分成相当多数量的FIFO 队列中,每个队列对应一个会话。数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会。

    这种方式非常公平,保证了每一个会话都不会没其它会话所淹没。SFQ 之所以被称为“随机”,是因为它并不是真的为每一个会话创建一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去。

    因为使用了散列,所以可能多个会话分配在同一个队列里,从而需要共享发包的机会,也就是共享带宽。为了不让这种效应太明显,SFQ 会频繁地改变散列算法,以便把这种效应控制在几秒钟之内。

    需要注意的是:只有当出口网卡确实已经挤满了的时候,SFQ才会起作用,否则在Linux 机器中根本就不会有队列,SFQ 也就不会起作用。

    SFQ基本上不需要手工调整:它的参数有perturb和quantum。

    例如:

    # tc qdisc add dev ppp0 root sfq perturb 10

    # tc -s -d qdisc ls

    qdisc sfq 800c: dev ppp0 quantum 1514b limit 128p flows 128/1024 perturb 10sec

    Sent 4812 bytes 62 pkts (dropped 0, overlimits 0)

    “800c:”这个号码是系统自动分配的一个句柄号,“limit”意思是这个队列中可以有128 个数据包排队等待。一共可以有1024 个散列目标可以用于速率审计,而其中128 个可以同时激活。每隔10 秒种散列算法更换一次。

    PRIO

    PRIO 队列规定并不进行整形,它仅仅根据配置的过滤器把流量进一步细分。可以认为PRIO 队列规定是pfifo_fast 的一种衍生物,区别在每个波段都是一个单独的类,而非简单的FIFO。

    当数据包进入PRIO 队列规定后,将根据你给定的过滤器设置选择一个类。缺省情况下有三个类,这些类仅包含纯FIFO 队列规定而没有更多的内部结构。可以把它们替换成需要的任何队列规定。

    每当有一个数据包需要出队时,首先处理:1类。只有当标号更小的类中没有需要处理的包时,才会标号大的类。

    当希望不仅仅依靠包的TOS,而是想使用tc所提供的更强大的功能来进行数据包的优先权划分时,可以使用这个队列规定。它也可以包含更多的队列规定,而pfifo_fast 却只能包含简单的fifo 队列规定。

    因为它不进行整形,所以使用时与SFQ 有相同的考虑:要么确保这个网卡的带宽确实已经占满,要么把它包含在一个能够整形的分类的队列规定的内部。后者几乎涵盖了所有cable modems 和DSL 设备。

    严格地说,PRIO 队列规定是一种Work-Conserving 调度。

    CBQ

    CBQ(Class Based Queueing,基于类的队列)是一种基于类的算法,根据流量特征处理数据包,并确保一定的传输速率。接收的数据包根据变量如差分服务代码点(DSCP:Differentiated Services Code Point)中的IP协议头、IP 地址、应用程序或协议、URL或其它信息等进行分类。每类流量被分配到指定的FIFO(First In First Out)队列,其中每个队列的使用由部分路由器总带宽决定。如果队列为空闲,带宽便可以供其它队列使用。同时CBQ也是一种QoS方案,用于识别不同类型的流量并根据预置的参数对流量进行排队。

    它是最复杂、最琐碎、最难以理解的队列规定。这是因为CBQ算法本身的不精确,而且与Linux 的内在机制不协调造成的。

    原文地址 http://hi.baidu.com/esailzz/blog/item/d5f2d31770c292074a90a732.html


推荐阅读
  • Linux防火墙配置—允许转发
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • slmp协议和mc协议区别_TCP协议与UDP协议的区别
    TCP协议和UDP协议TCPIP协议是一个协议簇。里面包括很多协议的,UDP只是其中的一个,之所以命名为TCPIP协议,因 ... [详细]
  • UDP千兆以太网FPGA_verilog实现(四、代码前期准备UDP和IP协议构建)
    UDP:userDatagramprotocol用户数据报协议无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETFRFC76 ... [详细]
  • 三、寻找恶意IP并用iptables禁止掉找出恶意连接你的服务器80端口的IP,直接用iptables来drop掉它;这里建议写脚本来运行, ... [详细]
  • 定义#definePCAP_OPENFLAG_PROMISCUOUS1    定义适配器是否必须进入混杂模式。#definePCAP_OPENFLAG_DATATX_UDP2    ... [详细]
author-avatar
mobiledu2502911427
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有