《计算机网络》深入学:拥塞控制

引言

在计算机网络中,网络层的主要任务是将数据包从源主机路由到目的主机。然而,当子网中存在的全部数据包数量过多时,网络的性能就会下降。这种情况称为拥塞(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 拥塞的代价

如果不对拥塞进行控制,网络性能将经历两个阶段的恶化:

  1. 膝点(Knee):随着负载增加,吞吐量增长变缓,延迟开始显著增加。
  2. 崖点(Cliff):负载继续增加超过某一极限,吞吐量急剧下降至零,延迟趋于无穷大,网络进入死锁状态。

2 拥塞控制的基本原理

拥塞控制算法主要分为两大类:开环控制(Open Loop)闭环控制(Closed Loop)

2.1 开环控制(预防为主)

开环控制试图通过良好的设计来避免拥塞发生。它在系统启动前就决定何时接受新流量、何时丢弃分组,不依赖于当前网络的动态反馈。

  • 应用场景:由虚电路(Virtual Circuit)网络中的准入控制实现,或者是现代网络中的服务质量(QoS)预留。
2.2 闭环控制(反馈调节)

闭环控制基于反馈环路概念:

  1. 监测:系统监视拥塞发生的位置和时间。
  2. 反馈:将拥塞信息传递给能够采取行动的地方(通常是源主机)。
  3. 调整:调整系统运行以消除拥塞。

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)

  • 基本原理

    路由器维持一个"平均队列长度"变量。

    1. 若平均队列长度 < 最小阈值:正常排队,不丢包。
    2. 若最小阈值 < 平均队列长度 < 最大阈值:以某种概率 ppp 随机丢弃新到达的数据包。
    3. 若平均队列长度 > 最大阈值:丢弃所有新包。
  • 作用:通过在缓冲区填满之前"随机"丢弃少数包,提前向发送端(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),为上层协议提供了准确的反馈和物理基础。

理解拥塞控制,关键在于理解"延迟"与"吞吐量"的权衡,以及如何通过反馈机制防止网络进入"崖点"后的崩溃状态。

相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
shiyi.十一5 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai6 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜7 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript