WFQ

拥塞管理算法
WFQ是加权公平排队(Weighted Fair Queuing)缩写。它是一种拥塞管理算法，该算法识别对话（以数据流的形式）、分开属于各个对话的分组，并确保传输容量被这些独立的对话公平地分享。WFQ是在发生拥塞时稳定网络运行的一种自动的方法，它能提高处理性能并减少分组的重发。
目标
1为每个活动流提供公平的带宽分配机制
2为少量交互流提供更快的调度机制
3为高优先级流提供更多的带宽
WFQ：是一种基于流的排队算法，到达的数据包被分成多个流，每个流都被分配给一个FIFO队列。
可以基于IP和TCP或UDP头中以下字段标识流：源IP地址目的IP地址 协议号 TOS 源TCP/UDP端口号目的TCP/UDP端口号
WFQ插入和丢弃策略
WFQ有一个保持队列（hold queue）,保持队列=WFQ系统中数据包占用的所有内存之和，数据包到达时，保持队列已满，那就丢弃数据包（WFQ主动丢弃WFQ aggressive dropping）
例外：数据包分配到一个空队列，不会丢弃
原理
基本原理
WFQ是根据流对报文进行动态分类，对于IP网络，五元组（源IP地址、目的IP地址、源端口号、目的端口号、协议号）和IP优先级或者DSCP相同的报文属于同一个流。在接入层的网络中，通常使用IP优先级和五元组配合进行流分类；在汇聚层网络中通常使用DSCP值和五元组配合进行流分类，具有相同特性的报文属于同一个流，使用Hash算法映射到不同的队列中；另外的一个区别就是如果使用WFQ，那么low-volume（字节数小的报文）、higher-precedence（优先级高的报文）的流会比large-volume、lower-precedence的流更先处理。因为WFQ是基于流的，每个流使用不同的队列，这就要求WFQ能够支持很大数目的队列——WFQ最大可以在每个接口支持到4096个队列。
WFQ与CQ主要区别如下：
CQ可以自定义ACL规则来对报文进行分类，而WFQ只能根据元组对报文进行动态分类；
WFQ和CQ的队列调度方式不一样，CQ的调度方式是RR，而WFQ的调度机制是WFQ调度机制；
WFQ和CQ的报文丢弃机制不一样：CQ使用Tail Drop机制，WFQ使用WFQ丢弃机制，该机制是对Tail Drop的一种改进。
要想理解WFQ，必须了解这个机制出现的目的是什么，即使用WFQ是为了达到什么目的？WFQ调度主要是为了两个主要的目的，一个是在各个流之间提供公平的调度即WFQ名字中的F（fairness）的含义，另外一个就是保证高IP precedence的流能够得到更多带宽即WFQ名字中的W（weighted）的含义。
带宽分配
为了提供各个流之间的公平调度，WFQ给每个流分配的带宽是相同的。例如一个接口有10条流，该接口带宽为128Kbps，那么每个流得到的带宽为128/10=12.8Kbps。从某种意义上讲，有些类似于时分复用机制（TDM）。
WFQ允许其它流使用某条流的剩余带宽，例如接口带宽为128kbps，共10条流，则每条流分配的带宽为12.8kbps，可能实际上某条流例如流1只有5kbps，而流2有20kbps，那么其它的流就可以分配流1所剩余下的12.8－5=7.8kbps的带宽。WFQ的加权是根据流中的IP precedence进行的，保证高IP precedence的流分配到更多的带宽。算法为（IP precedence+1）/Sum（IP precedence+1），例如有四个流，其IP precedence分别为1、2、3、4，那么每个流占用的带宽分别为2/14、3/14、4/14、5/14。
队列调度机制
要想理解WFQ的队列调度机制，需要理解WFQ中的一个重要概念：序列号SN（不同的文档可能采用不同的参数，不管使用什么参数都应该达到小字节、高IP优先级的流被优先调度），报文在经过流分类后，在决定该报文是入队列还是丢弃之前，都要赋予一个SN。SN的计算公式为SN=Previous_SN+weight×new_packet_length，WFQ进行报文调度时都是先调度SN小的报文，为了保证IPPrecedence大的能够获得更多的带宽，从SN的计算公式就可以看出Weight应与Precedence成反比。
其中Previous_SN分为两种情况：
如果报文进入的队列为非空，使用该队列中最近进入队列报文的SN作为Previous_SN；
如果报文进入的队列为空，使用发送队列最近发送的报文的SN作为Previous_SN。
图8
图8中：有四条流，每条流的precedence相同都为0，只是报文的大小不同，Flow1到Flow4的报文长度从大到小，按照SN的计算公式，报文长度小的SN小，所以Flow4中的报文应该被优先调度出去，当然最终的决定因素还是SN的大小，对于SN相同的报文实行顺序调度，如本例所示：Packet5和Packet10的SN相同、Packet1和Packet11的SN相同，按照顺序调度规则，应该是Packet5在Packet10前，Packet1在Packet11前。最终的调度的结果是：13，14，15，16，9，5，10，1，11，6，12，2，7，8，3，4。
丢弃机制
HQL（Hold-Queue-Limit）：限制了所有队列中能够存放的报文总数目；
CDT（Congestive Discard threshold）：限制了每个队列中能够存放的报文数目。
WFQ使用WFQ丢弃机制，该机制是对TailDrop的一种改进，其中的一个决定因素也是SN，另外WFQ还使用HQL和CDT来决定如何对报文进行丢弃。
如果一个新的报文达到时HQL已经到达最大值，该报文直接被丢弃；如果此时HQL没有到达最大值，WFQ将该报文根据WFQ的分类原则进行分类决定进入到哪个队列并计算出SN，剩下的丢弃机制还会由CDT决定，CDT是每个队列自己的丢弃阀值，如果此时CDT没有到达最大值报文直接进入该队列，如果CDT已经达到阀值，则判断其它队列是否有SN比新进入的报文SN大，如果没有直接丢弃新进入的报文，如果其他队列有SN大于当前入队列的报文，WFQ会选择丢弃SN大最大的报文。
简单的说就是当某个队列的报文数目已经超过该队列CDT，WFQ可以选择丢弃其它队列中SN最大的报文！
优缺点
主要优点
WFQ配置简单，无需显示分类
不会让任何流得不到处理机会，能够保证所有流的吞吐量
从最主动的流中丢弃数据包，可以为非主动流提供更快的服务
是一种标准.简单的排队机制，大多数CISCO平台和IOS版本都支持
缺点
WFQ的每个子队列都继承了FIFO的缺点
WFQ的分类和调度机制是不可配置和无法修改的
WFQ仅支持低速链路（2.048Mbit/s及以下的）
WFQ不能为流量流提供带宽和时延保证
WFQ系统中多个流量流可能会被分配到同一个队列中去
配置和监控
默认情况下，所有低速（2.048Mbit/s及以下）串行接口都启用WFQ
接口模式下： fair-queue [cdt] [dynamic-queues] \\ cdt 为拥塞丢弃门限,dynamic 动态队列默认为256
hold-queue max-limit out \\定义保持队列
CBWFQ基于类别的加权公平排队
比WFQ更好，因为可以创建用户自定义的类别，并为所有类别分配专属队列，每个队列都有用户自定义的（最小）带宽，而且在有可用带宽队列可以使用更多带宽。
最多可以创建64个用户自定义类别，每个队列都是有保证带宽和最大包门限的FIFO队列，一旦达到最大，就会产生尾部丢弃。
分类，调度和带宽保证
带宽
带宽百分比
带宽剩余百分比
CBWFQ的优点
可以创建用户自定义的类别，利用MQC的分类映射可以很容易地定义这些流量类别
可以基于用户策略和用户意愿为每种流量类别分配/预留带宽
可以基于现有网络应用和用户策略定义最多64个固定类别，从而提供微调手段，而且扩展性更好
缺点：没有为实时性应用提供合适地队列（VOIP和 视频）无法保证低时延
配置和监控
LLQ
包含了一个优先级队列，使其非常适合时延和抖动敏感型应用
优点：
LLQ具有CBWFQ的所有优点，包括自定义流量类别，为每种类别的流量提供带宽保证，并且可以在所有类别的队列上应用WRED。（严格优先级队列除外）
对于LLQ和CBWFQ来说，任何没有被显示分类的流量都被认为class-default流量，可以将class-default流量类别队列由FIFO改为WFQ,需要时也可以用WRED.
LLQ最大优势 可以为时延和抖动敏感型应用的流量提供一个或多个有带宽保证的严格优先级队列
LLQ并不局限于特定平台或传输介质
配置和监控LLQ