在前面几节中,我们已经分析了面临分组丢失时用于提供可靠数据传输服务的基本原理及特定的 TCP 机制。我们以前讲过,在实践中,这种丢包一般是当网络变得拥塞时由于路由器缓存溢岀引起的。

分组重传因此作为网络拥塞的征兆(某个特定的运输层报文段的丢失)来对待,但是却无法处理导致网络拥塞的原因,因为有太多的源想以过高的速率发送数据。为了处理网络拥塞原因,需要一些机制以在面临网络拥塞时遏制发送方。

在本节中,我们考虑一般情况下的拥塞控制问题,试图理解为什么网络拥塞是一件坏事情,网络拥塞是如何在上层应用得到的服务性能中明确地显露出来的?如何可用各种方法来避免网络拥塞或对它做出反应?

这种对拥塞控制的更一般研究是恰当的,因为就像可靠数据传输一样,它在组网技术中的前 10 个基础性重要问题清单中位居前列。下面就来看一下拥塞出现的情况以及原因。

拥塞原因及代价

我们通过分析 3 个复杂性越来越高的发生拥塞的情况,开始对拥塞控制的一般性研究。在每种情况下,我们首先将看看出现拥塞的原因以及拥塞的代价(根据资源未被充分利用以及端系统得到的低劣服务性能来评价)。我们暂不关注如何对拥塞做出反应或避免拥塞,而是重点理解一个较为简单的问题,即随着主机增加其发送速率并使网络变得拥这时会发生的情况。

情况1:两个发送方和一台具有无穷大缓存的路由器

我们先考虑也许是最简单的拥塞情况:两台主机(A和B)都有一条连接,且这两条连接共享源与目的地之间的单跳路由,如下图所示。

♦ 拥塞控制原理 - 图1

我们假设主机 A 中的应用程序以入 ♦ 拥塞控制原理 - 图2 字节/秒的平均速率将数据发送到连接中(例如,通过一个套接字将数据传递给运输层协议)。这些数据是初始数据,这意味着每个数据单元仅向套接字中发送一次。下面的运输层协议是一个简单的协议。数据被封装并发送;不执行差错恢复(如重传)、流量控制或拥塞控制。忽略由于添加运输层和较低层首部信息产生的额外开销,在第一种情况下,主机 A 向路由器提供流量的速率是入♦ 拥塞控制原理 - 图3 字节/秒。

主机 B 也以同样的方式运行,为了简化问题,我们假设它也是以速率入 ♦ 拥塞控制原理 - 图4 字节/秒发送数据。来自主机 A 和主机 B 的分组通过一台路由器,在一段容量为 R 的共享式输出链路上传输。该路由器带有缓存,可用于当分组到达速率超过该输出链路的容量时存储 “入分组”。在此第一种情况下,我们将假设路由器有无限大的缓存空间。

上图中的函数图描述了第一种情况下主机 A 的连接性能。左边的图形描述了每连接的吞吐量(per-connection throughout)(接收方每秒接收的字节数)与该连接发送速率之间的函数关系。当发送速率在 0-R/2 之间时,接收方的吞吐量等于发送方的发送速率,即发送方发送的所有数据经有限时延后到达接收方。然而当发送速率超过 R/2 时,它的吞吐量只能达到 R/2。这个吞吐量上限是由两条连接之间共享链路容量造成的。链路完全不能以超过 R/2 的稳定状态速率向接收方交付分组。无论主机 A 和主机 B 将其发送速率设置为多高,它们都不会看到超过 R/2 的吞吐量。

取得每连接 R/2 的吞吐量实际上看起来可能是件好事,因为在将分组交付到目的地的过程中链路被充分利用了。但是,上图右边的图形却显示了以接近链路容量的速率运行时产生的后果。当发送速率接近 R/2 时(从左至右),平均时延就会越来越大。当发送速率超过 R/2 时,路由器中的平均排队分组数就会无限增长,源与目的地之间的平均时延也会变成无穷大。

因此,虽然从吞吐量角度看,运行在总吞吐量接近 R 的状态也许是一个理想状态,但从时延角度看,却远不是一个理想状态。甚至在这种(极端)理想化的情况中,我们已经发现了拥塞网络的一种代价,即当分组的到达速率接近链路容量时,分组经历巨大的排队时延。

情况2:两个发送方和一台具有有限缓存的路由器

现在我们从下列两个方面对情况1稍微做一些修改。首先,假定路由器缓存的容量是有限的。这种现实世界的假设的结果是,当分组到达一个已满的缓存时会
被丢弃。

其次,我们假定每条连接都是可靠的。如果一个包含有运输层报文段的分组在路由器中被丢弃,那么它终将被发送方重传。由于分组可以被重传,所以我们现在必须更小心地使用发送速率这个术语。特別是我们再次以 ♦ 拥塞控制原理 - 图5 字节/秒表示应用程序将初始数据发送到套接字中的速率。运输层向网络中发送报文段(含有初始数据或重传数据)的速率用 ♦ 拥塞控制原理 - 图6 字节/秒表示。 ♦ 拥塞控制原理 - 图7 有时被称为网络的供给载荷(offeredload)。

♦ 拥塞控制原理 - 图8

♦ 拥塞控制原理 - 图9 理想化情况:主机 A 得知路由器缓存情况

在情况 2 下实现的性能强烈地依赖于重传的方式。首先,考虑一种不真实的情况,即主机 A 能够以某种方式(不可思议地!)确定路由器中的缓存是否空闲,因而仅当缓存空闲时才发送一个分组。

♦ 拥塞控制原理 - 图10

在这种情况下,将不会产生丢包,♦ 拥塞控制原理 - 图11♦ 拥塞控制原理 - 图12 相等,并且连接的吞吐量就等于 ♦ 拥塞控制原理 - 图13。上图描述了这种情况。从吞吐量的角度看,性能是理想的,即发送的每个分组都被接收到。注意到在这种情况下,平均主机发送速率不能超过 R/2,因为假定不会发生分组丢失。

♦ 拥塞控制原理 - 图14 发送方在确定了一个分组丢失时重传(重传一个分组)

接下来考虑一种更为真实的情况,发送方仅当在确定了一个分组已经丢失时才重传。(同样,所做的假设有一些弹性。然而,发送主机有可能将超时时间设置得足够长,以无形中使其确信一个还没有被确认的分组已经丢失。)

  • 路由器没有缓存空间的情况,要丢弃分组

♦ 拥塞控制原理 - 图15

  • 路由器有缓存空间的情况

♦ 拥塞控制原理 - 图16

在这种情况下,性能就可能与上图所示的情况相似。

♦ 拥塞控制原理 - 图17 发送方也许会提前发生超时并重传在队列中已被推迟但还未丢失的分组(可能会是多个分组)

最后,我们考虑下面一种情况:发送方也许会提前发生超时并重传在队列中已被推迟但还未丢失的分组。在这种情况下,初始数据分组和重传分组都可能到达接收方。当然,,接收方只需要一份这样的分组副本就行了,重传分组将被丢弃。

在这种情况下,路由器转发重传的初始分组副本是在做无用功,因为接收方已收到了该分组的初始版本。而路由器本可以利用链路的传输能力去发送另一个分组。这里,我们又看到了网络拥塞的另一种代价,即发送方在遇到大时延时所进行的不必要重传会引起路由器利用其链路带宽来转发不必要的分组副本

下图显示了当假定每个分组被路由器转发(平均)两次时,吞吐量与供给载荷的对比情况。

♦ 拥塞控制原理 - 图18

情况3: 4个发送方和具有有限缓存的多台路由器及多跳路径

在最后一种拥塞情况中,有 4 台主机发送分组,每台都通过交叠的两跳路径传输,如下图所示。我们再次假设每台主机都采用超时/重传机制来实现可靠数据传输服务,所有的主机都有相同的 ♦ 拥塞控制原理 - 图19 值,所有路由器的链路容量都是 R 字节/秒。

♦ 拥塞控制原理 - 图20

我们考虑从主机 A 到主机 C 的连接,该连接经过路由器 R1 和R2。A-C 连接与 D-B 连接共享路由器 R1,并与 B-D 连接共享路由器 R2。对极小的 ♦ 拥塞控制原理 - 图21 (< R/2 的情况)值,路由器缓存的溢出是很少见的(与拥塞情况 1、拥塞情况 2 中的一样),吞吐量大致接近供给载荷。对稍大的 ♦ 拥塞控制原理 - 图22 值,对应的吞吐量也更大,因为有更多的初始数据被发送到网络中并交付到目的地,溢出仍然很少。因此,对于较小的 ♦ 拥塞控制原理 - 图23♦ 拥塞控制原理 - 图24 的增大会导致 ♦ 拥塞控制原理 - 图25 的增大。

在考虑了流量很小的情况后,下面分析当入 ♦ 拥塞控制原理 - 图26 (因此 ♦ 拥塞控制原理 - 图27)很大时的情况。考虑路由器 R2。不管 ♦ 拥塞控制原理 - 图28 的值是多大,到达路由器 R2 的 A-C 流量(在经过路由器 R1 转发后到达路由器 R2)的到达速率至多是 R,也就是从 R1 到 R2 的链路容量。如果 ♦ 拥塞控制原理 - 图29 对于所有连接(包括 B-D 连接)来说是极大的值,那么在 R2 上,B-D 流量的到达速率可能会比 A-C 流量的到达速率大得多。因为 A-C 流量与 B-D 流量在路由器 R2 上必须为有限缓存空间而竞争,所以当来自 B-D 连接的供给载荷越来越大时,A-C 连接上成功通过 R2 (即由于缓存溢出而未被丢失)的流量会越来越小。在极限情况下,当供给载荷趋近于无穷大时,R2 的空闲缓存会立即被 B-D连接的分组占满,因而 A-C 连接在 R2 上的吞吐量趋近于 0。这又一次说明在重载的极限情况下,A-C 端到端呑吐量将趋近于 0。这些考虑引发了供给载荷与吞吐量之间的权衡,如下图所示。

♦ 拥塞控制原理 - 图30

当考虑由网络所做的浪费掉的工作量时,随着供给载荷的增加而使吞吐量最终减少的原因是明显的。在上面提到的大流量的情况中,每当有一个分组在第二跳路由器上被丢弃时,第一跳路由器所做的将分组转发到第二跳路由器的工作就是 “劳而无功” 的。如果第一跳路由器只是丢弃该分组并保持空闲,则网络中的情况是幸运的(更准确地说是糟糕的)。需要指岀的是,第一跳路由器所使用的将分组转发到第二跳路由器的传输容量用来传送不同的分组可能更有效益。(例如,当选择一个分组发送时,路由器最好优先考虑那些已经历过一定数量的上游路由器的分组。)

所以,我们在此又看到了由于拥塞而丢弃分组的另一种代价,即当一个分组沿一条路径被丢弃时,每个上游路由器用于转发该分组到丢弃该分组而使用的传输容量最终被浪费掉了(半途而废的代价)

拥塞控制方法

这里,我们指出在实践中所采用的两种主要拥塞控制方法,讨论特定的网络体系结构和具体使用这些方法的拥塞控制协议。

在最为宽泛的级别上,我们可根据网络层是否为运输层拥塞控制提供了显式帮助,来区分拥塞控制方法。

端到端拥塞控制

在端到端拥塞控制方法中,网络层没有为运输层拥塞控制提供显式支持。即使网络中存在拥塞,端系统也必须通过对网络行为的观察(如分组丢失与时延)来推断之。

下面会看到 TCP 采用端到端的方法解决拥塞控制,因为 IP 层不会向端系统提供有关网络拥塞的反馈信息。TCP 报文段的丢失(通过超时或 3 次冗余确认而得知)被认为是网络拥塞的一个迹象,TCP 会相应地减小其窗口长度

网络辅助的拥塞控制

在网络辅助的拥塞控制中,路由器向发送方提供关于网络中拥塞状态的显式反馈信息。这种反馈可以简单地用一个比特来指示链路中的拥塞情况。例如,在 ATM 可用比特率(Available Bite Rate, ABR)拥塞控制中,路由器显式地通知发送方它(路由器)能在输出链路上支持的最大主机发送速率。

如上面所提到的,默认因特网版本的 IP 和 TCP 采用端到端拥塞控制方法。最近的 IP 和 TCP 也能够选择性地实现网络辅助拥塞控制。

对于网络辅助的拥塞控制,拥塞信息从网络反馈到发送方通常有两种方式,如下图所示

♦ 拥塞控制原理 - 图31

  • 直接反馈信息可以由网络路由器发给发送方。这种方式的通知通常采用了一种阻塞分组(choke packet) 的形式(主要是说:“我拥塞了!”)。
  • 更为通用的第二种形式的通知是,路由器标记或更新从发送方流向接收方的分组中的某个字段来指示拥塞的产生口 一旦收到一个标记的分组后,接收方就会向发送方通知该网络拥塞指示。注意到后一种形式的通知至少要经过一个完整的往返时间。