8. 约定和一些常见场景

8.1. 一般性的提示

这里列出了一些例子,方便入门的读者更快地了解 Linux 流量控制系统。

无论用户使用 tcng 还是 tc 配置流量控制系统,流量控制的结构都是相同的。

  • 实行流量整形的路由应该是整条链路上的瓶颈。一般情况下路由器都应该把整形流量限制为比线路带宽稍低一些,这样可以避免过量的数据包阻塞路由器,让路由器能够有效地工作。

  • 理论上来说,流量控制系统只能对上行流量进行整形。 [10]. 因为下行流量是从网络上发送过来的,我们无法直接控制接收到的数据流量。虽然可以使用在 ingress 上使用决策器来控制入站流量,但本机和上级路由间的线路上的流量并不会因此减少。

  • 每个网络接口都有必须有一个 qdisc。如果用户没有为网络接口指定 qdisc,系统就会默认使用 pfifo_fast 作为网络接口的默认排队规则。

  • 如果向网络接口上关联了一个 classful qdiscs,而又没有向这个排队规则上添加任何子分类,那只会白白浪费处理器时间。

  • 新创建的分类默认包含一个 FIFO 排队规则。如果用户为分类指定了一个新的排队规则,那么用户指定的排队规则就会取代 FIFO。如果用户为分类指定了子类,那么 FIFO 就会自动被删除。

  • 可以直接往 root qdisc 上关联分类来模拟一条虚电路。

  • filter 可以与分类器或 classful qdiscs 相关联。

8.2. 在已知带宽的线路上实施流量控制

如果线路的带宽是已知的,那么使用 HTB 是个不错的决定。因为用户可以把根节点的整形流量设置为线路的最大带宽。整个线路的流量可以一级一级细分到子分类去,用户可以灵活地指定各种不同的应用和流量可用的带宽。

8.3. 在带宽可变(或未知)的线路上实施流量控制

理论上来说,PRIO 是最适合用在带宽未知或带宽可变的线路上的,因为 PRIO 是一种工作保存(work-conserving)的排队规则,也就是说 PRIO 是不会对流量进行整形的。在这样一种带宽不稳定的线路上,PRIO 可以优先发送高优先级的数据包,然后再发送低优先级的数据包。

8.4. 基于数据流的流量控制

由于网络上存在多种多样的连接,使用 SFQ 能简单而有效地管理这些连接。SFQ 会将网络流量分为多个不同的数据流,然后随机并公平地发送这些数据流。如果网络上都是行为良好的用户和程序,那么使用 SFQ 会让用户觉得网络的状态和稳定性是很不错的。

的弱点在于当它面对非常规的网络应用时,其随机公平服务算法就会显得十分无力。有一些客户端(如 迅雷,eMule,eDonkey,Kazaa 等)会创建大量的网络会话,这些网络会话会占领所有的数据流,于是随机公平服务算法对这些客户端来说就成了优先服务算法,其它的应用将得不到公平的服务。SFQ 没办法对这种应用进行惩罚,所以在这种情况下,我们需要使用其它的排队规则。

8.5. 基于IP地址的流量控制

对于许多网络管理员来说,这是控制用户对网络的使用的最好办法。但遗憾的是,tc 没有提供简单的方法来对一大堆IP地址分别设置不同的流量控制参数,用户数越多,流量控制结构也就越复杂。

如果要控制 N 个 IP 地址的流量,就需要至少 N 个分类。



[10] 使用 中间队列设备(Intermediate Queuing Device,IMQ) 可以模拟出一个虚拟的向外发包的网络接口,并且可以对其实施流量控制。中间队列设备对内核来说就像是一个普通的网络接口,利用这一点,我们可以把入站流量转入中间队列设备,使入站流量成为中间队列设备的上行流量,这样就可以在中间队列设备上像控制出站流量一样对实际入站流量进行整形。