1. 概述
在 TCP 协议中,流量控制(Flow Control)与拥塞控制(Congestion Control)是两个非常关键的机制,它们分别负责控制发送端与接收端之间的数据传输速率,以及整个网络的负载状态。
本文将从原理出发,结合实际示例,深入讲解这两个机制的工作方式,并总结它们之间的核心区别。
2. TCP 中的流量控制
流量控制的作用是防止发送端发送数据过快,导致接收端来不及处理而造成数据丢失。它本质上是发送端与接收端之间的一种速率同步机制。
流量控制主要由 TCP 协议在传输层实现,而数据链路层也参与了这一过程。
我们来看一个类比:
Jack 正在参加一个培训课程,老师讲得很快,而 Jack 接受信息的速度较慢。一段时间后,他完全跟不上节奏,导致信息“溢出”。
后来,Jack 请求老师放慢速度,老师根据他的接受能力调整了教学节奏。这就像 TCP 流量控制机制:发送方根据接收方的处理能力来调整发送速率。
在 TCP 中,接收方会通过 TCP 报文头中的窗口字段(Receiver Window,RWND)告诉发送方自己还能接收多少数据。发送方根据这个值来决定发送多少数据,避免接收方缓冲区溢出。
3. 滑动窗口协议简介
滑动窗口协议是 TCP 实现流量控制的核心机制之一,它是一种面向字节的、窗口大小可变的协议。
连接建立后,接收方会将自己的接收窗口大小(Receiver Window)告知发送方。发送方根据这个值确定可以发送的数据量。如果接收窗口为 0,则发送方暂停发送,直到接收方再次通知窗口大小。
TCP 报文头中包含一个 16 位的窗口字段,因此最大窗口大小为 65,535 字节。
3.1 滑动窗口的三种操作
- 窗口打开(Opening Window):接收方通知发送方可发送更多数据。
- 窗口关闭(Closing Window):已发送的数据被接收方确认,发送方不再需要保留这些数据。
- 窗口缩小(Shrinking Window):接收方减少窗口大小。虽然 TCP 允许这么做,但不推荐,因为它可能造成混乱。
示例图:
打开窗口:
关闭窗口:
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)”,定期发送探测包以避免死锁。
5. 拥塞控制机制
拥塞控制是 TCP 为避免网络过载而设计的机制,它限制每个网络节点的数据流量,防止节点因数据包过多而崩溃。
拥塞通常发生在路由器或交换机的队列缓冲区满载时,导致网络延迟增加、吞吐量下降。
TCP 拥塞控制分为三个阶段:
- 慢启动(Slow Start)
- 拥塞避免(Congestion Avoidance)
- 拥塞检测(Congestion Detection)
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 在网络节点之间控制数据包的流动,防止拥堵。
到达公司后,电梯容量有限,保安根据电梯容量控制人员进入。这就像流量控制,根据接收方缓冲区大小控制发送速率。
7. 流量控制与拥塞控制的区别
特性 | 流量控制(Flow Control) | 拥塞控制(Congestion Control) |
---|---|---|
控制对象 | 发送端与接收端之间的数据传输 | 网络节点之间的数据流量 |
负责层 | 传输层 + 数据链路层 | 传输层 + 网络层 |
目的 | 防止接收端被数据淹没 | 防止网络节点过载 |
数据发送 | 发送端根据接收端缓冲区调整 | 发送端根据网络状况调整 |
窗口机制 | 接收窗口(RWND) | 拥塞窗口(CWND) |
8. 总结
本文深入解析了 TCP 中的两个关键控制机制:
- 流量控制通过滑动窗口机制,根据接收方的处理能力控制发送速率,防止接收端缓冲区溢出。
- 拥塞控制通过慢启动、拥塞避免和拥塞检测三个阶段,动态调整发送窗口,避免网络节点过载。
二者虽然都用于控制数据传输速率,但作用对象和机制不同,缺一不可。掌握它们的工作原理,有助于更好地理解 TCP 协议在网络通信中的表现。