💡 前言
在 TCP 协议中,为了保证数据传输的可靠性和高效性,有两个至关重要的机制:滑动窗口(Sliding Window)和拥塞控制(Congestion Control)。
很多初学者容易把它们搞混:“不都是控制发送速度吗?”
其实,它们关注的维度完全不同。今天,我们就用 “水管供水” 的例子,带你彻底分清这两位“幕后英雄”。
1. 核心概念一句话总结
- 滑动窗口(流量控制):关注的是接收端的能力。目的是 “别发太快,我处理不过来” 。
- 拥塞控制:关注的是网络链路的状态。目的是 “路堵了,慢点发,别把路压垮”。
2. 滑动窗口:接收端的“刹车片” 🛑
🤔 为什么需要它?
想象一下,你(客户端)给好朋友(服务端)寄书。
- 你寄书的速度很快,每分钟寄 10 本。
- 但好朋友看书很慢,每分钟只能看 1 本,而且书桌很小,只能堆 5 本书。
- 如果你不管不顾一直寄,朋友的书桌瞬间爆满,剩下的书只能扔在地上(丢包),或者朋友不得不打电话让你停下(效率极低)。
滑动窗口就是为了解决这个问题:发送方根据接收方的处理能力,动态调整发送数据的大小。
⚙️ 工作原理
- 如果接收方处理得快,缓冲区空余多,窗口变大 -> 发送方加速。
- 如果接收方处理得慢,缓冲区快满了,窗口变小 -> 发送方减速。
- 如果缓冲区满了,窗口为 0 -> 发送方暂停发送(零窗口探针机制后续会探测)。
📝 关键点:滑动窗口是端到端的行为,只关心接收方累不累。
3. 拥塞控制:网络的“交通指挥” 🚧
🤔 为什么需要它?
还是寄书的例子。
- 这次假设你和朋友都很有钱,书架无限大,处理速度也极快。
- 但是,中间的 快递公司(网络链路) 爆仓了!高速公路堵车,快递分拣中心堆积如山。
- 如果你继续疯狂发货,只会让快递系统彻底瘫痪,所有包裹都卡在路上,谁也收不到。
拥塞控制就是为了解决这个问题:发送方根据网络的拥堵程度,动态调整发送速率,防止网络过载。
⚙️ 四大算法(经典组合拳)
TCP 拥塞控制主要通过维护一个 拥塞窗口(cwnd, congestion window) 来实现。发送方的实际发送窗口 = min(rwnd, cwnd)。
慢启动(Slow Start) 🚀
- 策略:刚开始不知道路况,先试探性地发少量数据(比如 1 个报文)。每收到一个 ACK,拥塞窗口就翻倍(指数增长)。
- 目的:快速探测网络的可用带宽。
- 注意:虽然叫“慢”启动,其实增长速度很快(指数级)。
拥塞避免(Congestion Avoidance) 🐢
- 策略:当窗口达到一个阈值(ssthresh)后,怀疑网络可能快堵了。于是改为“加法增大”,每经过一个往返时间(RTT),窗口只加 1。
- 目的:线性增长,平稳地逼近网络极限。
快重传(Fast Retransmit) ⚡
- 策略:如果发送方连续收到 3 个重复的 ACK(说明某个包丢了,但后面的包到了),不用等超时定时器,立即重传丢失的包。
- 目的:提高响应速度,减少等待时间。
快恢复(Fast Recovery) 🔄
- 策略:执行快重传后,不进入慢启动,而是将阈值减半,拥塞窗口设为新阈值,然后直接进入拥塞避免阶段。
- 目的:因为能收到重复 ACK,说明网络并没有完全断连,只是个别丢包,所以不需要从头再来(慢启动太慢了)。
📝 关键点:拥塞控制是全局性的考量,关心的是整个网络路径堵不堵。
4. 终极对比:一张表看懂区别 📊
| 关注点 | 接收端的处理能力 | 网络链路的承载能力 |
| 控制变量 | rwnd (Receiver Window) | cwnd (Congestion Window) |
| 决策依据 | 接收方缓冲区剩余大小 | 网络丢包率、延迟、重复 ACK |
| 目的 | 防止接收方缓冲区溢出 | 防止网络链路过载/拥塞 |
| 类比 | “我肚子饱了,你别喂了” | “路上堵车了,大家慢点开” |
| 发生位置 | 端到端 (End-to-End) | 全局网络 (Global Network) |
5. 它们如何协同工作? 🤝
在实际传输中,发送方的有效发送窗口取两者的最小值:
发送窗口
=
min
(
rwnd
,
cwnd
)
\\text{发送窗口} = \\min(\\text{rwnd}, \\text{cwnd})
发送窗口=min(rwnd,cwnd)
- 场景 A:网络很畅通(cwnd 很大),但接收方处理慢(rwnd 很小)。
- 结果:受限于 rwnd,发送方慢下来。(流量控制主导)
- 场景 B:接收方处理飞快(rwnd 很大),但网络严重拥堵(cwnd 很小)。
- 结果:受限于 cwnd,发送方慢下来。(拥塞控制主导)
6. 面试高频考点 💡
- 主要依据:超时重传 或 收到重复 ACK。
- 不是。它是指数增长,初期速度提升非常快,旨在快速探测带宽上限。
- 因为连续重复 ACK 意味着网络只是轻微拥塞(个别丢包),而非严重拥塞(超时)。直接回到慢启动会导致吞吐量剧烈波动,快恢复能保持较高的传输效率。
7. 总结 🎯
- 滑动窗口是点对点的协商,确保接收方不被压垮。
- 拥塞控制是对网络环境的适应,确保互联网不被堵死。
两者相辅相成,共同构成了 TCP 可靠、高效传输的基石。
希望这篇文档能帮你清晰地区分这两个概念!如果觉得有用,欢迎点赞收藏~ 🌟





