这是一篇关于在 Linux 机器上使用 tcng (下一代流量控制) 和 HTB (分层令牌桶) 进行流量整形的简要教程。
本教程面向具备以下条件的系统管理员:
至少,对流量控制有基本的了解
或者能够从源代码编译 iproute2 和 tcng
或者能够从提供的 SRPM 构建 RPM
或者一个支持 htb 和 dsmark 的模块化内核
或者能够编译一个支持 htb 和 dsmark 的内核
![]() | 本文既不全面也不权威。作者征求积极和消极的反馈意见,请发送至<martin@linux-ip.net>。欢迎提出更正、补充和更多示例。 |
流量控制是指网络或网络设备中整个数据包排队子系统的术语。流量控制包括几个不同的操作。分类 (Classifying) 是一种识别数据包并将它们放入单独的流或类别的机制。监管 (Policing) 是一种限制流中与特定分类匹配的数据包或字节数量的机制。调度 (Scheduling) 是一个决策过程,通过该过程对数据包进行排序和重新排序以进行传输。整形 (Shaping) 是指延迟和传输数据包以产生均匀且可预测的流速的过程。
流量控制系统的这些许多特性可以以复杂的方式组合起来,为特定流(或应用程序)保留带宽,或限制特定流或应用程序可用的带宽量。
流量控制的关键概念之一是令牌 (tokens) 的概念。监管 (policing) 或整形 (shaping) 的实现需要计算以什么速率通过了多少字节或数据包。每个数据包或字节(取决于实现)都对应一个令牌,并且监管或整形的实现只有在有可用令牌时才会传输或传递数据包。实现保存令牌的常见隐喻容器是桶 (bucket)。简而言之,桶代表可以立即使用的令牌数量(桶的大小)以及令牌补充的速率(桶被重新填充的速度)。
有关 linux 流量控制系统中桶的示例,请参阅第 1.2 节。
在 linux 下,流量控制历来是一项复杂的工作。tc 命令行工具提供了内核结构的接口,内核结构执行整形、调度、监管和分类。但是,此命令的语法很晦涩。tcng 项目通过在强大的 tc 命令行工具之上分层一种语言,为人类提供了更友好的界面。通过用 tcng 编写流量控制配置,它们变得易于维护、不那么晦涩,并且更重要的是也更具可移植性。
分层令牌桶 (Hierarchichal Token Bucket) 是 Martin Devera 编写的一种有类别的 qdisc,其配置参数比 CBQ 更简单。在作者的网站以及 Stef Coene 的网站上,有很多关于 HTB 及其用途的文档。下面是对 HTB 系统的一个非常简要的概述。
从概念上讲,HTB 是任意数量的令牌桶以层次结构排列(是的,你可能不用我说也能弄明白)。让我们考虑最简单的场景。任何设备上的主要出口排队规则都称为根 (root)qdisc。
根 (root)qdisc 将包含一个类(复杂场景可能在根 (root)qdisc 上附加多个类)。这个单一的 HTB 类将设置两个参数,一个速率 (rate)和一个上限 (ceil)。这些值对于顶层类应该相同,并且将表示链路上的总可用带宽。
在 HTB 中,速率 (rate)表示给定类可用的保证带宽,而上限 (ceil)是 ceiling 的缩写,表示该类允许消耗的最大带宽。之间使用的任何带宽速率 (rate)和上限 (ceil)是从父类借用的,因此建议速率 (rate)和上限 (ceil)在顶层类中相同。
可以在此类下创建多个子类,每个子类都可以从父类分配一些可用带宽。在这些子类中,速率 (rate)和上限 (ceil)参数值不必与父类建议的相同。这允许你为特定类保留指定数量的带宽。它还允许 HTB 计算可用带宽的分配比率与类本身的比率。这在下面的示例中应该更明显。
分层令牌桶 (Hierarchical Token Bucket) 为 linux 流量控制系统实现了一种有类别的排队机制,并提供速率 (rate)和上限 (ceil)以允许用户控制到特定类别的流量的绝对带宽,以及指示在额外带宽可用时带宽的分配比率(高达上限 (ceil)).
在为顶层类选择带宽时,请记住,只有当你成为 LAN 和 Internet 之间的瓶颈时,流量整形才会有所帮助。通常,家庭和办公室网络环境就是这种情况,在这些环境中,整个 LAN 由 DSL 或 T1 连接提供服务。
在实践中,这意味着你可能应该将顶层类的带宽设置为可用带宽减去一小部分带宽。
下一代流量控制 (Traffic Control Next Generation) (tcng) 是 Werner Almesberger 的一个项目,旨在提供一种强大、抽象且统一的语言来描述流量控制结构。tcng 发行版中的 tcc 解析器将 tcng 语言转换为多种输出格式。默认情况下,tcc 将读取文件(指定为参数或 STDIN)并将创建内核中所需流量控制结构所需的一系列 tc 命令(见下面的 iproute2)打印到 STDOUT。
请参阅 tcng 的参数参考,以查看支持的排队规则。Jacob Teplitsky 活跃于 LARTC 邮件列表,并且是 tcng 项目的贡献者,他为 tcng 编写了 htb 支持。
tcc 工具可以生成多种不同类型的输出,但本文档仅考虑常规和默认输出。有关 tcng 使用的更多详细信息,请参阅 TCNG 手册。
tcsim 工具是一个流量控制模拟器,它接受 tcng 配置文件并读取控制语言,以模拟内核发送和接收具有指定控制结构的数据包的行为。尽管 tcsim 是 tcng 项目的重要组成部分,但本文档完全不会介绍 tcsim。