5. 流量控制与拥塞控制的区别(热度 310 · 高频选考)
Q: 流量控制和拥塞控制有什么区别?
A:
对照表
| 维度 | 流量控制 | 拥塞控制 |
|---|---|---|
| 目的 | 防止发送方压垮接收方 | 防止发送方压垮网络 |
| 依据 | 接收方通告的 rwnd | 发送方探测的 cwnd |
| 手段 | 滑动窗口、零窗口探测、糊涂窗口综合症(SWS)处理 | 慢开始、拥塞避免、快重传、快恢复 |
| 作用域 | 端到端(发送方↔接收方) | 全局(涉及所有主机与路由器) |
| 谁维护 | 接收方计算并通告;发送方遵守 | 发送方本地计算与调整 |
| 反馈信号 | TCP 首部 Window 字段 | 丢包/重复 ACK/超时(传统);时延/带宽(BBR) |
核心公式: 实际发送窗口 = min(rwnd, cwnd)
流量控制细节
- 滑动窗口: 发送窗口内可连续发送未确认数据;收到 ACK 后窗口滑动。
- 零窗口: 接收缓冲满 → 通告 rwnd=0。发送方启动持续定时器(persist timer),周期性发送零窗口探测段(1 字节或序号探测),避免「ACK 丢失导致死锁」。
- 糊涂窗口综合症(SWS): 接收方每次只腾出几个字节就通告小窗口,导致大量小包。处理:接收端用 Clark 算法——延迟窗口更新,等到缓冲足够(能容纳一个完整 MSS,或达到接收缓冲的一半)再通告非零窗口;发送端则用 Nagle 算法合并小包(见下条)。两者常被并列为 SWS 的两端对策,但Nagle 是发送端算法,不能写成接收方的对策。
- Nagle 算法: 发送端合并小包(在有未确认数据时暂缓发送更小段),与 SWS 对策呼应。
拥塞控制细节(见第 6 题展开)
- 信号:超时或多个重复 ACK 被认为网络可能拥塞。
- 目标:探测「路径容量」而不引发丢包雪崩。
设计动机:为什么必须两个都做?
- 接收方不等于网络。 接收方可能很快但路径很窄,或路径很宽但接收方处理慢——只控制一个维度仍会丢包或崩溃。
- 信息局部性: 接收方最清楚自己缓冲;网络拥塞只有发送方通过「丢包/时延」侧面探测。职责分离符合端到端原则与信息就近原则。
- min 取小: 谁的限制更紧就听谁的,保证两个约束同时满足。
常见追问
追问 1:rwnd 和 cwnd 分别由谁维护?发送窗口怎么算?
- 答题要点: rwnd 由接收方在 TCP 首部 Window 字段通告;cwnd 由发送方拥塞算法本地维护;实际发送窗口 = min(rwnd, cwnd)。
追问 2:接收窗口为 0 怎么办?会死锁吗?
- 答题要点: 发送方不发送新数据,启动持续定时器发送零窗口探测。接收方处理完缓冲后回非零窗口。若探测 ACK 丢失,定时器会再试,避免永久死锁。
追问 3:为什么有了流量控制还需要拥塞控制?举反例。
- 答题要点: 反例:接收方 rwnd 很大(内存充足),1000 个发送方同时向它发送,链路和中间路由器仍会拥塞丢包。流量控制保护不了「共享网络」;必须有拥塞控制限制对网络的注入速率。
易错点
| 易错说法 | 纠正 |
|---|---|
| 「流量控制=拥塞控制」 | 目标不同:接收方 vs 网络 |
| 「发送窗口=rwnd」 | 是 min(rwnd, cwnd) |
| 「零窗口后连接断开」 | 只是暂停发送;用探测机制恢复 |
| 「cwnd 由接收方通告」 | cwnd 是发送方算法本地值;接收方只通告 rwnd |
| 「Nagle 用于流量控制」 | Nagle 是发送端小包合并优化,不改变 rwnd/cwnd,不等于流量控制机制本身(SWS 的接收端对策是 Clark 算法=延迟窗口通告,见上面「糊涂窗口综合症」;delayed ACK 是另一件事) |
与选择题对照
- 主库 150: 第 66 题(流量控制目的)、第 67 题(发送窗口取决于 min(rwnd,cwnd))、第 68–71 题(拥塞控制簇)、第 144 题(端到端原则)。
- 补题 16: 补-03、补-04(可靠传输窗口理论,对照 TCP 窗口)。
- 口述联动: 选择题直接考「目的/依据/min」;面试加分在零窗口探测、SWS、以及「两个维度缺一不可」的反例。
工程 / 抓包背景
- Wireshark: 查看 ACK 中的
Window size value;tcp.analysis.zero_window、tcp.analysis.window_update。 - ss -ti: 同时显示
cwnd与snd_wnd(对端通告的接收窗口,即协议里的 rwnd;输出中没有rwnd这个字段名),本端接收侧看rcv_space/rcv_ssthresh,被对端窗口卡住时会给出rwnd_limited:<ms>,便于对照谁是瓶颈。 - 调优: 接收缓冲
net.ipv4.tcp_rmem;窗口缩放net.ipv4.tcp_window_scaling(长肥管道必需)。 - 现象: 抓包见 ZeroWindow → 接收方应用消费慢或缓冲小;cwnd 很小且 RTT 高 → 拥塞控制在限制。