Linux流量控制控发不控收,所以只能对产生瓶颈网卡处的发包速率进行控制..而网络瓶颈分析亦为Linux网络流控的第一步。
二种流控算法上分:
无类算法用于树叶级无分支的队列SFQ TBF pFIFO
分类算法用于多分支的队列PRIO HTB CBQ
调度
在分类器的帮助下,一个队列规定可以裁定某些数据包可以排在其他数据包之前发送。这种处理叫做“调度”,比如此前提到的pfifo_fast就是这样的。调度也可以叫做“重排序”,但这样容易混乱。
整形
在一个数据包发送之前进行适当的延迟,以免超过事先规定好的最大速率,这种处理叫做“整形”。整形在出对处进行。习惯上,通过丢包来降速也经常被称为整形。
1 pfifo_fast
这个队列的特点就象它的名字——先进先出(FIFO),也就是说没有任何数据包被特殊对待。至少不是非常特殊。
这个队列有3个所谓的“频道”。FIFO规则应用于每一个频道。并且:如果在0频道有数据包等待发送,1频道的包就不会被处理,1频道和2频道之间的关系也是如此。
内核遵照数据包的TOS标记,把带有“最小延迟”标记的包放进0频道。
不要把这个无类的简单队列规定与分类的PRIO相混淆!虽然它们的行为有些类似,但对于无类的pfifo_fast而言,你不能使用tc命令向其中添加其它的队列规定。
pfifo_fast队列规定作为硬性的缺省设置,你不能对它进行配置
2.队列控制的无类算法SFQ
SFQ(Stochastic Fairness Queueing 随机公平队列)是公平队列算法家族中的一个简单实现.它的精确性不如其它的方法,但实现了高度的公平,需要的计算量亦很少。
SFQ算法主要针对一个TCP会话或者UDP流.流量被分成相当多数量的FIFO队列中,每个队列对应一个会话.数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会. 这种方式非常公平,保证了每一个会话都不会没其它会话所淹没.
SFQ之所以被称为"随机",是因为它并不是真的为每一个会话创建一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去. 因为使用了散列,所以可能多个会话分配在同一个队列里,从而需要共享发包的机会,也就是共享带宽.为了不让这种效应太明显,SFQ会频繁地改变散列算法, 以便把这种效应控制在几秒钟之内(时间由参数设定).
注:SFQ只会发生在数据发生拥堵,产生等待队列的网卡上..出口网卡若无等待队列,SFQ亦不起作用...
以下示例即在网卡上建立SFQ:
#tcqdisc add dev eth0 root handle 1: sfq
SFQ参数有perturb(重新调整算法间隔) quantum基本上不需要手工调整:
perturb
多少秒后重新配置一次散列算法。如果取消设置,散列算法将永远不会重新配置(不建议这样做)。10秒应该是一个合适的值。
quantum
一个流至少要传输多少字节后才切换到下一个队列。却省设置为一个最大包的长度(MTU的大小)。不要设置这个数值低于MTU!
handle 1: 规定算法编号.
#tc qdisc sh dev eth0 显示算法
#tc qdisc del dev eth0 root 删除注:默认eht0支持TOS
SFQ队列一般用在树叶级,配合其它流量整形算法一并使用。
3.流量控制的无类算法TBF
令牌桶过滤器(TBF)是一个简单的队列规定:只允许以不超过事先设定的速率到来的数据包通过,但可能允许短暂突发流量朝过设定值.
TBF很精确,对于网络和处理器的影响都很小,实现是针对数据的字节数进行的,而不是针对数据包进行,常用于网关限速.
TBF的实现在于一个缓冲器(桶),不断地被一些叫做"令牌"的虚拟数据以特定速率填充着. (token rate).桶最重要的参数就是它的大小,也就是它能够存储令牌的数量. 每个到来的令牌从数据队列中收集一个数据包,然后从桶中被删除.这个算法关联到两个流上——令牌流和数据流,于是我们得到3种情景:
A.数据流以等于令牌流的速率到达TBF.这种情况下,每个到来的数据包都能对应一个令牌,然后无延迟地通过队列.
B.数据流以小于令牌流的速度到达TBF.通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里积累下来,直到桶被装满.剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉,这种情况下会发生突发传输.
C.数据流以大于令牌流的速率到达TBF.这意味着桶里的令牌很快就会被耗尽.导致TBF中断一 段时间,称为"越限".如果数据包持续到来,将发生丢包. 此种情况最重要,因为它可以用来对数据通过过滤器的速率进行整形. 令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包,但是持续越限的话会导致传输延迟直至丢包.