Traffic Control
Qos/DSCP
TC
在Linux Kernel中完成Traffic Control功能主要包含以下几个组成部分:
Qdiscs (queuing disciplines): 排队规则, 该object决定进入该队列的数据包的流量控制。队列分为:不可分类队列 和 可分类队列。
Classes (within a queuing discipline): 分类器,对设备的流量控制的进行分类,设置不同种类的流量控制策略。Class必须属于可分类队列, 不同的Class下可以挂载其它队列,或作为终结点,什么都不做。
Filters: 过滤器,对网络上的数据包,根据需求的不同对不同的数据包设置不同的流量控制策略。
以下是几个图简单介绍的TC是如何工作的:
如下图:设备eth1上有一个QdiscHTB, 其总流量为128KB/s, 即Class1 (1:1); Class1 的流量分为三类:Class2: 60KB/s, Class3: 40KB/s, Class4: 28KB/s. 后期可以使用Filter将不同的数据分类到不同的class.
以下对这3个Objects进行介绍:
Qdiscs
Classless Qdiscs
[p|b]fifo
非常简单的队列,先进先出。P(packet), b(byte) 区分这个队列的是以packet或byte为单位。
pfifo_fast
这个是设备默认的Qdisc。Pfifo_fast中划分三个band, 即band0,band1, band2。我们可以将其想象成三个通道,每个通道都采取FIFO的策略,同时这三个队列有优先级的差别,即band0中的数据传完后才传输band1中数据,band1中的数据传完后才传输band2中数据。
内核遵照数据包的TOS标记,把带有“最小延迟”标记的包放进0频道。
red
随机早期检测队列。在达到限制的流量后,以随机的方式丢弃一些数据包。通常应用在骨干网上。
sfq
随机公平队列。该队列并不对流量进行限制。将队列分为多个通道,将对外发送数据的会话以随机的方式安排在不同的通道中,每个通道都会有固定的数据发送时间,由此达到公平的目的。SFQ之所以被称为“随机”,是因为它并不是真的为每一个会话创建一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去。
tbf
Please ‘man tbf’for detail.
令牌桶过滤器:只允许以不超过事先设定的速率到来的数据包通过, 但可能允许短暂突发流量朝过设定值。
TBF的实现在于一个缓冲器(桶),不断地被一些叫做“令牌”的虚拟数据以特定速率填充着(tokenrate)。桶最重要的参数就是它的大小,也就是它能够存储令牌的数量。
每个到来的令牌从数据队列中收集一个数据包,然后从桶中被删除。这个算法关联到两个流上——令牌流和数据流,于是我们得到3种情景:
数据流以等于令牌流的速率到达TBF。这种情况下,每个到来的数据包都能对应一个令牌,然后无延迟地通过队列。
数据流以小于令牌流的速度到达TBF。通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里积累下来,直到桶被装满。剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉,这种情况下会发生突发传输。
数据流以大于令牌流的速率到达TBF。这意味着桶里的令牌很快就会被耗尽。导致TBF中断一段时间,称为“越限”。如果数据包持续到来,将发生丢包。
最后一种情景非常重要,因为它可以用来对数据通过过滤器的速率进行整形。
令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包,但是持续越限的话会导致传输延迟直至丢包。
Classful Qdiscs
PRIO
PRIO队列规定并不进行整形,它仅仅根据你配置的过滤器把流量进一步细分。你可以认为PRIO队列规定是pfifo_fast的一种衍生物,区别在每个频道都是一个单独的类,而非简单的FIFO。
当数据包进入PRIO队列规定后,将根据你给定的过滤器设置选择一个类。缺省情况下有三个类,这些类仅包含纯FIFO队列规定而没有更多的内部结构。你可以把它们替换成你需要的任何队列规定。
每当有一个数据包需要出队时,首先处理:1类。只有当标号更小的类中没有需要处理的包时,才会标号大的类。
HTB
http://linux-ip.net/articles/Traffic-Control-tcng-HTB-HOWTO.html
http://wiki.mikrotik.com/wiki/Manual:HTB
http://lartc.org/howto/lartc.qdisc.classful.html#AEN1071
http://liuleijsjx.iteye.com/blog/402152
http://luxik.cdi.cz/~devik/qos/htb/
HTB 是 HierarchyToken Bucket的简写,它实现了一个丰富的连接共享类别结构,使用HTB可以很容易的保证每个类的带宽,同时也允许特定类可以突破上限,占用其他类等宽等。HTB通过TFB实现带宽限制,也可以为类划分优先级。
1. Link sharing 链路共享。HTB 可以保障提供给每个类带宽的数量是它所需求的最小需求或者等于分配给它的数量。当一个类需要的带宽少于分配的带宽时,剩余的带宽被分配给其他需要服务的类。
2. Sharing hierarchy 共享层次。带宽共享是有层次的,不会越层共享。
3. Rate ceiling 速率限度。参数ceil指定了一个类可以用的最大带宽,用来限制类可以借用多少带宽。缺省的ceil是和速率一样。
4. Burst 突发。
5. Priorizingbandwidth share 带宽分配优先。带宽分配的优先级包括两个方面,首先它影响到子类剩余带宽的分配,另一个方面的问题,包的延时。
6. Understandingstatistics 查看统计。TC工具允许你对LINUX队列规定进行统计。
CBQ
Filters
http://www.study-area.org/tips/adv-route/Adv-Routing-HOWTO-11.html
U32 filter
对数据包进行匹配,对不同的数据包进行分类选择。
Fw filter
"fw"分类器要依靠防洪墙把需要引导的封包标示起来。所以,我们必须先设定好防火墙,为他们打上标识。
Reference:
1. http://blog.csdn.net/wuruixn/article/details/8210760
2. http://www.cnblogs.com/fsw-blog/p/4788036.html
3. http://professor.blog.51cto.com/996189/1569481/
4. http://www.360doc.com/content/12/0731/14/1073512_227467421.shtml
5. http://blog.chinaunix.net/uid-25266990-id-3839886.html
6. http://blog.csdn.net/zgangz/article/details/42737871
7. http://blog.sina.com.cn/s/blog_6a1837e90100v9ye.html
8.