11. TCP 滑动窗口、拥塞控制是什么,有什么区别
总结
- 滑动窗口:早期网络,通信双方不考虑网络拥挤情况,导致掉包。滑动窗口大小意味着有多少缓冲区接受数据。
- 拥塞控制:防止过多数据注入网络中,拥塞控制是一个全局过程,控制网络流量。
- 区别:滑动窗口解决掉包问题,拥塞控制解决网络拥塞问题。
TCP 滑动窗口与拥塞控制详解
在 TCP 协议中,为了实现可靠传输和高效通信,引入了两个核心机制:滑动窗口(Sliding Window) 和 拥塞控制(Congestion Control)。它们分别从不同的角度优化数据传输过程。
一、滑动窗口(Sliding Window)
✅ 基本概念
滑动窗口是 TCP 实现**流量控制(Flow Control)**的机制,用于控制发送方发送的数据量,确保接收方不会因为数据过多而溢出缓冲区。
✅ 核心作用
- 控制发送速率,避免接收方缓冲区溢出。
- 提高传输效率,允许连续发送多个数据包而不必等待每个确认。
✅ 窗口大小含义
- 表示接收方当前还能接收多少字节的数据(由接收方通过
window
字段告知发送方)。 - 发送方根据窗口大小决定可以发送的数据量。
[已发送且确认] [已发送未确认] [可发送但未发送] [不可发送]
<----窗口滑动方向---->
✅ 工作流程
- 接收方在每次响应中携带自己的接收窗口大小(
rwnd
)。 - 发送方根据接收方窗口大小调整发送的数据量。
- 随着接收方不断接收并释放缓冲区,窗口“滑动”,发送方可继续发送新的数据。
二、拥塞控制(Congestion Control)
✅ 基本概念
拥塞控制是 TCP 用来防止网络过载的一种机制,是一种全局性机制,旨在避免因发送方注入过多数据导致网络拥塞甚至崩溃。
✅ 核心作用
- 防止过多数据注入网络中,造成丢包、延迟增大。
- 动态调整发送速率,适应当前网络状况。
✅ 主要算法(TCP Reno 中的经典实现)
-
慢启动(Slow Start)
- 初始时以指数方式增加发送窗口。
- 直到达到慢启动阈值或发生丢包。
-
拥塞避免(Congestion Avoidance)
- 窗口线性增长,更加保守。
- 避免再次引发网络拥塞。
-
快重传(Fast Retransmit)
- 收到三个重复的 ACK 后立即重传丢失的报文段。
-
快恢复(Fast Recovery)
- 在快重传后进入该阶段,调整拥塞窗口和慢启动阈值。
三、滑动窗口 vs 拥塞控制:主要区别
对比维度 | 滑动窗口(Flow Control) | 拥塞控制(Congestion Control) |
---|---|---|
目标 | 防止接收方缓冲区溢出 | 防止网络拥塞 |
范围 | 点对点通信(发送方 vs 接收方) | 全局网络环境 |
影响因素 | 接收方缓冲区大小 | 网络状态(如 RTT、丢包率) |
控制机制 | 接收方通过 window 字段反馈窗口大小 | 发送方动态调整拥塞窗口(cwnd) |
触发条件 | 接收方处理能力不足 | 网络出现丢包或延迟增大 |
四、协同工作机制
TCP 的发送窗口最终取的是两个控制机制中的最小值:
发送窗口大小 = min(rwnd, cwnd)
rwnd
:接收方窗口(由滑动窗口控制)cwnd
:拥塞窗口(由拥塞控制算法决定)
这意味着即使接收方还有空间接收数据,但如果网络已经拥塞,发送方也会减缓发送速度。
五、一句话总结
滑动窗口解决的是接收端缓冲区问题,而拥塞控制解决的是网络整体负载问题;两者共同协作,确保 TCP 既能高效传输又能稳定运行在网络环境中。
六、扩展知识:现代改进方案
- BBR(Bottleneck Bandwidth and RTT):Google 提出的新型拥塞控制算法,基于带宽和延迟建模,不再依赖丢包作为拥塞信号。
- CUBIC TCP:Linux 内核默认使用的拥塞控制算法,性能优于 Reno,在高速网络中表现更好。