PFIFO,BFIFO

PFIFO 和 BFIFO 是 MikroTik RouterOS 中遵循 FIFO 原则的队列管理策略,PFIFO 按到达顺序优先处理数据包,BFIFO 则管理基于字节的带宽分配。两者都确保公平性但缺乏流量优先级划分,区别在于队列大小的计量方式和丢包行为。

PFIFO,BFIFO

概述

队列类型就像是无类别排队规则的模板——这些算法控制着数据包在进一步传输之前如何在内存缓冲区中被丢弃或排队。它们对于确保良好的服务质量至关重要,因为它们不仅能在超出带宽限制时提供帮助,还会影响延迟等其他方面。

它们的复杂性和属性差异很大。例如,先进先出(FIFO)队列简单,并确保数据包处理顺序的公平性,但它可能导致队头阻塞等问题。更复杂的队列类型,例如实现公平排队或拥塞避免的类型,可以更有效地管理网络性能,但它们可能需要更多资源和配置。

因此,队列类型的选择取决于网络的具体需求和特征。

PFIFO(Packet First-In, First-Out)

描述

PFIFO(Packet First-In, First-Out)是一种遵循基本队列逻辑的队列管理策略。PFIFO 的主要原则是:第一个到达的数据包就是第一个被发送出去的数据包。这种方法简单直接,并确保没有数据包会比其他数据包获得优待。

当数据包进入队列时,它们被放置在队列的末尾(尾部)。当有可供传输的空间时,队列前端(头部)的数据包会首先被发送。如果数据包到达时队列已满,则该数据包被丢弃或遵循其他策略,具体取决于所采用的总体队列管理策略。

特性

  • 简单性: PFIFO 是最简单的队列管理形式之一。它不需要复杂的算法或大量的计算资源。这使其易于实现和理解。
  • 公平性: 所有数据包都被平等对待,无论其来源、目的地或内容。第一个进入的是第一个出去的。
  • 无优先级: 它没有对某些类型流量优先于其他流量的固有能力。虽然这确保了公平性,但在处理可能需要划分优先级的不同类型网络流量时,这可能是一个缺点。

示例

想象一下邮局里的队伍。排队的每个人(数据包)代表队列中等待的一个数据包。排在第一个的人首先得到服务,然后是下一个,依此类推。如果邮局太忙并且队伍已满,任何新来的人都必须等待或离开(数据包被丢弃)。

结论

虽然 PFIFO 简单直接,但它缺乏流量优先级划分能力可能是一个缺点,尤其是在管理包含不同类型数据的网络流量时。在这些情况下,RouterOS 中提供的更复杂的队列管理算法(例如 CAKE、FQ-CoDel 或 PCQ)可能更合适。

BFIFO(Byte First-In, First-Out)

描述

BFIFO(Byte First-In, First-Out)是另一种队列管理策略,其操作原理与 PFIFO 类似,但有一个关键区别:BFIFO 基于数据包的大小(即字节)而非数据包数量进行操作。

在 BFIFO 系统中,当数据包进入队列时,它们仍然被放置在末尾,前端的数据包首先被发送。然而,队列大小以字节而非数据包数量计算。当队列达到其最大字节大小时,任何新到达的数据包都会被丢弃,或遵循其他策略。

特性

  • 基于字节: 与 PFIFO 不同,BFIFO 基于字节计算队列大小,从而可以更精确地控制带宽使用。
  • 公平性: BFIFO 同样确保公平性,因为它平等对待所有数据包,无论其来源、目的地或内容。
  • 无优先级: 与 PFIFO 类似,BFIFO 没有对某些类型流量优先于其他流量的固有能力。

示例

可以把公共汽车视为 BFIFO 系统的一个例子。公共汽车有一个最大载客量(类似于队列的字节大小)。即使有一队人在等待(数据包),如果公共汽车已满,新乘客也无法上车(数据包被丢弃)。

比较:PFIFO 与 BFIFO

虽然 PFIFO 和 BFIFO 都是 FIFO(First-In, First-Out)策略并遵循基本队列逻辑,但存在一些差异:

  • 队列大小: PFIFO 按数据包数量考虑队列大小,而 BFIFO 以字节计算队列大小。这意味着 BFIFO 会考虑每个数据包的大小,从而可以更准确地控制带宽使用。
  • 丢包: 在 PFIFO 中,当队列中的数据包数量已满时丢弃数据包。在 BFIFO 中,当队列的字节大小超出时丢弃数据包,即使这意味着丢弃一个大于队列剩余空间的数据包。
  • 公平性: PFIFO 和 BFIFO 在数据包传输顺序方面都是公平的——先进先出。然而,在数据包大小不同的情况下,PFIFO 可能导致这样一种情况:一个大包占用大量资源,却与小包受到同样的对待。另一方面,BFIFO 基于字节的方法可以提供更均衡的资源使用。
  • 复杂性: 与那些对某些类型流量划分优先级的更复杂排队策略相比,这两种策略都很简单。不过,BFIFO 比 PFIFO 略微复杂一些,因为它需要跟踪队列中所有数据包的总大小。

总体而言,PFIFO 和 BFIFO 之间的选择取决于你网络的具体需求以及流量的特征。