qdisc分类排队规则(分类 qdisc)
流量控制(Traffic Control)
1 TC原理介绍Input Interface: IIOI: Output InterfaceLinux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。
Linux流量控制的基本原理如下图所示。
从Input Interface 收到包后,经过流量限制(Ingress Policing)丢弃不符合规定的数据包,由Input De-Multiplexing 进行判断选择:如果包的目的地址是本主机,那么将该包送给上层处理;否则需要进行转发,将包交到Forwarding Block 处理。
Forwarding Block 也接收本主机上层(TCP、UDP 等)产生的包。
它通过查看路由表,决定所处理包的下一跳。
然后,对包进行排列并交给Output Interface。
一般我们只能限制网卡发送的数据包,不能限制网卡接收的数据包,所以我们可以通过改变发送次序来控制传输速率。
Linux流量控制主要是在输出接口排列时进行处理和实现的。
2 TC规则2.1 流量控制方式流量控制包括以下几种方式:2.1.1SHAPING(限制)当流量被限制,它的传输速率就被控制在某个值以下。
限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。
shaping(限制)只适用于向外的流量。
2.1.2SCHEDULING(调度)通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。
SCHEDULING(调度)也只适于向外的流量。
2.1.3POLICING(策略)SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
2.1.4DROPPING(丢弃)如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。
2.2 流量控制处理对象流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和filter(过滤器)。
TC流量限速
# !/bin/shtouch /var/lock/subsys/localecho 1 > /proc/sys/net/ipv4/ip_forwardroute add default gw 10.0.0.0 (这是加入电信网关,如果你已设了不用这条)DOWNLOAD=640Kbit (640/8 =80K ,我这里限制下载最高速度只能80K)UPLOAD=640Kbit (640/8 =80K,上传速度也限制在80K)INET=192.168.0. (设置网段,根据你的情况填)IPS=1 (这个意思是从192.168.0.1开始)IPE=200 (我这设置是从IP为192.168.0.1-200这个网段限速,根据自已的需要改)ServerIP=253 (网关IP)IDEV=eth0ODEV=eth1/sbin/tc qdisc del dev $IDEV root handle 10:/sbin/tc qdisc del dev $ODEV root handle 20:/sbin/tc qdisc add dev $IDEV root handle 10: cbq bandwidth 100Mbitavpkt 1000/sbin/tc qdisc add dev $ODEV root handle 20: cbqbandwidth 1Mbit avpkt 1000/sbin/tc class add dev $IDEV parent10:0 classid 10:1 cbq bandwidth 100Mbit rate 100Mbit allot1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000/sbin/tc class add dev $ODEV parent 20:0 classid 20:1cbq bandwidth 1Mbit rate 1Mbit allot 1514 weitht 10Kbit prio 8 maxburst 20 avpkt 1000COUNTER=$IPSwhile [ $COUNTER -le $IPE ]do/sbin/tc class add dev $IDEV parent 10:1 classid 10:1$COUNTER cbq banwid th 100Mbit rate$DOWNLOAD allot 1514 weight 20Kbit prio 5 maxburst 20 avpkt 1000 boun ded/sbin/tc qdisc add dev $IDEV parent 10:1$COUNTER sfq quantum 1514b pert urb15/sbin/tc filter add dev $IDEV parent 10:0 protocol ip prio 100 u32 match ipd st $INET$COUNTER flowid 10:1$COUNTERCOUNTER=` expr $COUNTER + 1 `doneiptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -J MASQUERAD EHTB官方网站:http://luxik.cdi.cz/~devik/qos/htb/LINUX HTB队列规定用户指南HTB Linux queuing discipline manual - user guideMartinDeveraakadevik(************)Manual: devik and Don CohenLast updated: 5.5.2002译者:龚关*******************1. Introduction 介绍2. Link sharing 链路共享3. Sharing hierarchy 共享层次4. Rate ceiling 速率限度5. Burst 突发6. Priorizing bandwidth share 带宽分配优先7. Understanding statistics 查看统计8. Making, debugging and sending error reports 开发,调试和错误报告1. Introduction 介绍HTB 意味着是一个更好理解更容易掌握的可以快速替换LINUX CBQ 队列规定的队列, CBQ和HTB都可以帮助你限制你的链路上的出口带宽;他们允许你把一条物理链路模拟成几条更慢的链路或者是把发出的不同类型的流量模拟成不同的连接,在他们的实际应用中, 你必须指定怎么分配物理链路给各种不同的带宽应用并且如何判断每种不同的应用的数据包是怎么样被发送的;这篇文章将告诉你怎么使用HTB . 这里有很多的例子和分析图以及一些特殊问题的讨论. 这个HTB的发布版本已经有更多的升级, 详细情况请看HTB 的主页.请先查阅: TC 工具(不仅仅是HTB ) 有关速率的单位换算: kbps = kilo bytes kbit = kilo bits2. Link sharing 链路共享案例: 我们有两不同的用户A和B, 都通过网卡eth0 连接到internet ,我们想分配60 kbps 的带宽给B 和40 kbps的带宽给A, 接下来我们想对A用户的带宽再做一个分配, 给30 kbps的带宽给WWW服务, 10 kbps的带宽给其他用途; 任何没有用的带宽可以分配和其他需要带宽类(在分配的总带宽允许的范围内的部分)HTB 可以保障提供给每个类带宽的数量是它所需求的最小需求或者等于分配给它的数量.当一个类需要的带宽少于分配的带宽时,剩余的带宽被分配给其他需要服务的类.注: 这里这种情况被称为”借用”剩余带宽, 我们以后将用这个术语, 但无论如何,好像很不好因为这个”借用”是没有义务偿还的.上面所提到的不同类型的流量在HTB里表现为类, 上面是一个简单的分布图.我们来看看所用到的命令:tc qdisc add dev eth0 root handle 1: htb default 12这条命令分配了HTB队列规定给eth0 并且指定了一个名称为(handle" 1句柄1: , 这个名称用于标识它下面的子类, default 12 的意思是没有被分类的流量被分配到类1:12注: 一般(不仅仅是HTB其他所有TC的队列和类),句柄都被写成X:Y 这里X是队列规定的整数型的标识符,Y是这个队列规定的类的整数型标识符,队列规定的句柄标识符的Y必须是0,而句柄的类的标识符的数值必须是一个非零的整数. "1:" 等同于"1:0".tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps第一行在队列1:下创建了一个根类1:1,并且定义了HTB队列规定作为这个根类的父类,一个根类可以像队列规定下其他类一样允许它的子类相互借用带宽, 但是根类之间不能相互借用带宽,我们可以在HTB队列下直接创建三个类,但是其中一个类的剩余带宽不能够借用给其他需要的类,在这种情况下我们想允许带宽借用,所以我们为根类创建扩展类并且让这些类在根类的范围内发送数据,我们定义了下面的三行, ceil参数我们在以后将讲述.注: 有时候人们会问我为什么他们必须重复dev eth0 描述在他们已经定义并使用了handle 或者parent ,原因是本地接口比如eth0 和eth1他们各自都可能会有类的句柄表示为1:1.我们还必须描述那些数据包属于那个类, 有关详细内容请查看有关TC 过虑器的相关文档. 命令看起来像下面这样:tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4 match ip dport 80 0xffff flowid 1:10tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4 flowid 1:11 (We identify A by its IP address which we imagine here to be 1.2.3.4.)(我们根据它的IP地址进行分类识别,这里我们假设为1.2.3.4)注:U32过虑器有一个非文档化的设计会导致在你使用U32分类器”tc filter show”命令时会显示出不同的prio的值.你可能会注意到我们没有为类1:12创建过虑, 很明显,这个例子中被用作缺省, 就是没有被上面两条分类规则定义的任何数据包(任何原地址非1.2.3.4)将被发送到类1:12现在我们可以很方便的为队列规定分配子类, 如果没有指定缺省是pfifotc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10这是我们所需要的全部命令, 让我们来看看有什么事情发如果我们给每个类发送90kbps的数据然后停止发送其中一个类在某一时刻.在图的底部标有"0:90k". 标签中央水平位置(在9附近.同时标有红色1)现实了数据流量随时间的变化情况.冒号之前是类的标识符;(0表示类1:10, 1 表示类1:11, 2 表示类1:12)冒号之后是新的速率在那个时间有标注. 比如类0在时间0的时候速率改变为90K ;在时间3为0K (0= 0k) ,在时间6时返回90K;最初所有的类共同流量为90kb. 以后以被指定更高的速度传输, 每一个类都被限制在其被指定的速率, 在时间3的时候我们停止传送类0的数据, 分配给类0的速率被分配给其他两个类.如图所示1至6内的类1和类2 (很难看出类1的增长因为它只有4kbps.) 同样在时间9时类1流量停止它的带宽被分配到另外两个类(类0的增长同样很难看出), 在时间15类2被分配给类0和类1, 在时间18 类1和类2 同时停止,所以类0得到它所需要的所有90 kbps.带宽.现在是个接触quantums概念的很好的时机.实际上当一些想借用带宽的类服务于其他竞争的类之前相互给定的一定数量的字节, 这个数量被称为quantums . 你应该明白如果一些竞争的类是可以从它的父类那里得到所需的quantums; 精确的指定quantums的数量尽可能的小并其大于MTU是很重要的.一般你不需要手工指定一个quantums因为HTB会根据计算选择数值.计算类的quantum相对于用r2q参数分配; 它的缺省的值是10因为典型的MTU是1500,缺省值很适合速率为15 kBps (120 kbit).当你创建队列最小的速率指定r2q 1, 比较适合速率为12 kbit;如果你需要手工指定quantum 当你添加或者更改类,如果预想计算的值是不适合的你可以清除日志里的警告. 当你用命令行指定了quantum 类的r2q将被忽略.如果A和B是不同的客户这个解决方案看起来很好, 但是如果A 付了40kbps 他可能更希望他不用的WWW的带宽可以用在自己的其他服务上而并不想分享个B. 这种需求是可以通过HTB的类的层次得到解决的.3. Sharing hierarchy 共享层次前面章节的问题在这一节里通过类层次结构来得到解决, 用户A 可以很清楚的表达自己的类; 回到前面我们说过提供给每个类带宽的数量是它所需求的最小需求或者等于分配给它的数量. 这样可以用在其他非父类的HTB类里. 我们叫他们为子类, 对于HTB的父类来说我们称为内部类, 规则是使用服务的总量最小而且总量等于他的子类所请求的总和.这里我们分配40kbps给用户A ,这就意味着如果A的需求少于分配的WWW带宽, 那么剩下的将被用来服务于A的其他应用.(如果有需要), 至少总和为40kbps.注:数据包的分类规则可以分配给内部节点, 也可以有分配其他的过虑器给内部节点,最终应该到达子类或者是特定的类class 1:0 ;父类提供的速率应该是它所有子类的总和.现在的命令如下:tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:2 htb rate 40kbps ceil 100kbpstc class add dev eth0 parent 1:2 classid 1:10 htb rate 30kbps ceil 100kbpstc class add dev eth0 parent 1:2 classid 1:11 htb rate 10kbps ceil 100kbpstc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps我们现在来看看流量图显示的我们用层次结构的解决方案. 当A的WWW流量停止, 它所分配的带宽被二次分配到它的其他流量上, 所以A的总带宽仍然为40kbps.如果A的总请求带宽小于40kbps.那么剩余的流量将被分配给B.4. Rate ceiling 速率限度参数ceil指定了一个类可以用的最大带宽, 用来限制类可以借用多少带宽.缺省的ceil是和速率一样.(也是我们为什么必须在上面的例子里指定它用来显示借用带宽的上限)我们改变前面例子里的类1:2 (A) 和1:11 (A's other) ceil 100kbps 分别为ceil 60kbps 和ceil20kbps.和前面的图显示不同, 在时间3 (WWW 流量停止) 因为A 的其他流量限制在20kbps. 所以用户A得到仅仅总带宽20kbps没有用的20kbps被分配给了B .第二个不同是在时间15时B停止, 因为没有ceil, 所有它的带宽被给了A , 但是现在A 仅仅允许使用60kbps,所以剩余的40kbps 闲置.这个特性对于ISP是很有用的, 因为他们一般限制被服务的用户的总量即使其他用户没有请求服务.(ISPS 很想用户付更多的钱得到更好的服务) ,注根类是不允许被借用的, 所以没有指定ceil注: ceil的数值应该至少和它所在的类的速率一样高, 也就是说ceil应该至少和它的任何一个子类一样高5. Burst 突发网络硬件只能在一个时间发送一个包这仅仅取决于一个硬件的速率. 链路共享软件可以利用这个能力动态产生多个连接运行在不同的速度. 所以速率和ceil不是一个即时度量只是一个在一个时间里发送包的平均值. 实际的情况是怎样使一个流量很小的类在某个时间类以最大的速率提供给其他类. burst 和cburst 参数控制多少数据可以以硬件最大的速度不费力的发送给需要的其他类.如果cburst 小于一个理论上的数据包他形成的突发不会超过ceil 速率, 同样的方法TBF的最高速率也是这样.你可能会问, 为什么需要bursts . 因为它可以很容易的提高向应速度在一个很拥挤的链路上. 比如WWW 流量是突发的. 你访问主页. 突发的获得并阅读. 在空闲的时间burst将再"charge"一次.注: burst 和cburst至少要和其子类的值一样大.如图, 接着前一章的例子,我改变burst给红和黄(agency A)类20 kb但cburst仍然为缺省(cca 2 kb).绿色的峰出现在时间13由于在SMTP类设置了burst;A类在限度下自从时间9并且聚集了20 kb的突发流量,峰高于20 kbps(被ceil参数限制因为它的cburst接近包的尺寸),聪明的读者可能会问为什么在时间7处没有红色和黄色的峰;因为黄色已经接近ceil所以没有空间用于突发;有一个不必要的人为的低谷在时间4, 那是因为我忘记添加burst 给根连接到(1:1)类;峰从时间1并且当时间4蓝色的类想借用黄色的速率被拒绝并且自己补偿;局限性: 当你在计算机上用一个小的时间片操作一个高速链路你需要为所有的类设置很小的burst 和cburst . 在i386系统上是10ms 在Alphas.系统是1ms ;最小的burst可以max_rate*timer 被估算出来; 所以10Mbit的速率在i386 系统上burst为12kb如果你设置太小的burst 你可能会得到比你设置更小的速率, 后来TC 工具在你没有指定burst.时将估计并且设置一个最小且可能的burst.6. Priorizing bandwidth share 带宽分配优先带宽分配的优先级包括两个方面, 首先它影响到子类剩余带宽的分配, 到现在我们已经知道剩余带宽按照速率比例来分配, 我以第三节的配置为例(没有设置ceiling 和bursts的层次结构)除了SMTP (green)的优先权改为0(更高) 其他所以类都改为1从视图我们可以看到类得到了所有剩余带宽, 规则是优先权越高的类越优先得到剩余带宽., 但必须是在rate 和ceil得到保障的前提下.另一个方面的问题,包的延时, 在以太网里的延时度量是很困难的,但有一个简单的办法.我们添加一个带宽小于100 kbps的HTB类.第二个类(我们测量的)作为一个子类,然后我们模仿成更慢并且延时比较大的链路.出于简单的原因, 我们用两个有关联的类;# qdisc for delay simulationtc qdisc add dev eth0 root handle 100: htbtc class add dev eth0 parent 100: classid 100:1 htb rate 90kbps# real measured qdisctc qdisc add dev eth0 parent 100:1 handle 1: htbAC="tc class add dev eth0 parent"$AC 1: classid 1:1 htb rate 100kbps$AC 1:2 classid 1:10 htb rate 50kbps ceil 100kbps prio 1$AC 1:2 classid 1:11 htb rate 50kbps ceil 100kbps prio 1tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 2tc qdisc add dev eth0 parent 1:11 handle 21: pfifo limit 2注: 另一个HTB的子类和同一个HTB内的子类是不一样的, 因为HTB的类发送数据和硬件发送能力一样的, 所以在限度以内的数据发送仅仅取决于设备速度而不是上级类; HTB下的HTB类输出是模拟一个逻辑硬件; (大的延时)假定速率同为50 kbps的两个类在时间3S 时执行命令如下:tc class change dev eth0 parent 1:2 classid 1:10 htb rate 50kbps ceil 100kbps burst 2k prio 0你可以看到WWW的延时趋近于0而SMTP的延时增大. 当你的优先级别更高而其他类的延时就更大.稍后在7S 时,模仿WWW以60 kbps和SMTP 以40 kbps.发送数据.你可以看到另一个有趣的现象.当WWW越限之后HTB首先是限制带宽.什么样的类需要优先权? 一般需要延时低的类; 比如视频和音频流; (你必须使用正确的流量速率防止流量相互淹没. ) 或者是交互性(TELNET .SSH )流量正常突发并且不影响其他的流量.提高ICMP的优先权可以得到一个很好的PING的延时返回, 但这是一个假相, 因为从技术角度来说在测试联通性时这种情况并不是你想要的.7. Understanding statistics 查看统计TC 工具允许你对LINUX队列规定进行统计; 不幸的是统计结果作者没有解释所以你不能经常用到他们; 这里我尽力解释来帮助理解HTB的状态; 首先是HTB的整体状态. 下面是第三节里的一个片段;# tc -s -d qdisc show dev eth0qdisc pfifo 22: limit 5pSent 0 bytes 0 pkts (dropped 0, overlimits 0)qdisc pfifo 21: limit 5pSent 2891500 bytes 5783 pkts (dropped 820, overlimits 0)qdisc pfifo 20: limit 5pSent 1760000 bytes 3520 pkts (dropped 3320, overlimits 0)qdisc htb 1: r2q 10 default 1 direct_packets_stat 0Sent 4651500 bytes 9303 pkts (dropped 4140, overlimits 34251)前三个规定是HTB的子队列, 我们跳过他们因为PFIFO的状态是自我解释的. Overlimit告诉你有多少次队列延时了数据包; direct_packets_stat 告诉你有多少包直接通过队列被送出; 其他的解释是自我解释型的, 让我们看看类的状态;tc -s -d class show dev eth0class htb 1:1 root prio 0 rate 800Kbit ceil 800Kbit burst 2Kb/8 mpu 0bcburst 2Kb/8 mpu 0b quantum 10240 level 3Sent 5914000 bytes 11828 pkts (dropped 0, overlimits 0)rate 70196bps 141ppslended: 6872 borrowed: 0 giants: 0class htb 1:2 parent 1:1 prio 0 rate 320Kbit ceil 4000Kbit burst 2Kb/8 mpu 0bcburst 2Kb/8 mpu 0b quantum 4096 level 2Sent 5914000 bytes 11828 pkts (dropped 0, overlimits 0)rate 70196bps 141ppslended: 1017 borrowed: 6872 giants: 0class htb 1:10 parent 1:2 leaf 20: prio 1 rate 224Kbit ceil 800Kbit burst 2Kb/8 mpu 0b cburst 2Kb/8 mpu 0b quantum 2867 level 0Sent 2269000 bytes 4538 pkts (dropped 4400, overlimits 3635rate 14635bps 29ppslended: 2939 borrowed: 1599 giants: 0我删除了类1:11 和1:12 以便输出更简单扼要; 可以看到有我们设置的参数, 还有level 和DRR quantum 信息;overlimits 显示了有多少次类要求被发送数据而被rate/ceil 限制不能发送;(现在显示的仅仅是子类)rate, pps 告诉你通过类实际的速率(10秒的平均值) 他和你选择的速率是一样的.Lended 这个类借出的包; borrowed 则是被借入的数据包从父类;Giants 显示了大于TC命令设置的MTU的数据包的数量;HTB和其协调工作,否则将会影响速率的精确性,, 添加MTU 到你的TC命令里(缺省是1600 bytes)8. Making, debugging and sending error reports开发, 调试和发送错误报告如果你拥有kernel 2.4.20或者更新的内核你就不必要打补丁, 但你需要更新TC 工具从HTB 3.6 包里得到并且使用它;为了和老内核工作协调, 下载内核源码, 用patch -p1 -i htb3_2.X.X.diff装载补丁程序, 然后用make menuconfig;make bzImage; 编译内核时不要忘了选中QoS 和HTB.我将非常感激如果你认为在使用发现了HTB错误. 我需要详细的输出; 在队列规定出现异常行为时请在tc qdisc add .... htb.后面加上参数debug 3333333 ; 它将会在系统日志里记录一些调试记录,为此你可能需要在你的/etc/syslog.conf. 文件里加上kern.debug-/var/log/debug这一行. 通过压缩包电邮给我,并且付上问题描述和时间.名称: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 parameters ] flowid flow-idtc [-s | -d ] qdisc show [ dev DEV ]tc [-s | -d ] class show dev DEV tc filter show dev DEVTC用途简介:Tc用于Linux内核的流量控制。
linux tc使用指南以及原理
linux tc使用指南以及原理Linux tc是一个用于配置网络流量控制的工具,它可以帮助我们实现带宽限制、延迟模拟和丢包模拟等功能。
本文将介绍Linux tc的使用指南和原理,帮助读者更好地理解和使用该工具。
一、tc的基本概念和原理1. tc的全名为Traffic Control,它是Linux系统中用于网络流量控制的一个子系统。
2. tc通过配置不同的队列和过滤器来对网络流量进行管理和控制。
3. tc主要通过三种方式来控制网络流量:限制带宽、延迟模拟和丢包模拟。
4. tc的核心概念包括:类别(class)、过滤器(filter)、队列(queue)和规则(rule)。
二、tc的使用指南1. 安装tc工具:在大多数Linux发行版中,tc工具已经默认安装,可以通过`tc qdisc show`命令来检查是否安装。
2. 查看当前网络流量控制配置:使用`tc qdisc show`命令可以查看当前系统的网络流量控制配置。
3. 创建一个队列:使用`tc qdisc add`命令可以创建一个队列,例如`tc qdisc add dev eth0 root handle 1: htb`。
4. 创建一个类别:使用`tc class add`命令可以创建一个类别,例如`tc class add dev eth0 parent 1: classid 1:1 htb rate1mbit ceil 2mbit`。
5. 创建一个过滤器:使用`tc filter add`命令可以创建一个过滤器,例如`tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dst 192.168.0.2 flowid 1:1`。
6. 设置带宽限制:使用`tc class change`命令可以设置一个类别的带宽限制,例如`tc class change dev eth0 parent 1: classid 1:1 htb rate 512kbit ceil 1mbit`。
ifconfig讲解(ip地址)
ifconfig讲解(ip地址)如果查看ip地址,window上是ipconfig,linux上是ifconfiglinux上还有其他命令查看ip地址吗,答案是ip addrifconfig和ip addr区别这是⼀个有关 net-tools 和 iproute2 的“历史”故事net-tools起源于BSD,⾃2001年起,Linux社区已经对其停⽌维护,⽽iproute2旨在取代net-tools,并提供了⼀些新功能。
⼀些Linux发⾏版已经停⽌⽀持net-tools,只⽀持iproute2。
net-tools通过procfs(/proc)和ioctl系统调⽤去访问和改变内核⽹络配置,⽽iproute2则通过netlink套接字接⼝与内核通讯。
net-tools中⼯具的名字⽐较杂乱,⽽iproute2则相对整齐和直观,基本是ip命令加后⾯的⼦命令。
虽然取代意图很明显,但是这么多年过去了,net-tool依然还在被⼴泛使⽤ip addr输出介绍[read@221.228.75.244:~]$ ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWNlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lo2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000link/ether 18:66:da:4d:26:f9 brd ff:ff:ff:ff:ff:ffinet 221.228.75.244/25 brd 221.228.75.255 scope global em13: em2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000link/ether 18:66:da:4d:26:fa brd ff:ff:ff:ff:ff:ffinet 172.16.20.244/16 brd 172.16.255.255 scope global em24: em3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000link/ether 18:66:da:4d:26:fb brd ff:ff:ff:ff:ff:ff5: em4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000link/ether 18:66:da:4d:26:fc brd ff:ff:ff:ff:ff:ff 这个命令显⽰了这台机器上所有的⽹卡。
Linux系统中tc命令的使用详解
Linux系统中tc命令的使用详解Linux系统中tc是一个流量控制工具,全称叫traffic control。
下面由店铺为大家整理了linux系统中tc命令的使用详解,希望对大家有帮助!Linux系统中tc命令的使用详解名称:tc - 显示/维护流量控制设置一、linux 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 parameters ] flowid flow-idtc [-s | -d ] qdisc show [ dev DEV ]tc [-s | -d ] class show dev DEVtc filter show dev DEV二、linux tc命令原理介绍Linux操作系统中的流量控制器TC(Traffic Control)用于linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控制。
TC模块实现流量控制功能使用的队列规定分为两类,一类是无类队列规定,另一类是分类队列规定。
无类队列规定相对简单,而分类队列规定则引出了分类和过滤器等概念,使其流量控制功能增强。
云主机、物理机及容器基础知识
目录
• 主机技术概述 • 云主机控制系统 • 云主机资源调度
云主机功能架构
云主机控制器 region 虚拟机 物理机 宿主机 模板 网络 本地存储 容器
VNC Proxy
分布式块存储 EBS
云主机系统架构
模板API Glance
拉取模板
KVM Sched Usage Kvm/docker Host server Docker
对大页内存使用量的限制和计量 对进程数的限制和计量
容器存储
• 系统盘:分层文件系统
• AUFS • Device-mapper
• 数据盘 :
• Volume: 宿主机本地存储
容器网络
Bridge 独享虚拟interface,并通过bridge 和宿主机网络桥接,实现对外服 务 和其他容器共享interface 和宿主机共享interface Docker不管理网络,用户自定义 网络
统一API - 物理机
POST /servers HTTP/1.1 {"server”: {“name”: “dx-data-hdp-dn01”, "ncpu": 32, "vmem_size": ”128G", “disk.0”: “CentOS-6.5-x86_64-Hadoop-Hive-Presto-proxy-Spark”, “disk.1”: “swap:32g”, “disk.2”: “ext4:autoextend:/opt”, “disk.3”: “ext4:autoextend:/data1”, “disk.4”: “ext4:autoextend:/data2”, … “host_type”: “baremetal”, “baremetal-disk-config.0”: “raid1:[0,1]” } }
TC_QDisc简介
tc qdisc 控制包队列一、TC简介TC是Linux下的流量控制(traffic control)工具,其基本的功能模块包括队列、分类、过滤器,通过相关参数进行流量控制,通过# tc help可以查看操作如: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-idtc [-s | -d ] qdisc show [ dev DEV ]tc [-s | -d ] class show dev DEV tc filter show dev DEV我们常用的丢包、延时等通过最基本的排队规则(QDisc)即可以实现,故本文仅以qdisc 参数为例,简要说明基本的控制操作。
其他流量、带宽等的控制操作(class、filter参数),请参考/man/8/tc应用。
二、qdisc规则[root@freepp ~]# tc qdisc helpUsage: tc qdisc [ add | del | replace | change | get ] dev STRING[ handle QHANDLE ] [ root | ingress | parent CLASSID ][ estimator INTERV AL TIME_CONSTANT ][ [ QDISC_KIND ] [ help | OPTIONS ] ]tc qdisc show [ dev STRING ] [ingress]Where:QDISC_KIND := { [p|b]fifo | tbf | prio | cbq | red | etc. }OPTIONS := ... try tc qdisc add <desired QDISC_KIND> helpCommand "help" is unknown, try "tc qdisc help".[root@freepp ~]#常用以下:# tc qdisc listOr # tc qdisc show三、常用规则举例说明Define# 由于该NetEm机器采用双网卡模式,是通过eth0接入internet的,故本例的device 是针对eth0设定客户端默认包传送情况1、d elay# tc qdisc add dev eth0 root netem delay 100ms#解释:所有通过eth0接口的数据会有100ms的延时# tc qdisc add dev eth0 root netem delay 50ms 25ms#解释:由于延时往往不是一个固定的值,所以就需要“抖动”,本例中设定的delay范围是50ms±25ms 即25ms~75ms2、Packet loss3、Packet duplication4、Packet corruption5、Packet re-ordering四、注意①、以上的操作(delay、loss……)可以叠加使用,即同一interface可以同改其他规则,可以将add参数改为change使用。
tc命令与iptables规则
tc命令与iptables规则tc命令与iptables规则是两个非常重要的Linux命令工具,它们在网络管理和安全方面起到了关键作用。
本文将一步一步回答关于这两个主题的问题,从基础知识到实际应用进行详细介绍。
一、什么是tc命令?tc命令是Linux中的一个网络管理工具,全称为Traffic Control,用于控制和配置网络流量。
通过tc命令,可以实现带宽控制、流量整形和优先级设置等功能,从而确保网络资源的有效分配和优化。
1. tc命令的基本语法tc命令的基本语法如下:tc [options] action command [command-options]其中,options是一些可选的参数,action是指定具体的操作(如add、change、del等),command表示要执行的具体操作(如qdisc、class、filter等),command-options是操作相关的选项参数。
2. tc命令中的关键概念在使用tc命令时,有几个关键概念需要了解:- qdisc(Queueing Discipline):队列调度器,用于控制数据包的排队和调度。
常用的qdisc包括pfifo、sfq、htb等。
- class(分类):用于对数据包进行分类和分组。
每个分类可以应用不同的qdisc和过滤规则。
- filter(过滤器):用于根据特定的条件过滤数据包。
可以根据源IP、目标IP、协议、端口等进行过滤。
二、什么是iptables规则?iptables规则是Linux中的一个防火墙工具,用于配置和管理网络包过滤。
通过iptables规则,可以实现网络流量的过滤、转发和NAT等功能,从而保护网络资源的安全。
1. iptables规则的基本语法iptables规则的基本语法如下:iptables -t table_name command [command-options] [match] [target]其中,table_name表示所使用的表,常用的表包括filter、nat、mangle 等;command表示具体要执行的操作,常用的操作包括-A、-D、-I等;command-options是一些选项参数;match是匹配条件,用于指定要匹配的字段和条件;target是要执行的动作,比如ACCEPT、DROP、REJECT 等。
tc qdisc 原理
tc qdisc 原理TC(Traffic Control)是Linux系统中的一个网络流量控制工具,通过对网络流量进行管理和调度,可以实现对网络带宽的合理分配和流量控制。
而Qdisc(Queueing Discipline)是TC中的一种队列规则,用于管理和调度网络数据包的排队和发送。
本文将围绕着TC Qdisc的原理展开,介绍其作用、分类、工作原理以及常见的应用场景。
一、TC Qdisc的作用在计算机网络中,当多个主机同时进行数据传输时,往往会出现网络拥塞的情况,导致网络性能下降、延迟增加等问题。
TC Qdisc的作用就是通过对网络数据包进行管理和调度,实现对网络带宽的合理分配和流量控制,从而提高网络的性能和稳定性。
二、TC Qdisc的分类TC Qdisc根据其实现的功能和特点可以分为多种类型,常见的有以下几种:1. pfifo(Priority First In, First Out):按照数据包的到达顺序进行排队和发送,没有对数据包进行任何处理。
适用于对延迟要求较低的应用场景。
2. bfifo(Byte First In, First Out):按照数据包的大小进行排队和发送,较大的数据包会优先发送。
适用于对带宽要求较高的应用场景。
3. sfq(Stochastic Fairness Queueing):采用随机算法对数据包进行排队和发送,实现公平的带宽分配。
适用于对带宽公平分配要求较高的应用场景。
4. tbf(Token Bucket Filter):通过令牌桶算法对数据包进行排队和发送,实现对网络流量的限制和控制。
适用于对网络流量进行严格控制的应用场景。
三、TC Qdisc的工作原理TC Qdisc的工作原理主要包括以下几个步骤:1. 分类(Classification):根据规则将网络数据包进行分类,可以根据源IP地址、目标IP地址、端口号等进行分类。
2. 排队(Queueing):将分类后的数据包按照一定的规则放入相应的队列中,等待发送。
Ip网络包的排队发送过程
网络包的排队发送过程描述1) 当协议层将数据装配成数据帧通过网络设备发送时, 就会调用dev_queue_xmit().2) dev_queue_xmit()使用设备的排队规程根据发送包的优先级对包进行优先排队,这样可以在设备拥塞时, 使那些对实时要求很高的包能尽快得到发送, 队列规程也称为包调度器(packet scheduler).3) 包调度器处理16(TC_PRIO_MAX)种优先类型的发送包, 发送包继承所在套接字的优先类型,在IP包的转发过程中, 优先类型则根据IP服务类型来选择.4) 设备的队列规程用Qdisc结构描述, 当网络设备处于关闭状态时,其缺省的队列规程为"空规程"(noop_qdisc), 它对发送包作丢弃处理. 当网络设备处于打开状态时,缺省的队列规程为"先进先出优先规程"(pfifo_qdisc), 它将发送包的优先级(priority)映射到3个不同优先级的先进先出队列上,再按优先顺序进行发送.5) 设备的队列规程是可选的, 对回环设备(loopback)不使用队列规程,也可对不同的设备选择不同的队列规程.代码; net/core/dev.c:int dev_queue_xmit(struct sk_buff *skb){struct net_device *dev = skb->dev;struct Qdisc *q;/* Grab device queue */spin_lock_bh(&dev->queue_lock);q = dev->qdisc; //取设备的排队规程if (q->enqueue) { //如果定义了"入队"操作int ret = q->enqueue(skb, q); //将发送包入队qdisc_run(dev); //请求发送队列spin_unlock_bh(&dev->queue_lock);return ret == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : ret;}/* The device has no queue. Common case for software devices:loopback, all the sorts of tunnels...Really, it is unlikely that xmit_lock protection is necessary here.(f.e. loopback and IP tunnels are clean ignoring statistics counters.)However, it is possible, that they rely on protectionmade by us here.Check this and shot the lock. It is not prone from deadlocks.Either shot noqueue qdisc, it is even simpler 8}*/if (dev->flags&IFF_UP) { //如果设备已打开int cpu = smp_processor_id();if (dev->xmit_lock_owner != cpu) {spin_unlock(&dev->queue_lock);spin_lock(&dev->xmit_lock);dev->xmit_lock_owner = cpu;if (!netif_queue_stopped(dev)) { //如果可以进行发送请求if (netdev_nit) //如果有"网络窃听器"dev_queue_xmit_nit(skb,dev); //将包发给网络窃听器if (dev->hard_start_xmit(skb, dev) == 0) { //将包发给设备驱动程序dev->xmit_lock_owner = -1;spin_unlock_bh(&dev->xmit_lock);return 0;}}dev->xmit_lock_owner = -1;spin_unlock_bh(&dev->xmit_lock);if (net_ratelimit()) //如果可以打印信息.printk(KERN_DEBUG "Virtual device %s asks to queue packet!\n", dev->name);; // net_ratelimit()用于限制错误信息记录速度, 防止受到拒绝服务攻击kfree_skb(skb);return -ENETDOWN;} else {/* Recursion is detected! It is possible, unfortunately */if (net_ratelimit())printk(KERN_DEBUG "Dead loop on virtual device %s, fix it urgently!\n", dev->name);}}spin_unlock_bh(&dev->queue_lock);kfree_skb(skb);return -ENETDOWN;}; net/sched/sch_generic.c:static const u8 prio2band[TC_PRIO_MAX+1] = 3 //优先级转换表,将优先类型转化为实际的优先数{ 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 };/* 3-band FIFO queue: old style, but should be a bit faster thangeneric prio+fifo combination.*/static int pfifo_fast_enqueue (struct sk_buff *skb, struct Qdisc* qdisc){struct sk_buff_head *list;list = ((struct sk_buff_head*)qdisc->data) +prio2band[skb->priority&TC_PRIO_MAX]; //将优先数作为索引取队列指针if (list->qlen <= skb->dev->tx_queue_len) { //对于以太网设备来说,缺省可缓冲100个发送包__skb_queue_tail(list, skb);qdisc->q.qlen++;return 0;}qdisc->stats.drops++;kfree_skb(skb);return NET_XMIT_DROP;}/* Kick device.Note, that this procedure can be called by a watchdog timer, so thatwe do not check dev->tbusy flag here.Returns:0 - queue is empty.>0 - queue is not empty, but throttled.<0 - queue is not empty. Device is throttled, if dev->tbusy != 0.NOTE: Called under dev->queue_lock with locally disabled BH.*/int qdisc_restart(struct net_device *dev) //将队列中的发送包发给驱动程序{struct Qdisc *q = dev->qdisc;struct sk_buff *skb;/* Dequeue packet */if ((skb = q->dequeue(q)) != NULL) {if (spin_trylock(&dev->xmit_lock)) {/* Remember that the driver is grabbed by us. */dev->xmit_lock_owner = smp_processor_id();/* And release queue */spin_unlock(&dev->queue_lock);if (!netif_queue_stopped(dev)) {//可以进行发送请求if (netdev_nit)dev_queue_xmit_nit(skb, dev);if (dev->hard_start_xmit(skb, dev) == 0) {//给驱动dev->xmit_lock_owner = -1;spin_unlock(&dev->xmit_lock);spin_lock(&dev->queue_lock);return -1;}}/* Release the driver */dev->xmit_lock_owner = -1;spin_unlock(&dev->xmit_lock);spin_lock(&dev->queue_lock);q = dev->qdisc;} else {/* So, someone grabbed the driver. *//* It may be transient configuration error,when hard_start_xmit() recurses. We detectit by checking xmit owner and drop thepacket when deadloop is detected.*/if (dev->xmit_lock_owner == smp_processor_id()) {kfree_skb(skb);if (net_ratelimit())printk(KERN_DEBUG "Dead loop on netdevice %s, fix it urgently!\n", dev->name);return -1;}netdev_rx_stat[smp_processor_id()].cpu_collision++;}/* Device kicked us out :(This is possible in three cases:0. driver is locked1. fastroute is enabled2. device cannot determine busy statebefore start of transmission (f.e. dialout)3. device is buggy (ppp)*/q->ops->requeue(skb, q);netif_schedule(dev);return 1;)return q->q.qlen;}static struct sk_buff * pfifo_fast_dequeue(struct Qdisc* qdisc){int prio;struct sk_buff_head *list = ((struct sk_buff_head*)qdisc->data);struct sk_buff *skb;for (prio = 0; prio < 3; prio++, list++) { //0级队列中的包先发送skb = __skb_dequeue(list);if (skb) {qdisc->q.qlen--;return skb;}}return NULL;}static intpfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc)//pfifo_fast_dequeue的逆操作{struct sk_buff_head *list;list = ((struct sk_buff_head*)qdisc->data) +prio2band[skb->priority&TC_PRIO_MAX];__skb_queue_head(list, skb);qdisc->q.qlen++;return 0;}void dev_activate(struct net_device *dev) //激活设备{/* No queueing discipline is attached to device;create default one i.e. pfifo_fast for devices,which need queueing and noqueue_qdisc forvirtual interfaces*/if (dev->qdisc_sleeping == &noop_qdisc) {struct Qdisc *qdisc;if (dev->tx_queue_len) { //取大发送队列长度qdisc = qdisc_create_dflt(dev, &pfifo_fast_ops); //创建先进先出优先调度规程if (qdisc == NULL) {printk(KERN_INFO "%s: activation failed\n", dev->name);return;}} else {qdisc = &noqueue_qdisc;}write_lock(&qdisc_tree_lock);dev->qdisc_sleeping = qdisc;write_unlock(&qdisc_tree_lock);}spin_lock_bh(&dev->queue_lock);if ((dev->qdisc = dev->qdisc_sleeping) != &noqueue_qdisc) {dev->trans_start = jiffies;dev_watchdog_up(dev); //打开发送超时监视器}spin_unlock_bh(&dev->queue_lock);}static struct Qdisc_ops pfifo_fast_ops ={NULL,NULL,"pfifo_fast",3 * sizeof(struct sk_buff_head),pfifo_fast_enqueue,pfifo_fast_dequeue,pfifo_fast_requeue,NULL,pfifo_fast_init,pfifo_fast_reset,};struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops) {struct Qdisc *sch;int size = sizeof(*sch) + ops->priv_size;sch = kmalloc(size, GFP_KERNEL); //分配队列规程结构if (!sch)return NULL;memset(sch, 0, size);skb_queue_head_init(&sch->q);sch->ops = ops;sch->enqueue = ops->enqueue;sch->dequeue = ops->dequeue;sch->dev = dev;sch->stats.lock = &dev->queue_lock;atomic_set(&sch->refcnt, 1);if (!ops->init || ops->init(sch, NULL) == 0)return sch;kfree(sch);return NULL;}static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt){int i;struct sk_buff_head *list;list = ((struct sk_buff_head*)qdisc->data);for (i=0; i<3; i++)skb_queue_head_init(list+i); //初始化队列头指针return 0;}void dev_deactivate(struct net_device *dev) //关闭设备{struct Qdisc *qdisc;spin_lock_bh(&dev->queue_lock);qdisc = dev->qdisc;dev->qdisc = &noop_qdisc; //设备的队列规程设置为空规程qdisc_reset(qdisc);spin_unlock_bh(&dev->queue_lock);dev_watchdog_down(dev); //关闭发送超时监视器while (test_bit(__LINK_STA TE_SCHED, &dev->state)) {current->policy |= SCHED_YIELD;schedule();}spin_unlock_wait(&dev->xmit_lock);}void qdisc_reset(struct Qdisc *qdisc) //清除发送队列{struct Qdisc_ops *ops = qdisc->ops;if (ops->reset)ops->reset(qdisc);}static void pfifo_fast_reset(struct Qdisc* qdisc){int prio;struct sk_buff_head *list = ((struct sk_buff_head*)qdisc->data);for (prio=0; prio < 3; prio++)skb_queue_purge(list+prio); //删除队列成员qdisc->q.qlen = 0;}void dev_init_scheduler(struct net_device *dev) //设备初始化时安装的规程{write_lock(&qdisc_tree_lock);spin_lock_bh(&dev->queue_lock);dev->qdisc = &noop_qdisc;spin_unlock_bh(&dev->queue_lock);dev->qdisc_sleeping = &noop_qdisc;dev->qdisc_list = NULL;write_unlock(&qdisc_tree_lock);dev_watchdog_init(dev);}struct Qdisc noop_qdisc = //空规程{noop_enqueue,noop_dequeue,TCQ_F_BUILTIN,&noop_qdisc_ops,};struct Qdisc_ops noop_qdisc_ops ={NULL,NULL,"noop",0,noop_enqueue,noop_dequeue,noop_requeue,};static int noop_enqueue(struct sk_buff *skb, struct Qdisc * qdisc){kfree_skb(skb);return NET_XMIT_CN;}static struct sk_buff * noop_dequeue(struct Qdisc * qdisc){return NULL;}static int noop_requeue(struct sk_buff *skb, struct Qdisc* qdisc){if (net_ratelimit())printk(KERN_DEBUG "%s deferred output. It is buggy.\n", skb->dev->name);kfree_skb(skb);return NET_XMIT_CN;}。
Linux下TC(trafficcontrol)以及netem的使用
Linux下TC(trafficcontrol)以及netem的使⽤⼀:综述:linux系统中的流量控制器(TC)主要是在输出端⼝处建⽴⼀个队列进⾏流量控制。
TC是⼀个可以根据数据包的任何⼀个部分的特征对其进⾏分类的⼯具,并且可以为各类数据提供不同带宽,从⽽控制他们的传输速度。
TC是iproute2的⼀部分,集成在2.2.及以上版本的内核中,还可以与linux内核⾥的各种架构(如Netfilter netem)协同⼯作。
⼆:TC的组件TC主要由队列规定(qdisc),类(class)和过滤器(filter)这3个组件组成,绘图中⼀般⽤圆形表⽰队列规定,⽤矩形表⽰类:1:qdisc:TC的核⼼组件,也被称为队列,是管理⽹卡输⼊,输出数据的⼀个算法,⽤于确定数据包的发送⽅式。
队列规定可分为两类:(1)不分类的qdisc:内部不包含可配置的⼦类,对进⼊队列的数据包不进⾏区分对待,⽽只是对数据包进⾏重新编排,延迟发送或者丢弃,主要有:pfifo-fast.TBF.SFQ等(2)分类队列规定:内部可包含⼀个或多个⼦类,使⽤过滤器对数据包进⾏分类,然后交给相应的⼦类处理,分类队列规定有CBQ,HTB等2:类:就是数据的类别,各种数据通过过滤器进⾏分类,最后被放⼊类的队列规定⾥⾯进⾏排队。
如果⼀个类没有⼦类,那么这个类被称为叶⼦类,否则就被成为内部类。
1:1和1:12是内部类,其他均为叶⼦类,叶⼦类有⼀个负责为这个类发送数据的队列规定,⽽且这个qdisc可以是分类的,如1:10有⼀个分类的队列规定。
TC中通常把类的队列规定称为叶⼦qdisc(只有叶⼦类才有队列规定)3:过滤器就是⼀些规则,根据这些规则对数据包进⾏分类,过滤器可以属于队列规定,也可以属于内部类,若需要在叶⼦类上再实现分类,那就必须将过滤器与叶⼦类的分类队列规定关联起来,⽽不能与叶⼦类相关联。
最常⽤的是U32过滤器,由⼀个过滤器和⼀个动作组成,选择器⽤来对数据包进⾏匹配,⼀旦匹配成功就执⾏该动作。
带宽控制-分层标记桶(HTB)介绍
HTB介绍HTB(分层标记桶)是一种有助于对不同类型的流实现不同处理的分级排队规则通常,我们可以为一个界面只设置一个队列,但在RouterOS中,队列附属于主HT B,从而带有一些来自父队列的属性。
例如,我们可以为一个工作组设置最大传输率然后在工作组成员之间分配带宽。
HTB排队规则详述:HTB术语:排队规则(qdisc):保存和保持一列数据包的算法。
它确定了流出的包的次序(这意味着排队规则可以对包重新排序)。
当空间已满,qdisc也确定丢弃哪个个包。
过滤器(filter):分类包的过程。
filter负责把包分类,使他们放入相应的排队规则中。
层(level):在分层制中一个类所处的层次。
内部类(Inner class):包含一个或一个以上子类的类。
内部类不储存包,但它们做流量调整。
他们自己没有优先级。
叶类(leaf class):有父类,但是没有子类的类。
Leaf class在分层制中总处于第0层(level 0),每个leaf class都附有一个排队规则(qdisc)。
自载入流(self feed):代表从活动在它所在层的所有的类中流出包的对象。
它由8个self slot组成(对应于8个优先级)。
自接口(self slot):self feed的组成部分,它对应于每个优先级。
所有处于同一层次的同一优先级的类,附属于同一self slot,并通过它来送出数据包。
(在特定层中的)活动类(active class):在指定层中属于某个self slot的类。
内部载入流(inner feed):类似于self feed对象,由inner feed slot组成,是每个Inner class的入口。
内部载入接口(inner feed slot):类似于self slot。
每个inner feed由代表各自优先级的inner slot们组成。
每个类有一个父类,可能有一个或一个以上的子类。
没有子类的类被放在第0层(level 0),类里存有队列,并被称为“叶类”。
htb限速原理
htb限速原理
HTB(Hierarchical Token Bucket)队列是一种可分类的队列,是流量管制中经常使用的一种方法。
其主要工作原理是将进入的流量按照类别进行归类,然后通过令牌桶机制进行速率限制。
每个类别都有一个令牌桶和一个优先级,速率被设定为令牌桶的填充速率。
当类别需要发送数据时,需要首先获取令牌。
如果令牌桶中有令牌,则该类别可以发送数据,否则必须等待或借用其他类别的带宽。
具体来说,某一时刻,每个类别可以处于以下三种状态之一:CAN_SEND(令牌充足,发送的网络包小于rate)、MAY_BORROW(没有令牌,但可借用,发送的网络包大于rate小于ceil)和CANT_SEND(没有令牌不可借用,发送的网络包大于ceil)。
当HTB算法开始决策哪个类别出包时,它会从类树的底部开始寻找CAN_SEND状态的类别。
如果找到某一层有CAN_SEND状态的类别,则停止搜索。
如果该层中有多个类别都处于CAN_SEND状态,则会选取优先级最高的类别进行发送。
如果最高优先级的类别仍然有多个,那么会在这些类别中轮询处理。
每个类别每发送自己的quantum个字节后,轮到下一个类别发送。
传统的限速方案如HTB、TBF等Qdisc存在一个共同的缺点,即依赖全局的Qdisc spinlock进行同步。
这把锁主要有两个原因
难以优化:数据包的入队、出队都是写操作且都不是原子操作,因此需要使用锁来同步;这些Qdisc实现的都是设备全局的限速,其中一部分(如HTB Qdisc)还允许不同流量类型之间互相借用带宽,因此更需要一把全局锁来进行统一协调。
在发送流量较大的时候,这个全局锁的性能瓶颈就会出现。
Linux 限速工具TC 手册简明版
Linux 限速工具TC 手册简明版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 parameters ] flowid flow-idtc [-s | -d ] qdisc show [ dev DEV ]tc [-s | -d ] class show dev DEV tc filter show dev DEV简介Tc用于Linux内核的流量控制。
流量控制包括以下几种方式:SHAPING(限制)当流量被限制,它的传输速率就被控制在某个值以下。
限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。
shaping(限制)只适用于向外的流量。
SCHEDULING(调度)通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。
SCHEDULING(调度)也只适于向外的流量。
POLICING(策略)SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
DROPPING(丢弃)如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。
ip命令手册
ip命令手册(一)摘要ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具。
例如:ifconfig、route等。
这个手册将分章节介绍ip命令及其选项。
本文的原文在/iproute2/ip-cref/(2002-10-15 18:40:46)By nixe0n作者:Alexey N.Kuznetsov编译:nixe0n1.关于这篇文档2.ip命令的语法3.ip的错误信息4.ip link--配置网络设备4.1.ip link set--改变设备的属性4.2.ip link show--显示设备属性5.ip address--协议地址管理5.1.ip address add--添加一个新的协议地址5.2.ip address delete--删除一个协议地址5.3.ip address show--显示协议地址5.4.ip address flush--清除协议地址6.ip neighbour--neighbour/arp表管理命令6.1.ip neighbour add -- 添加一个新的邻接条目ip neighbour change--修改一个现有的条目ip neighbour replace--替换一个已有的条目6.2.ip neighbour delete--删除一个邻接条目6.3.ip neighbour show--显示网络邻居的信息6.4.ip neighbour flush--清除邻接条目1.关于这篇文档ip 是iproute2软件包里面的一个强大的网络配置工具,本文将分章节介绍ip 命令及其选项。
为了便于理解,作者在本文中列举了很多示例。
但是,正如作者所说,这不是一个教程,而是一个使用手册。
2.ip 命令的语法ip 命令的用法如下: ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]其中,OPTIONS 是一些修改ip 行为或者改变其输出的选项。
Linux下使用tc(TrafficControl)流量控制命令模拟网络延迟和丢包
Linux下使⽤tc(TrafficControl)流量控制命令模拟⽹络延迟和丢包 Linux下使⽤tc(Traffic Control) 流量控制命令模拟⽹络延迟和丢包qdisc is short for 'queueing discipline'TC案例如何使⽤tc模拟⽹络延迟和丢包修改⽹络延时: sudo tc qdisc add dev eth0 root netem delay 1000ms查看流量管理:tc qdisc show删除策略:sudo tc qdisc del dev eth0 root netem delay 1000ms验证效果:ping 192.168.102.124 -c 20修改丢包率:sudo tc qdisc add dev eth0 root netem loss 10%删除策略:sudo tc qdisc del dev eth0 root netem loss 10%--------------------------------------------------------------------------------------------------------------------------------------------配置⽹络超时123 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24[root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem delay 100msRTNETLINK answers: Invalid argument[root@dev-xx-xx ~]# tc qdisc showqdisc mq 0: dev eth0 rootqdisc pfifo_fast 0: dev eth0 parent :1 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc pfifo_fast 0: dev eth0 parent :2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc pfifo_fast 0: dev eth0 parent :3 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc pfifo_fast 0: dev eth0 parent :4 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 [root@dev-xx-xx ~]# tc qdisc add dev eth0 root netem delay 100ms[root@dev-xx-xx ~]# ping 192.168.102.124PING 192.168.102.124 (192.168.102.124) 56(84) bytes of data.64 bytes from 192.168.102.124: icmp_seq=1 ttl=64 time=0.074 ms64 bytes from 192.168.102.124: icmp_seq=2 ttl=64 time=0.066 ms64 bytes from 192.168.102.124: icmp_seq=3 ttl=64 time=0.080 ms64 bytes from 192.168.102.124: icmp_seq=4 ttl=64 time=0.043 ms64 bytes from 192.168.102.124: icmp_seq=5 ttl=64 time=0.084 ms64 bytes from 192.168.102.124: icmp_seq=6 ttl=64 time=0.094 ms^C--- 192.168.102.124 ping statistics ---12 packets transmitted, 12 received, 0% packet loss, time11131msrtt min/avg/max/mdev= 0.043/0.081/0.107/0.018 ms[root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem delay 100ms[root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem delay 100msRTNETLINK answers: Invalid argument配置⽹络丢包率123456 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22[root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem loss 10%RTNETLINK answers: Invalid argument[root@dev-xx-xx ~]# tc qdisc add dev eth0 root netem loss 10%[root@dev-xx-xx ~]# tc qdisc showqdisc netem 8005: dev eth0 root refcnt 5 limit 1000 loss 10% [root@dev-xx-xx ~]# ping 192.168.102.124 -n 20PING 20 (0.0.0.20) 56(124) bytes of data.^C--- 20 ping statistics ---21 packets transmitted, 0 received, 100% packet loss, time20650ms[root@dev-xx-xx ~]# ping 192.168.102.124 -c 20 PING 192.168.102.124 (192.168.102.124) 56(84) bytes of data. 64 bytes from 192.168.102.124: icmp_seq=1 ttl=64 time=0.101 ms 64 bytes from 192.168.102.124: icmp_seq=2 ttl=64 time=0.062 ms 64 bytes from 192.168.102.124: icmp_seq=3 ttl=64 time=0.098 ms 64 bytes from 192.168.102.124: icmp_seq=4 ttl=64 time=0.098 ms 64 bytes from 192.168.102.124: icmp_seq=5 ttl=64 time=0.062 ms 64 bytes from 192.168.102.124: icmp_seq=6 ttl=64 time=0.088 ms 64 bytes from 192.168.102.124: icmp_seq=7 ttl=64 time=0.045 ms 64 bytes from 192.168.102.124: icmp_seq=8 ttl=64 time=0.070 ms23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6564 bytes from 192.168.102.124: icmp_seq=9 ttl=64 time=0.062 ms 64 bytes from 192.168.102.124: icmp_seq=10 ttl=64 time=0.066 ms 64 bytes from 192.168.102.124: icmp_seq=11 ttl=64 time=0.088 ms 64 bytes from 192.168.102.124: icmp_seq=12 ttl=64 time=0.070 ms 64 bytes from 192.168.102.124: icmp_seq=13 ttl=64 time=0.089 ms 64 bytes from 192.168.102.124: icmp_seq=14 ttl=64 time=0.087 ms 64 bytes from 192.168.102.124: icmp_seq=15 ttl=64 time=0.054 ms 64 bytes from 192.168.102.124: icmp_seq=16 ttl=64 time=0.085 ms 64 bytes from 192.168.102.124: icmp_seq=17 ttl=64 time=0.064 ms 64 bytes from 192.168.102.124: icmp_seq=18 ttl=64 time=0.124 ms 64 bytes from 192.168.102.124: icmp_seq=19 ttl=64 time=0.063 ms 64 bytes from 192.168.102.124: icmp_seq=20 ttl=64 time=0.108 ms--- 192.168.102.124 ping statistics ---20 packets transmitted, 20 received, 0% packet loss, time19000msrtt min/avg/max/mdev= 0.045/0.079/0.124/0.020 ms [root@dev-xx-xx ~]# tc qdisc del dev eth0 root netem loss 10% [root@dev-xx-xx ~]# ping 192.168.102.124 -c 20PING 192.168.102.124 (192.168.102.124) 56(84) bytes of data.64 bytes from 192.168.102.124: icmp_seq=1 ttl=64 time=0.041 ms 64 bytes from 192.168.102.124: icmp_seq=2 ttl=64 time=0.132 ms 64 bytes from 192.168.102.124: icmp_seq=3 ttl=64 time=0.344 ms 64 bytes from 192.168.102.124: icmp_seq=4 ttl=64 time=0.404 ms 64 bytes from 192.168.102.124: icmp_seq=5 ttl=64 time=0.086 ms 64 bytes from 192.168.102.124: icmp_seq=6 ttl=64 time=0.088 ms 64 bytes from 192.168.102.124: icmp_seq=7 ttl=64 time=0.063 ms 64 bytes from 192.168.102.124: icmp_seq=8 ttl=64 time=0.109 ms 64 bytes from 192.168.102.124: icmp_seq=9 ttl=64 time=0.064 ms 64 bytes from 192.168.102.124: icmp_seq=10 ttl=64 time=0.092 ms 64 bytes from 192.168.102.124: icmp_seq=11 ttl=64 time=0.044 ms 64 bytes from 192.168.102.124: icmp_seq=12 ttl=64 time=0.066 ms 64 bytes from 192.168.102.124: icmp_seq=13 ttl=64 time=0.094 ms 64 bytes from 192.168.102.124: icmp_seq=14 ttl=64 time=0.097 ms 64 bytes from 192.168.102.124: icmp_seq=15 ttl=64 time=0.108 ms 64 bytes from 192.168.102.124: icmp_seq=16 ttl=64 time=0.043 ms 64 bytes from 192.168.102.124: icmp_seq=17 ttl=64 time=0.093 ms 64 bytes from 192.168.102.124: icmp_seq=18 ttl=64 time=0.056 ms 64 bytes from 192.168.102.124: icmp_seq=19 ttl=64 time=0.093 ms 64 bytes from 192.168.102.124: icmp_seq=20 ttl=64 time=0.039 ms--- 192.168.102.124 ping statistics ---20 packets transmitted, 20 received, 0% packet loss, time18999msrtt min/avg/max/mdev= 0.039/0.107/0.404/0.093 ms[root@dev-xx-xx ~]#TC常⽤命令1)模拟延迟传输:# tc qdisc add dev eth0 root netem delay 100ms该命令将 eth0 ⽹卡的传输设置为延迟 100 毫秒发送,更真实的情况下,延迟值不会这么精确,会有⼀定的波动,后⾯⽤下⾯的情况来模拟出带有波动性的延迟值2)模拟延迟波动:# tc qdisc add dev eth0 root netem delay 100ms 10ms该命令将 eth0 ⽹卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送。
ipaddr命令详解;网卡混杂模式(待总结)
ipaddr命令详解;⽹卡混杂模式(待总结)ip addr命令(暂时未找到较为全⾯的总结⽂章)⼯作正常情况下:UP,LOWER_UP + state UP被拔⽹线的情况:NO-CARRIER,UP + state DOWNlink set down:空 + state DOWNifconfig命令⼯作正常情况下:UP+RUNNINGVM虚拟机模拟拔⽹线,⽹络设备状态 UP+⽆RUNNINGip link set dev eth1 down之后,⽹络设备状态⽆UP+⽆RUNNING2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 实际是有在⼯作的,为什么state down=============⽹络设备的状态标识这⼀块,<BROADCAST,MULTICAST,UP,LOWER_UP>,被称为 net_device flag(⽹络设备的状态标识)。
UP,表⽰该⽹卡处于启动状态。
BROADCAST,表⽰该⽹卡有⼴播地址,可以发送⼴播包。
MULTICAST,表⽰该⽹卡可以发送多播包。
LOWER_UP,表⽰L1是启动的,也就是⽹线正插着呢。
mtu 1500,最⼤传输单元MTU为1500字节,也就是以太⽹的默认值。
qdisc pfifo_fast,qdisc的全称为 queuing discipline(排队规则)。
计算机如果需要通过⽹络接⼝发送数据包,它都需要按照这个接⼝的排队规则进⾏排序。
最简单的排序规则就是 pfifo,也就是我们常说的先⼊先出的队列形式。
⽽这⾥的 pfifo_fast 在 pfifo 的基础上,分为了三个波段(数据包按照 Type of Service(服务类型)分⼊band),其中 band0 的优先级最⾼,band2 的优先级最低。
TC学习总结
TC学习总结带宽管理: TC中规定描述带宽: mbps = 1024 kbps = 1024 * 1024 bps => byte/s mbit = 1024 kbit => kilo bit/s mb = 1024 kb = 1024 * 1024 b =>byte mbit = 1024kbit => kilo bit. 默认: 数字使⽤bps和 b⽅式存储.⽆类队列规则: 它能够接受数据和重新编排、延时或丢弃数据包,默认使⽤pfifo_fast队列规则.pfifo_fast: 特点: 对任何数据包都使⽤FIFO(先进先出)队列,来存放⼊队。
但它有3个所谓的"频道",对 每⼀个频道都使⽤FIFO规则,内核会优先将TCP的TOS标志位(“最⼩延迟”)置位的数据包 放⼊0频道,其它的放⼊1和2频道中,当然这是默认⾏为. 三个频道按照0,1,2的顺序,依次 等待处理,即0频道有数据包等待发送,1频道的包就不会发送,若1频道有包等待发送,则 2频道的包将不会被发送。
txqueuelen #关于⽹卡设备的缓冲队列长度,可通过ip 或 ifconfig来修改. ifconfig eth0 txqueuelen 10 priomap: 内核对会根据数据包的优先权将其对应到不同的频道. TCP报⽂中TOS字段如下: TOS值的含义和其对应的频道: 对于以下服务推荐TOS设置: TBF(令牌桶过滤器): TBF是⼀个简单队列,它只允许数据包按照事先设定的速率通过,⽀持设置峰值流量,它很精确, 且对⽹络和处理器的影响较⼩,因此⽐较常⽤. TBF的原理: 它实现了⼀个缓冲器(即令牌桶),在这个桶⾥⾯会不断以特定速率往⾥⾯填充“令牌",token rate (令牌速率)是令牌桶⽐较重要的参数,它是桶的⼤⼩,也就是能存储令牌的数量. 如: rate 200kbps: 它指令牌桶最多存储200kbit个令牌,⼀个令牌1bit, 因为要通过1bit的数据, 就需要⼀个令牌,因此发送速率若为200k bit每秒,则桶⾥⾯始终会有令牌,若超过 则没有可⽤令牌,就会产⽣丢包,这也就是TBF对流量整型的过程; 若低于此速率 则令牌桶可能会被装满,多余的令牌将丢失。
清除tc规则
清除tc规则全文共四篇示例,供读者参考第一篇示例:在网络安全领域中,TC规则(Traffic Control Rules)是一种管理网络流量的策略,用于控制网络数据的流动和传输速度。
通过设置不同的规则,可以限制网络流量的带宽、优先级和延迟,确保网络资源能够合理分配和利用。
随着网络技术的不断发展和网络流量的急剧增加,有时候会出现一些不必要的或者过时的TC规则,这些规则可能会影响网络性能和用户体验。
清除或者调整这些不必要的TC规则变得至关重要。
清除无效的TC规则是很有必要的。
随着网络环境不断变化,一些过去设定的规则可能已经不再适用或者因为其他原因变得无效。
这些规则可能包括已经废弃的服务或者应用程序的特定规则、过期的IP地址或者端口号限制等。
这些规则占用了网络设备的资源,可能会影响网络性能并增加网络管理的困难。
及时清除这些无效的规则对于提高网络效率和安全性非常重要。
调整过时的TC规则也是非常重要的。
随着网络流量的增加和网络应用的变化,原先设定的一些规则可能已经不再适用或者需要进行调整。
一些应用程序可能需要更大的带宽或者更低的延迟来保证其正常运行,而原先的规则可能无法满足这些需求。
此时,需要对这些规则进行审查和调整,确保网络能够适应新的需求。
一些规则可能存在一些缺陷或者漏洞,需要及时修复或者调整,以确保网络的安全性。
清除不必要的TC规则也可以帮助简化网络管理和维护工作。
在很多情况下,网络管理员可能会为了某些临时需求或者特定情况设置了一些临时性的规则,然而这些规则可能会在后续变得多余或者不再需要。
如果不及时清除这些规则,可能会增加设备的负担,影响网络性能,并增加管理的复杂性。
定期审查和清除不必要的TC规则是非常重要的,可以帮助减轻网络管理员的工作压力,提高网络管理的效率。
清除TC规则是网络管理中非常重要的一环。
通过清除不必要的规则、调整过时的规则和简化网络管理工作,可以提高网络性能、保证网络安全,并提高网络管理的效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
qdisc分类排队规则(分类 qdisc)7. 分类排队规则(分类qdisc)分类排队规则赋予了 Linux 流量控制系统极大灵活性。
记住,分类排队规则允许与过滤器相关联,并将数据包分配到子分类和子排队规则上去。
与 root qdisc 或父类相关联的分类器有好几种不同的描述方法。
与 root qdisc 相关联的分类可以叫做根分类,也可以叫做内部分类。
任何不包含子分类的分类通常被称作叶子分类。
在本文中,我们将使用类似树型结构的描述方法,同时也会使用类似家庭成员代词(如孙子节点、兄弟节点)进行描述。
7.1. HTB, 分层令牌桶HTB 基于令牌和桶的概念,并按照基于对象的方法,同时配合filter,实现了一个复杂而又精细的流量控制方法。
利用其提供的borrowing model机制,用户能够构造出十分强大而有效的流量控制结构。
HTB 最简单,同时也是最直接的使用,就是shaping。
如果已经充分了解了tokens和buckets的概念,或者是已经能够熟练使用TBF,那么掌握 HTB 的使用方法也是水到渠成的事了。
HTB 允许用户创建一系列具有不同参数的令牌桶,并按需要将这些令牌桶归类,同时配合使用classifying,就能够实现较细粒度的流量控制。
下面是tc给出的 HTB 的用法。
在编写tcng配置时,同样可以使用这些参数。
例 10. tc 中 HTB 的用法用法: ... qdisc add ... htb [default N] [r2q N]default 当数据包没有被分类时,将通过这里指定的分类发送 {0}r2q DRR quantums are computed as rate in Bps/r2q {10}debug string of 16 numbers each 0-3 {0}... class add ... htb rate R1 burst B1 [prio P] [slot S][pslot PS][ceil R2] [cburst B2] [mtu MTU] [quantumQ]rate rate allocated to this class (class can stillborrow)burst max bytes burst which can be accumulated during idleperiod {computed}ceil 指定分类的最高速率(不包含租借流量) {rate}cburst burst but for ceil {computed}mtu max packet size we create rate map for {1600}prio 叶子优先级,数字越小优先级越高 {0}quantum 叶子节点一次能够提供的字节数 {use r2q}TC HTB version 3.37.1.1. 软件需求和其他流量控制组件不一样,HTB 是一个较新的组件,你的内核可能不支持它。
要让内核支持 HTB,必须使用 2.4.20 或更新版本的内核。
就版本的内核需要打上补丁才能支持 HTB。
要在用户空间上使用 HTB,请参考HTB中有关iproute2的tc补丁的内容。
7.1.2. 整形HTB 最常用的功能就是整形,也就是把出站速率限制在一个固定值之下。
所有的整形操作都在叶子分类上进行。
内部分类和根分类都不会进行整形操作,它们仅在borrowing model中用于控制出借令牌应该如何分配。
7.1.3. 租借模型HTB 的一个重要特性就是租借模型。
当子分类的流量超过了rate时,它们就会向父分类借用令牌,直到子分类借到的令牌数量满足能让其达到ceil指定的速度为止,与此同时,它会暂缓发送数据包,直到有了足够多的令牌(token 或 ctoken)。
由于 HTB 结构树中只有两种主要类型的节点(或者说是分类),下面以表格形式列出两种节点在不同情况下时会采取的动作。
表 2. HTB 中的节点在不同状态下的不同动作节点类型节点状态HTB 内部状态动作叶子节点< rate HTB_CAN_SEND在令牌充足时叶子节点将会发送数据(不超过 burst 个数据包)叶子节点>rate,< ceilHTB_MAY_BORROW叶子节点会试图向父节点借用令牌(tokens或 ctokens)。
如果父节点有足够的令牌,就会一次性借给子节点quantum的整倍数个令牌,接着叶子节点发送最多cburst个字节。
叶子节点> ceil HTB_CANT_SEND暂缓发送数据包,这将增大数据包延迟,使网络接口上的流量符合整形速率。
节点类型节点状态HTB 内部状态动作内部节点,根节点< rate HTB_CAN_SEND本节点将会出借令牌给子节点。
内部节点,根节点>rate,< ceilHTB_MAY_BORROW本节点试图将向父节点借用令牌(tokens 或ctokens),并将借到的令牌按照quantum的整数倍出借给子节点。
内部节点,根节点> ceil HTB_CANT_SEND本节点不会向父节点借用令牌,也不会向子节点出借令牌。
下图绘出了借用令牌和归还令牌的流向。
为了使租借模型正常运行,必须为每个分类指定明确的令牌数量,及其子分类可用的令牌数量。
同样,子分类或叶子节点必须向其父对象归还借用的令牌,层层向上直到根分类。
当子节点向其父节点借用令牌时,不论父节点是否已经超过了自己的rate,他都会向上一级节点请求借用令牌,直到借到了令牌,或者达到了根节点为止。
所以,出借令牌的流向是从根到叶子,而归还令牌的流向是从叶子到根。
此图中有多个 HTB 根分类,每一个根分类都可以模拟成一条虚电路。
7.1.4. HTB 分类参数default所有 HTB qdisc对象的默认值,这个参数是可选的。
默认的default值为0,这意味着所有通过 root qdisc 的数据包将以设备的最大吞吐能力发送出去。
rate设定整形流量速率的最小速度。
这个值可以当作承诺信息速率(CIR,也可以当作叶子节点的最低带宽。
ceil设定整形流量速率的最大速度。
租借系统的设置将影响这个参数的实际作用。
这个参数可以当作是“突发速率”。
burst这是rate令牌桶的大小。
(参考Tokens and buckets)。
HTB 会在令牌(tokens)还没有到来的情况下提前发送burst个字节的数据。
cburst这是ceil令牌桶的大小。
HTB 会在令牌(ctokens)还没有到来的情况下提前发送burst个字节的数据。
quantum这个参数在 HTB 的租借系统中很重要。
通常,HTB 会自己计算合适的quantum值,而不需要用户手工指定。
有人认为调整这个参数能在出借令牌和整形方面收到不少好处,但也有不少人持反对意见,because it is used both to split traffic between children classes overrate (but below ceil) and to transmit packets from these sameclasses.r2qr2q可以由用户自行指定,HTB 会参考用户设定的值,为每个分类计算出一个更合适的quantummtuprio7.1.5. Rules下面是一些一般性的提示,这些提示是从/和LARTCmailing list中选取出来的,可以给入门用户提供指导性的意见,尽可能地发挥 HTB 的效能。
对于高级用户,则可以根据自己的实际需要调整 HTB 以获取最大效益。
∙在 HTB 中,只有叶子节点才会对流量进行整形。
参考第 7.1.2 节“整形”。
∙因为在 HTB 只有叶子节点会对流量进行整形,所以一个分类下的所有叶子节点的rate之和不应该超过这个分类的ceil。
通常我们建议将分类的rate值设定为其所有子节点的rate之和,这样,分类随时都能有剩余的带宽(ceil - rate)分配给子节点。
由于这个概念十分重要,所以才一而再再而三地强调:在 HTB 中只有叶子节点才会对流量进行整形,数据包只会在叶子节点中被暂存,任何中间节点都不会对流量进行整形,中间节点只在租借模型中起作用(参考第 7.1.3 节“租借模型”)。
∙quantum仅在当一个节点的速率大于rate而小于ceil时起作用。
∙quantum的值应该至少设为和 MTU 一样大,或者比 MUT 更大。
即使quantum设置值过小,但一有机会 HTB 就会立即发送一个数据包,这将导致 HTB 无法正确计算带宽消耗,也就无法正确地对流量进行整形[9]。
∙父节点每次借给子节点的令牌数都是quantum的整数倍,因此,为了使网络反应更加迅速、粒度更细,quantum应该设置得尽可能小,而又不能小于 MTU。
∙tokens 和 ctokens 仅仅在叶子节点上才有区别,因为非叶子节点只会将令牌借给它自己的子节点。
∙HTB 的租用模型更精确的说法应该叫做“租借后使用机制”。
7.2. HFSC, 分层公平服务曲线HFSC(Hierarchical Fair Service Curve,HFSC)能够将延迟敏感型流量和吞吐量敏感型流量区分对待,它会根据服务曲线定义在拥挤的线路上保证延迟敏感型数据包能够被及时发送,同时线路又保持有较大的吞吐量。
有关 HFSC 的详细情况请参考HFSC Scheduling with Linux和 A Hierarchical Fair Service Curve Algorithm For Link-Sharing, Real-Time and Priority Services。
本节尚待日后完成。
7.3. PRIO, 优先级调度PRIO 分类排队规则十分简单,当允许发送数据包时,PRIO 会首先检查第一个分类中有没有数据包,如果有就发送出去,如果没有数据包,就检查下一个分类,以此类推,直到检查完所有的分类。
本节尚待日后完成。
7.4. CBQ, 基于类的队列基于类的队列(Class Based Queuing)是非常经典的排队算法。
本节尚待日后完成。
[9] HTB 会使用quantum而非实际的数据包大小来计算流量,这就会导致流量消耗计算错误,且误差会迅速扩大。