加权公平排队(WFQ)顾名思义就是一种排队算法。当接口拥塞时使用队列。这通常是通过发送环(TX-Ring)已满来检测的。这意味着接口正忙于发送数据包。除非接口拥塞,否则不会发生排队。在某些情况下,可以操纵 TX 环的大小。一个小的 TX-ring 为软件队列提供了更多关于哪些数据包首先发送出去的权力,但它不是很有效。太大的 TX 环会使软件队列几乎无用,并导致重要数据包的更高延迟和抖动。
默认排队算法通常是先进先出 (FIFO)。这意味着数据包按照到达接口输入端的顺序进行传送。这通常是不可取的,因为一些数据包应该被优先处理。
客户以低价从 Internet 服务提供商 (ISP) 购买服务是很常见的。也就是说,客户购买了 50 Mbit/s 的服务,但物理接口以 100 Mbit/s 的速度运行。在这种情况下,不会出现拥塞,但 ISP 将限制来自客户的流量。为了在这些情况下引入人为拥塞,可以应用整形器。
因此,既然存在拥塞,就可以应用排队算法。请注意,排队算法不提供任何额外的带宽,它们只是让我们决定哪些数据包对我们更重要。WFQ 是一种算法,它采用多个参数并基于这些参数做出决定。该算法相当复杂,使用权重(IP Precedence)、数据包大小和调度时间作为参数。INE这里有非常详细的解释。如果不想过多地处理排队问题,WFQ 是一个不错的选择,因为它为 SSH、Telnet、语音等小流量提供了足够的带宽,这意味着文件传输不会窃取所有带宽。
加权随机早期检测 (WRED) 是一种拥塞避免机制。WRED 根据 Precedence 值测量队列的大小,并在队列介于最小阈值和最大阈值之间时开始丢弃数据包。配置将决定每 N 个数据包中的 1 个被丢弃。WRED 有助于防止 TCP 同步和 TCP 饥饿。当 TCP 丢失数据包时,它将进入慢启动状态,如果所有 TCP 会话同时丢失数据包,它们可能会变得同步,提供如下图:
可以看出,如果未配置 WRED,图形会先全速运行,然后是静音,然后是全速运行,依此类推。WRED 提供更平均的传输速率。需要注意的是,UDP 不会受到丢包的影响,因为它没有像 TCP 那样实现的确认机制和滑动窗口。因此,WRED 不应在基于 UDP 的类上实现,如处理 SNMP、DNS 或其他基于 UDP 的协议的类。
WFQ 和 WRED 可以而且应该一起部署。