2. 概念概述

本节将 介绍流量控制探讨其原因,识别一些 优点缺点,并介绍流量控制中使用的关键概念。

2.1. 它是什么?

流量控制是指在路由器上接收和发送数据包的排队系统和机制的集合名称。这包括决定在接口输入端以何种速率(以及是否)接受哪些数据包,以及确定在接口输出端以何种速率按何种顺序发送哪些数据包。

在绝大多数情况下,流量控制由一个单独的队列组成,该队列收集进入的数据包,并在硬件(或底层设备)可以接受它们时尽快将其出队。这种队列是 FIFO 队列。

NoteLinux 下的默认 qdisc 是 pfifo_fast,它比 FIFO 稍复杂一些。

在各种软件中都有队列的例子。队列是组织待处理任务或数据的一种方式(另请参见 第 2.5 节)。由于网络链路通常以串行方式传输数据,因此需要队列来管理出站数据包。

在桌面机器和高效 Web 服务器共享同一条 Internet 上行链路的情况下,可能会发生以下带宽争用。Web 服务器可能能够比数据通过链路传输的速度更快地填满路由器上的输出队列,此时路由器开始丢弃数据包(其缓冲区已满!)。现在,桌面机器(具有交互式应用程序用户)可能面临数据包丢失和高延迟。请注意,高延迟有时会导致用户抱怨!通过分离用于服务这两种不同类型的应用程序的内部队列,可以在这两个应用程序之间更好地共享网络资源。

流量控制是一组工具,允许用户对网络设备的这些队列和排队机制进行精细控制。使用这些工具重新排列流量和数据包的功能非常强大,并且可能很复杂,但不能替代足够的带宽。

服务质量 (QoS) 术语通常用作流量控制的同义词。

2.2. 为什么使用它?

分组交换网络与电路交换网络在一个非常重要的方面有所不同。分组交换网络本身是无状态的。电路交换网络(如电话网络)必须在网络内保持状态。IP 网络在设计上是无状态和分组交换网络;事实上,这种无状态性是 IP 的基本优势之一。

这种无状态性的缺点是缺乏对不同类型流量的区分。简而言之,流量控制允许管理员根据数据包的属性以不同的方式对数据包进行排队。它甚至可以用来模拟电路交换网络的行为。这会将有状态性引入到无状态网络中。

有许多实际原因需要考虑流量控制,并且在许多情况下使用流量控制是有意义的。以下是一些常见问题的示例,这些问题可以通过这些工具解决或至少得到改善。

下面的列表并非流量控制用户可用的所有类型解决方案的详尽列表,而是介绍了可以通过使用流量控制来最大化网络连接可用性而解决的问题类型。

常见的流量控制解决方案

还要记住,有时,购买更多带宽会更好。流量控制不能解决所有问题!

2.3. 优点

当正确使用时,流量控制应导致网络资源的更可预测的使用,并减少对这些资源的波动性争用。然后,网络达到流量控制配置的目标。即使在同时服务更高优先级的交互式流量时,也可以为批量下载流量分配合理的带宽量。即使是低优先级的数据传输(如邮件)也可以分配带宽,而不会对其他类型的流量产生巨大影响。

从更宏观的角度来看,如果流量控制配置代表已传达给用户的策略,则用户(以及应用程序)知道对网络的期望。

2.4. 缺点

复杂性很容易成为使用流量控制的最重要缺点之一。有一些方法可以熟悉流量控制工具,从而减轻关于流量控制及其机制的学习曲线,但识别流量控制配置错误可能是一个相当大的挑战。

当适当使用时,流量控制可以导致更公平地分配网络资源。它也可能以不适当的方式安装,导致对资源的进一步和更具分裂性的争用。

路由器上支持流量控制场景所需的计算资源需要能够处理维护流量控制结构所增加的成本。幸运的是,这是一个小的增量成本,但随着配置规模和复杂性的增长,可能会变得更加重要。

对于个人使用,使用流量控制没有相关的培训成本,但公司可能会发现,购买更多带宽比使用流量控制更简单。培训员工和确保知识深度可能比投资更多带宽更昂贵。

虽然分组交换网络上的流量控制涵盖了更大的概念领域,但您可以将流量控制视为为分组交换网络提供 [部分] 电路交换网络状态性的一种方式。

2.5. 队列

队列构成了所有流量控制的背景,并且是调度背后的核心概念。队列是包含有限数量项目的位置(或缓冲区),这些项目等待操作或服务。在网络中,队列是数据包(我们的单位)等待硬件(服务)传输的位置。在最简单的模型中,数据包以先进先出的方式传输 [1]。在计算机网络学科(更普遍地说是计算机科学)中,这种队列被称为 FIFO。

在没有任何其他机制的情况下,队列对于流量控制没有任何承诺。队列中只有两个有趣的动作。任何进入队列的东西都被排入队列。从队列中删除项目就是将该项目出队。

当与可以延迟数据包、重新排列、丢弃和优先处理多个队列中的数据包的其他机制结合使用时,队列变得更加有趣。队列还可以使用子队列,这允许在调度操作中实现行为的复杂性。

从更高层软件的角度来看,数据包只是被排队等待传输,而排队的数据包的传输方式和顺序对于更高层来说是无关紧要的。因此,对于更高层来说,整个流量控制系统可能看起来像一个单独的队列 [2]。只有通过检查这一层的内部结构,流量控制结构才会暴露出来并可用。

2.6. 流

流是两个主机之间不同的连接或会话。两个主机之间任何唯一的数据包集都可以被视为一个流。在 TCP 下,具有源 IP 和端口以及目标 IP 和端口的连接概念代表一个流。UDP 流也可以类似地定义。

流量控制机制经常将流量分离为流量类别,这些类别可以聚合并作为聚合流量传输(考虑 DiffServ)。替代机制可能会尝试根据各个流量平均分配带宽。

当尝试在一组竞争流之间平均分配带宽时,流量变得重要,尤其是在某些应用程序故意构建大量流量时。

2.7. 令牌和桶

整形 机制的两个关键基础是令牌和桶的相互关联的概念。

为了控制出队速率,一种实现方式可以计算每个项目出队时出队的数据包或字节数,但这需要复杂地使用计时器和测量来精确限制。一种广泛用于流量控制的方法,不是计算当前使用情况和时间,而是以期望的速率生成令牌,并且仅在令牌可用时才将数据包或字节出队。

考虑一个游乐园游乐设施的类比,人们排队等待体验游乐设施。让我们想象一个轨道,小车在固定的轨道上行驶。小车以固定的速率到达队列的头部。为了享受游乐设施,每个人都必须等待可用的小车。小车类似于令牌,人类似于数据包。同样,这种机制是一种速率限制或 整形 机制。在特定时期内,只有一定数量的人可以体验游乐设施。

为了扩展类比,想象一下游乐园游乐设施的空队列和大量停在轨道上准备载人的小车。如果很多人一起进入队列,那么很多人(可能所有人)都可以体验游乐设施,因为有可用的小车在等待。可用小车的数量是一个类似于桶的概念。桶包含许多令牌,并且可以使用桶中的所有令牌,而无需考虑时间的流逝。

为了完成类比,游乐园游乐设施上的小车(我们的令牌)以固定的速率到达,并且仅保持可用,直到桶的大小。因此,桶根据速率填充令牌,如果令牌未使用,则桶可以填满。如果使用令牌,则桶不会填满。桶是支持突发流量(如 HTTP)的关键概念。

TBF qdisc 是整形器的经典示例(关于 TBF 的部分包含一个图表,可以帮助可视化令牌和桶的概念)。TBF 生成速率令牌,并且仅在令牌可用时才传输数据包。令牌是一个通用的整形概念。

如果队列不需要立即使用令牌,则可以收集令牌直到需要它们。无限期地收集令牌会否定整形的任何好处,因此令牌会被收集,直到达到一定数量的令牌。现在,队列有可用于大量需要出队的数据包或字节的令牌。这些无形的令牌存储在一个无形的桶中,并且可以存储的令牌数量取决于桶的大小。

这也意味着装满令牌的桶可能在任何时刻都可用。非常可预测的常规流量可以通过小桶处理。对于突发性更强的流量,可能需要更大的桶,除非期望的目标之一是减少 流量 的突发性。

总之,令牌以速率生成,最多可以收集一个桶的令牌。这允许处理突发流量,同时平滑和整形传输的流量。

令牌和桶的概念密切相关,并在 TBF无类别 qdisc 之一)和 HTB有类别 qdisc 之一)中都使用。在 tcng 语言中,两色和三色计量器的使用无疑是令牌和桶的概念。

2.8. 数据包和帧

跨网络发送的数据术语根据用户检查的层而变化。本文将相当粗略(且不正确地)地忽略数据包和帧之间的技术区别,尽管此处已概述了它们。

帧这个词通常用于描述要转发到下一个接收者的第 2 层(数据链路)数据单元。以太网接口、PPP 接口和 T1 接口都将其第 2 层数据单元命名为帧。帧实际上是执行流量控制的单元。

另一方面,数据包是一个更高层的概念,代表第 3 层(网络)单元。本文档首选术语数据包,尽管它略有不准确之处。

注释

[1]

这种排队模型长期以来一直被文明国家用于公平地分配稀缺的食物或物资。据传,威廉·福克纳曾走到队伍的最前面去取他的那份冰,这证明并非所有人都喜欢 FIFO 模型,并为我们考虑优先级排队提供了一个模型。

[2]

同样,对于将数据包排入此层的更高层来说,整个流量控制系统看起来像一个队列或调度器。