路由器中的被动队列管理
当数据包的到达速度快于数据包的转发速度时,就会发生拥塞。路由器有输入和输出端口。因此,根据交换结构的速度,任何端口都可能发生拥塞。
输入端口拥塞
假设路由器有 N 个输入端口和 N 个输出端口。如果交换结构的速度小于数据包到达输入端口的速度的 N 倍,则会发生拥塞。假设 1 个数据包在一个单位时间内到达每个输入端口。单位时间内有 N 个数据包到达输入端口。交换结构的速度小于每单位时间 N 个数据包,因此它将无法将到达输入端口的这 N 个数据包转发到输出端口。假设交换结构处理 N/2 个数据包,剩余的 N/2 个数据包在某些输入端口中排队。如果这些数据包不断地从输入端口进来,那么输入端口的缓冲区很快就会被填满,拥塞状态就会存在,数据包就会被丢弃。
输出端口拥塞
假设交换结构的速度是每单位时间 N 个数据包。在最坏的情况下,N 个数据包到达输入端口,交换结构正在处理它们并将所有 N 个数据包转发到每单位时间的输出端口。因此,输入端口不会发生拥塞。有一点需要注意,每个输入端口都没有直接链接到输出端口。如果多个数据包注定要发送到同一个输出端口,则该特定输出端口将发生拥塞。假设所有 N 个数据包都注定要到达输出端口 1,那么在一个单位时间内,输出端口将传输 1 个数据包并将其余 n-1 个数据包排队到缓冲区中。再次将 n 个数据包接收到相同的输出端口 1,然后它将再次排队 n-1 个数据包并传输 1 个数据包。很快,缓冲区将满,丢包开始发生,这是输出端口的拥塞状态。
队列管理算法
队列管理也称为队列规则 (qdiscs)。它可以分为两种类型。
- 被动队列管理(例如,FIFO)
- 主动队列管理(例如,随机早期检测)
被动队列管理算法本质上是反应式的,即它们在队列满后运行。它们易于部署。 PQM 很难提供队列控制。主动队列管理算法本质上是主动的,即,它们在队列满之前运行。它们很容易部署,但难度适中。它们提供了良好的队列控制。
被动队列管理
1. 掉尾巴
它从队列的“尾部”丢弃数据包。当队列已满且数据包仍在到达时,传入的数据包将被丢弃,因为队列中没有空间。由于数据包从尾部丢弃,因此称为丢弃尾部。它就像一个简单的 FIFO 队列。先到达的数据包会排队,而后到达的数据包会被丢弃。
2. 滴头
它从队列的“头部”丢弃数据包。当队列已满但仍有数据包到来时,它会通过从队列头部丢弃数据包来为新到来的数据包腾出空间。这也称为前降。 DropHead 确保公平。像 bit-torrent 这样的持久流消耗了大部分带宽,其他应用程序变得更慢。持久应用程序的数据包将不断填充缓冲区,而短持久流将被 DropTail 丢弃,但 DropHead 会通过丢弃长持久流的数据包来为它们腾出空间。它对短暂的流量进行了公正处理。
3. 随机掉落
顾名思义,它从队列中的随机“位置”丢弃数据包。生成一个随机数并丢弃该索引处的数据包。这为每个数据包提供了公平的机会留在队列中。问题:使用 Random Drop 有什么好处?如果我们从头部丢弃数据包,那么我们正在损害持久的流量。如果我们从尾部丢弃数据包,我们正在损害对时间敏感的流。因此,为了公平对待这两种类型的流,我们随机选择一个数据包并将其丢弃。让命运决定哪个数据包会被丢弃,哪个流会受到伤害。
PQM 算法的局限性
PQM 受到许多限制。它不控制拥塞。发生丢包,无法控制丢包。当情况不好时,它就会发挥作用。它本质上是主动的,因此存在缺点。下面列出了三个主要缺点。
1. 全局同步
假设多个 TCP 流在不同的时间开始,例如 time=0、time=5 和 time=15 秒。所有这些流程都以慢启动算法开始,以处理拥塞。所有 TCP 连接的拥塞窗口都随着慢启动而增加。 DropTail 导致所有流的许多数据包同时被丢弃。 DropTail 平等对待所有流,它不优先考虑任何流。当DropTail 丢弃每个流的数据包时,TCP 流同时减少它们的拥塞窗口,这是第一次所有流同步。随后,所有 TCP 流同时增加其拥塞窗口(同步)。当所有流同时将其 cwnd 减少一半时,它们并没有充分利用带宽,因此是带宽利用不足。同样,当所有流都增加它们的 cwnd 时,就会发生过度使用。链路“过度利用”和“利用不足”的频繁时期。这会增加抖动(延迟变化)。
2. 锁定
DropTail 允许少数流独占队列空间。这些流程通常是持久的流程(又名“大象”流程)。由于长期流的大量占用,短流(又名老鼠流)在队列中没有足够的空间。短流数据包被丢弃。这种现象称为“锁定”。请注意,DropHead 是解决此问题的方法,但不是 100%。 DropHead 从队列的头部丢弃数据包,并允许一个短流数据包一次进入。但是这个 DropHead 创造了多少空间?与队列的大小相比非常少。尽管如此,大部分空间都被持久的流动所占据。由于短流没有在队列中获得空间,因此它们的数据包将不断被丢弃,这称为锁定。
3. 缓冲膨胀
内存价格大幅下跌。这个问题也很早就存在,但由于内存大小和价格的原因从未变得严重。 2005 年,最大 RAM 容量为 256 MB,但现在最小为 8 GB。因此,缓冲能力增加了。过度缓冲会导致“高排队延迟”。据报道,排队延迟有时会上升到 TCP RTO 到期!由于缓冲膨胀,对时间敏感的应用程序是受影响最严重的应用程序。