1. 概述

在 TCP 协议中,流量控制(Flow Control)与拥塞控制(Congestion Control)是两个非常关键的机制,它们分别负责控制发送端与接收端之间的数据传输速率,以及整个网络的负载状态。

本文将从原理出发,结合实际示例,深入讲解这两个机制的工作方式,并总结它们之间的核心区别。


2. TCP 中的流量控制

流量控制的作用是防止发送端发送数据过快,导致接收端来不及处理而造成数据丢失。它本质上是发送端与接收端之间的一种速率同步机制。

流量控制主要由 TCP 协议在传输层实现,而数据链路层也参与了这一过程。

我们来看一个类比:

Jack 正在参加一个培训课程,老师讲得很快,而 Jack 接受信息的速度较慢。一段时间后,他完全跟不上节奏,导致信息“溢出”。

后来,Jack 请求老师放慢速度,老师根据他的接受能力调整了教学节奏。这就像 TCP 流量控制机制:发送方根据接收方的处理能力来调整发送速率。

在 TCP 中,接收方会通过 TCP 报文头中的窗口字段(Receiver Window,RWND)告诉发送方自己还能接收多少数据。发送方根据这个值来决定发送多少数据,避免接收方缓冲区溢出。

flow control


3. 滑动窗口协议简介

滑动窗口协议是 TCP 实现流量控制的核心机制之一,它是一种面向字节的、窗口大小可变的协议。

连接建立后,接收方会将自己的接收窗口大小(Receiver Window)告知发送方。发送方根据这个值确定可以发送的数据量。如果接收窗口为 0,则发送方暂停发送,直到接收方再次通知窗口大小。

TCP 报文头中包含一个 16 位的窗口字段,因此最大窗口大小为 65,535 字节。

3.1 滑动窗口的三种操作

  1. 窗口打开(Opening Window):接收方通知发送方可发送更多数据。
  2. 窗口关闭(Closing Window):已发送的数据被接收方确认,发送方不再需要保留这些数据。
  3. 窗口缩小(Shrinking Window):接收方减少窗口大小。虽然 TCP 允许这么做,但不推荐,因为它可能造成混乱。

示例图:

  • 打开窗口: opening the window

  • 关闭窗口: closing the window


4. 示例:滑动窗口如何工作

假设 Device-A 要向 Device-B 发送 300,000 字节的数据,每个数据包大小为 1500 字节,共 200 个包。

初始时,Device-B 通知 Device-A 接收窗口为 60,000 字节。这意味着 Device-A 可以一次性发送 40 个包(40 × 1500 = 60,000),而无需等待确认。

发送完 40 个包后,Device-A 等待确认。收到确认后,滑动窗口滑动到下一个 60,000 字节,并继续发送。

如果接收方发送了窗口为 0 的确认,发送方会启动一个“持久定时器(Persist Timer)”,定期发送探测包以避免死锁。

tcp example


5. 拥塞控制机制

拥塞控制是 TCP 为避免网络过载而设计的机制,它限制每个网络节点的数据流量,防止节点因数据包过多而崩溃。

拥塞通常发生在路由器或交换机的队列缓冲区满载时,导致网络延迟增加、吞吐量下降。

TCP 拥塞控制分为三个阶段:

  1. 慢启动(Slow Start)
  2. 拥塞避免(Congestion Avoidance)
  3. 拥塞检测(Congestion Detection)

congestion control phase

5.1 慢启动阶段

在连接初期,发送方从一个小的窗口(通常是 1 个 MSS)开始发送数据,并逐步增加窗口大小。

  • MSS(最大段大小):单个 TCP 段能承载的最大数据量(不包括 TCP 和 IP 头部)。
  • 每收到一个确认,窗口大小增加 1 个 MSS。
  • 当窗口大小达到慢启动阈值(SSTHRESH)时,进入拥塞避免阶段。

✅ 通常,SSTHRESH 的默认值为 65,535 字节。

5.2 拥塞避免阶段

在这个阶段,窗口大小的增长速度变慢,采用线性增长策略:

CWND = CWND + MSS / CWND

这样可以降低网络拥塞的可能性。

5.3 拥塞检测阶段

当发生以下情况时,TCP 认为网络出现拥塞:

  • 超时未收到确认(Timeout)
  • 收到三个重复确认(Triple Duplicate Ack)

处理方式如下:

  • 超时:重置拥塞窗口并重新进入慢启动阶段。
  • 重复确认:降低窗口大小,进入快速恢复阶段,然后切换到拥塞避免。

6. 实际场景类比

我们可以用 Jack 上班的例子来理解流量控制与拥塞控制:

Jack 上班途中会经过多个路口,每个路口都有红绿灯控制车流。这就像 TCP 在网络节点之间控制数据包的流动,防止拥堵。

到达公司后,电梯容量有限,保安根据电梯容量控制人员进入。这就像流量控制,根据接收方缓冲区大小控制发送速率。

congestion control example


7. 流量控制与拥塞控制的区别

特性 流量控制(Flow Control) 拥塞控制(Congestion Control)
控制对象 发送端与接收端之间的数据传输 网络节点之间的数据流量
负责层 传输层 + 数据链路层 传输层 + 网络层
目的 防止接收端被数据淹没 防止网络节点过载
数据发送 发送端根据接收端缓冲区调整 发送端根据网络状况调整
窗口机制 接收窗口(RWND) 拥塞窗口(CWND)

8. 总结

本文深入解析了 TCP 中的两个关键控制机制:

  • 流量控制通过滑动窗口机制,根据接收方的处理能力控制发送速率,防止接收端缓冲区溢出。
  • 拥塞控制通过慢启动、拥塞避免和拥塞检测三个阶段,动态调整发送窗口,避免网络节点过载。

二者虽然都用于控制数据传输速率,但作用对象和机制不同,缺一不可。掌握它们的工作原理,有助于更好地理解 TCP 协议在网络通信中的表现。


原始标题:Flow Control vs. Congestion Control in TCP