5. 软件和工具

5.1. 内核要求

许多发行版提供的内核都以模块化或单内核方式支持流量控制(服务质量)。自定义内核可能尚未提供对所需功能的支持(模块化与否)。如果没有,这是一个非常简短的所需内核选项列表。

建议几乎或没有内核编译经验的用户参考 Kernel HOWTO。经验丰富的内核编译人员在阅读更多关于流量控制和规划的内容后,应该能够确定以下哪些选项适用于所需的配置。

示例 1. 内核编译选项 [1]

#
# QoS and/or fair queueing
#
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_CSZ=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_QOS=y
CONFIG_NET_ESTIMATOR=y
CONFIG_NET_CLS=y
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_POLICE=y
      

使用上述选项集编译的内核将为本文档中讨论的几乎所有内容提供模块化支持。用户可能需要在使用给定功能之前执行 modprobe module。再次强调,对于感到困惑的用户,建议参考 Kernel HOWTO,因为本文档无法充分解答有关 Linux 内核使用的问题。

5.2. iproute2 工具 (tc)

iproute2 是一套命令行实用程序,用于操作机器上 IP 网络配置的内核结构。有关这些工具的技术文档,请参阅 iproute2 documentation,更详细的讨论请参阅 linux-ip.net 上的文档。iproute2 包中的工具中,二进制文件 tc 是唯一用于流量控制的工具。本 HOWTO 将忽略该套件中的其他工具。

由于它与内核交互以指导流量控制结构的创建、删除和修改,因此 tc 二进制文件需要编译时支持您希望使用的所有 qdisc。特别地,上游 iproute2 包尚不支持 HTB qdisc。有关更多信息,请参阅 第 7.1 节

tc 工具执行支持流量控制所需的内核结构的所有配置。由于其用途广泛,因此命令语法(充其量)可以被描述为神秘难懂。该实用程序将其第一个非选项参数作为三个 Linux 流量控制组件之一:qdiscclassfilter

示例 2. tc 命令用法

[root@leander]# tc
Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }
where  OBJECT := { qdisc | class | filter }
       OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] }
      

每个对象都接受更多和不同的选项,并且将在下面进行不完整的描述和记录。以下示例中的提示旨在介绍 tc 命令行语法的复杂性。有关更多示例,请参阅 LARTC HOWTO。为了更好地理解,请查阅内核和 iproute2 代码。

示例 3. tc qdisc

[root@leander]# tc qdisc add    \ (1)
>                  dev eth0     \ (2)
>                  root         \ (3)
>                  handle 1:0   \ (4)
>                  htb            (5)
      
(1)
添加队列规则。动词也可能是del.
(2)
指定我们要将新队列规则附加到的设备。
(3)
这对 tc 意味着 "egress"。单词root必须使用。另一个功能有限的 qdisc,即ingressqdisc 也可以附加到同一设备。
(4)
handle 是用户指定的数字,形式为major:minor。任何队列规则句柄的 minor 号必须始终为零 (0)。qdisc 句柄的可接受简写形式是语法 "1:",其中如果未指定 minor 号,则假定为零 (0)。
(5)
这是要附加的队列规则,本示例中为 HTB。队列规则特定的参数将紧随其后。在此示例中,我们没有添加任何 qdisc 特定的参数。

以上是将队列规则添加到设备的最简单 tc 实用程序用法。这是一个使用 tc 将类添加到现有父类的示例。

示例 4. tc class

[root@leander]# tc class add    \ (1)
>                  dev eth0     \ (2)
>                  parent 1:1   \ (3)
>                  classid 1:6  \ (4)
>                  htb          \ (5)
>                  rate 256kbit \ (6)
>                  ceil 512kbit   (7)
      
(1)
添加一个类。动词也可能是del.
(2)
指定我们要将新类附加到的设备。
(3)
指定我们要将新类附加到的父 handle
(4)
这是一个唯一的 handle (major:minor) 标识此类。minor 号必须是任何非零 (0) 数字。
(5)
两个 分类 qdisc 都要求任何子类都必须与父类类型相同。因此,HTB qdisc 将包含 HTB 类。
(6)(7)
这是一个类特定的参数。有关这些参数的更多详细信息,请参阅 第 7.1 节

示例 5. tc filter

[root@leander]# tc filter add               \ (1)
>                  dev eth0                 \ (2)
>                  parent 1:0               \ (3)
>                  protocol ip              \ (4)
>                  prio 5                   \ (5)
>                  u32                      \ (6)
>                  match ip port 22 0xffff  \ (7)
>                  match ip tos 0x10 0xff   \ (8)
>                  flowid 1:6               \ (9)
>                  police                   \ (10)
>                  rate 32000bps            \ (11)
>                  burst 10240              \ (12)
>                  mpu 0                    \ (13)
>                  action drop/continue       (14)
      
(1)
添加一个过滤器。动词也可能是del.
(2)
指定我们要将新过滤器附加到的设备。
(3)
指定我们要将新过滤器附加到的父句柄。
(4)
此参数是必需的。它的用途应该是显而易见的,尽管我了解不多。
(5)
Theprio参数允许将给定过滤器优先于另一个过滤器。Thepref是一个同义词。
(6)
这是一个 classifier,并且是每个 tc filter 命令中的必需短语。
(7)(8)
这些是分类器的参数。在这种情况下,具有服务类型标志(指示交互式使用)且匹配端口 22 的数据包将由此语句选择。
(9)
Theflowid指定匹配的过滤器应将其选定的数据包发送到的目标类(或 qdisc)的 handle
(10)
这是 policer,并且是每个 tc filter 命令中的可选短语。
(11)
policer 将在此速率之上执行一个操作,并在速率之下执行另一个操作(请参阅 action 参数)。
(12)
TheburstburstHTB 中(burst是一个 buckets 概念)。
(13)
最小策略单元。要计算所有流量,请使用mpu为零 (0) 的 mpu。
(14)
Theaction指示如果rate基于 policer 的属性。第一个词指定如果超出 policer 时要采取的措施。第二个词指定否则要采取的措施。

如上所示,即使对于这些示例所示的简单操作,tc 命令行实用程序也具有神秘而复杂的语法。读者应该不会感到惊讶,因为存在一种更简单的方式来配置 Linux 流量控制。请参阅下一节,第 5.3 节

5.3. tcng,下一代流量控制

FIXME;赞扬 tcng。另请参阅 Traffic Control using tcng and HTB HOWTOtcng documentation

下一代流量控制(以下简称 tcng)提供了 Linux 下流量控制的所有功能,但只有百分之二十的麻烦。

5.4. IMQ,中间队列设备

FIXME;必须讨论 IMQ。另请参阅 Patrick McHardy 关于 IMQ 的网站。

注释

[1]

此示例中列出的选项取自 2.4.20 内核源代码树。确切的选项可能因内核版本而略有不同,具体取决于补丁和新的调度程序和分类器。