Skip to content

模块导航: 总入口 · 总纲与方法 · 后端场景 · AI与算法工程 · 国企与金融 · 网络问答


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 高 → 拥塞控制在限制。

持续学习,持续积累。