引言
在计算机网络中,网络层的主要任务是将数据包从源主机路由到目的主机。然而,当子网中存在的全部数据包数量过多时,网络的性能就会下降。这种情况称为拥塞(Congestion)。
虽然现代互联网的拥塞控制主要由传输层(如 TCP 协议)主导,但网络层(路由器与 IP 协议)作为数据传输的"基础设施",在检测拥塞、流量整形以及主动队列管理方面发挥着不可替代的作用。本章将深入探讨网络层拥塞控制的成因、基本原理、经典算法及其在现代网络中的演进。
1 拥塞的成因与代价
1.1 什么是拥塞?
从本质上讲,拥塞发生的需求超过了网络资源的供给。我们可以用一个简单的数学关系来描述:
若网络中某一资源的负载(Load)超过了该资源的容量(Capacity),即:
∑Load>Capacity \sum \text{Load} > \text{Capacity} ∑Load>Capacity
此时,该链路或路由器就会发生拥塞。这里的资源包括链路带宽、路由器的缓存队列(Buffer)以及处理器的处理能力。
1.2 拥塞与流量控制的区别
初学者常将**拥塞控制(Congestion Control)与流量控制(Flow Control)**混淆,两者虽然都涉及降低发送速率,但目标完全不同:
- 拥塞控制 :是一个全局性的过程,涉及网络中所有的主机、所有的路由器以及降低网络传输性能的所有因素。其目的是防止子网被过多的数据注入,导致整个网络瘫痪。
- 流量控制 :是点对点(端到端)的通信量控制。其目的是抑制发送端发送数据的速率,以便接收端来得及接收。
1.3 拥塞的代价
如果不对拥塞进行控制,网络性能将经历两个阶段的恶化:
- 膝点(Knee):随着负载增加,吞吐量增长变缓,延迟开始显著增加。
- 崖点(Cliff):负载继续增加超过某一极限,吞吐量急剧下降至零,延迟趋于无穷大,网络进入死锁状态。

2 拥塞控制的基本原理
拥塞控制算法主要分为两大类:开环控制(Open Loop)和闭环控制(Closed Loop)。
2.1 开环控制(预防为主)
开环控制试图通过良好的设计来避免拥塞发生。它在系统启动前就决定何时接受新流量、何时丢弃分组,不依赖于当前网络的动态反馈。
- 应用场景:由虚电路(Virtual Circuit)网络中的准入控制实现,或者是现代网络中的服务质量(QoS)预留。
2.2 闭环控制(反馈调节)
闭环控制基于反馈环路概念:
- 监测:系统监视拥塞发生的位置和时间。
- 反馈:将拥塞信息传递给能够采取行动的地方(通常是源主机)。
- 调整:调整系统运行以消除拥塞。
3 流量整形(Traffic Shaping)
在网络层入口处,为了防止突发流量冲击核心网络,通常会使用流量整形技术。其核心思想是强制要求数据包按照某种规定的速率发送。
3.1 漏桶算法(Leaky Bucket)
想象一个底部有孔的桶。无论上方水龙头(主机)注水的速率多么不稳定(忽快忽慢),水都以恒定的速率从底部流出。
- 如果桶满了,新注入的水(数据包)就会溢出(被丢弃)。
- 特点:强制输出速率恒定,适合平滑流量,但无法处理突发数据。
3.2 令牌桶算法(Token Bucket)
为了允许一定程度的突发传输,令牌桶算法被提出。
- 系统以恒定速率产生"令牌"放入桶中。
- 发送一个数据包需要消耗一个令牌。
- 如果桶中有积累的令牌,主机可以瞬间发送多个数据包(突发)。
- 特点:既限制了平均速率,又允许一定量的突发传输。

4 网络层的拥塞控制机制
在数据报子网(如 IP 网络)中,路由器无法提前预知路径,因此主要依赖闭环控制机制。
4.1 抑制分组(Choke Packets)
这是一种古老的机制。当路由器发现拥塞时,它会向发送该数据包的源主机发送一个特定的"抑制分组"(在 ICMP 协议中称为 Source Quench)。
- 原理:源主机收到抑制分组后,按一定比例降低发送速率。
- 现状:由于抑制分组本身也会消耗带宽,加剧拥塞,现代高速网络中已基本不再使用 ICMP Source Quench。
4.2 负载脱落(Load Shedding)
当路由器缓存溢出无法处理时,最直接的方法就是丢包。
- 尾部丢弃(Tail Drop):最简单的策略,新来的包直接丢弃。
- 问题 :这会导致TCP 全局同步(Global Synchronization)。即多个 TCP 连接同时检测到丢包,同时减速,然后又同时加速,导致网络利用率震荡。
4.3 主动队列管理(AQM)与随机早期检测(RED)
为了解决尾部丢弃的问题,网络层引入了主动队列管理(Active Queue Management, AQM),其中最著名的是 RED(Random Early Detection)。
-
基本原理 :
路由器维持一个"平均队列长度"变量。
- 若平均队列长度 < 最小阈值:正常排队,不丢包。
- 若最小阈值 < 平均队列长度 < 最大阈值:以某种概率 ppp 随机丢弃新到达的数据包。
- 若平均队列长度 > 最大阈值:丢弃所有新包。
-
作用:通过在缓冲区填满之前"随机"丢弃少数包,提前向发送端(TCP)发出拥塞信号。这使得不同的 TCP 连接在不同时间减速,避免了全局同步,稳定了网络负载。
4.4 显式拥塞通知(ECN)
丢包毕竟是一种浪费。ECN (Explicit Congestion Notification) 允许路由器在不丢包的情况下通知源主机网络发生拥塞。
- 实现:利用 IP 首部中的两个位(ECN bits)。
- 流程:当路由器检测到拥塞(例如根据 RED 算法判定),它不再丢包,而是将 IP 包头中的 ECN 位标记为"拥塞经历(CE)"。接收端收到后,在传输层向发送端回送信号,通知其降低速率。
5 历史发展与现代应用
5.1 历史演变
- 1980年代前:ARPANET 时期,主要依赖简单的链路层重传和源抑制(Source Quench)。
- 1986年互联网拥塞崩溃:网络负载过高导致整个互联网吞吐量降至 1/1000。这促使了 Van Jacobson 改进 TCP 拥塞控制。此时重点在传输层。
- 1990年代:研究发现单纯依靠 TCP 不够,路由器也就是网络层必须参与。RED 算法被提出并标准化(RFC 2309)。
- 2000年代至今:ECN 逐渐普及,成为 Windows 和 Linux 的默认开启选项。
5.2 现代数据中心与 QoS
在现代云计算和数据中心网络中,网络层的拥塞控制变得更加精细:
- DCTCP (Data Center TCP):结合网络层的 ECN 标记,在数据中心内部实现极低的延迟和高吞吐量。
- DiffServ (区分服务):网络层通过识别 IP 包头的 DSCP 字段,对不同优先级的业务(如视频会议 vs 文件下载)应用不同的丢包策略(加权 RED),保障关键业务不被拥塞影响。
本章小结
网络层的拥塞控制是保障互联网稳定运行的基石之一。虽然端到端的 TCP 协议承担了主要的速率调节任务,但网络层通过流量整形(令牌桶) 、主动队列管理(RED)以及显式信号(ECN),为上层协议提供了准确的反馈和物理基础。
理解拥塞控制,关键在于理解"延迟"与"吞吐量"的权衡,以及如何通过反馈机制防止网络进入"崖点"后的崩溃状态。