首页/计算机网络/05-transport/TCP流量控制和拥塞控制 🔗 在 Obsidian 中打开
计算机网络 · 05-transport

TCP流量控制和拥塞控制

重要度 ⭐⭐TCP流量控制拥塞控制
速查
流量控制端到端(收发双方速度匹配,靠 rwnd),拥塞控制全局性(整个网络负载,靠 cwnd)。实际发送窗口 = min(rwnd, cwnd)。慢开始并不"慢":cwnd 指数增长,初始 $cwnd=1$ 很保守。超时 → cwnd 回 1 重新慢开始;3 个重复 ACK → 快重传 + 快恢复。

核心概念

流量控制和拥塞控制是 TCP 协议的两大核心机制。流量控制解决发送方与接收方之间的速度匹配问题,防止发送过快导致接收方缓冲区溢出;拥塞控制解决网络整体负载过大的问题,防止过多数据注入导致路由器/链路过载。

流量控制通过滑动窗口实现:接收方在 TCP 首部的窗口字段(rwnd)告知自己的接收缓冲剩余空间,发送方的发送窗口不能超过该值。当 rwnd 为 0 时发送方停止发送,但会启动持续计时器周期性发送探测报文,防止窗口恢复通知丢失导致死锁。

拥塞控制有四种核心算法:慢开始、拥塞避免、快重传、快恢复。发送方维护拥塞窗口 cwnd,实际发送窗口取 min(rwnd, cwnd)。慢开始阶段 cwnd 从 1 开始指数增长,达到阈值 ssthresh 后进入拥塞避免线性增长;发生超时后 ssthresh 减半、cwnd 重置为 1 重新慢开始;收到 3 个重复 ACK 时执行快重传和快恢复,ssthresh 减半、cwnd 设为新的 ssthresh。

发送窗口的两层约束 流量控制 · rwnd端到端 · 接收缓冲速度匹配 拥塞控制 · cwnd全局 · 网络负载上限
发送窗口 = min(rwnd, cwnd):同时受接收方与网络约束。

关键定义

概念定义
rwnd接收窗口,接收方告知发送方的可用缓冲区大小
cwnd拥塞窗口,发送方根据网络拥塞程度估算的窗口大小
ssthresh慢开始门限,区分慢开始和拥塞避免的阈值
滑动窗口发送方维护的"已发送但未确认"的数据范围
超时重传超时未收到 ACK 时重传丢失的报文段
快重传收到 3 个重复 ACK 后立即重传丢失报文段,不等待超时
慢开始cwnd 从 1 开始,每收到一个 ACK 翻倍(指数增长)
拥塞避免cwnd 每个 RTT 增加 1(线性增长)
AIMD加法增大乘法减小,拥塞避免的基本策略

常见考法

考点说明
滑动窗口工作原理发送窗口、接收窗口的关系,窗口滑动过程
流量控制计算根据 rwnd 计算发送速率,处理窗口为 0 的情况
拥塞窗口变化曲线画出 cwnd 随传输轮次变化的曲线图
慢开始与拥塞避免切换根据 ssthresh 判断当前阶段,计算各阶段 cwnd 值
超时与快重传的区别超时 → 慢开始;3 个重复 ACK → 快重传 + 快恢复
发送窗口确定发送窗口 = min(cwnd, rwnd)

易错点

  • 流量控制是端到端的(收发双方),拥塞控制是全局性的(整个网络)。
  • 慢开始并不"慢":cwnd 是指数增长的;"慢"指初始 $cwnd = 1$ 很保守。
  • 超时和 3 个重复 ACK 的处理不同:超时从 $cwnd = 1$ 重新慢开始;3 个重复 ACK 进入快恢复($cwnd = ssthresh$ 或 $ssthresh + 3$)。
  • 发送窗口取 min(rwnd, cwnd),不要只考虑其中一个。
  • 拥塞避免是每 RTT 加 1(加法增大),不是每 ACK 加 1。

核心结论

  1. 流量控制通过滑动窗口机制实现,接收方用 rwnd 控制发送速率;窗口为 0 时发送探测报文防死锁。
  2. 拥塞控制四算法:慢开始(指数增长)→ 拥塞避免(线性增长)→ 超时后慢开始 / 3 个重复 ACK 后快恢复。
  3. 发送窗口 = min(rwnd, cwnd),同时受流量控制和拥塞控制约束。
  4. AIMD(加法增大乘法减小)是拥塞避免阶段的核心策略,保证公平性和效率。

记忆卡片

流量控制 vs 拥塞控制?
流量控制是端到端(rwnd,速度匹配);拥塞控制是全局性(cwnd,网络负载)。
发送窗口如何确定?
发送窗口 = min(rwnd, cwnd),同时受两个机制约束。
超时 vs 3 个重复 ACK?
超时 → ssthresh 减半、$cwnd=1$,重新慢开始;3 个重复 ACK → 快重传+快恢复,$cwnd=ssthresh$(或 $ssthresh+3$)。
慢开始 cwnd 怎么长?
cwnd 从 1 开始,每 ACK 翻倍(指数增长);达 ssthresh 转拥塞避免(每 RTT +1,线性)。
接收方窗口为 0 防死锁?
发送方启动持续计时器,周期性发探测报文,防窗口恢复通知丢失。

交互动画 · 发送窗口 = min(rwnd, cwnd)

0123 4567 891011 12131415 rwnd=8 接收方通告 · 固定 8 单位 cwnd=1 发送方估计 · 随算法变化 发送窗口 = min(rwnd, cwnd) 1 1 8 cwnd 取值(单位 MSS,右侧数值):rwnd 固定 8,发送窗口取两者较小者。
调节 cwnd(慢开始 / 拥塞避免 / 快恢复 / 超时),观察发送窗口 = min(rwnd, cwnd)
点击上方按钮开始
橙色条 = 实际发送窗口:被 rwnd(绿)与 cwnd(紫)中较小者卡住;rwnd 归零时发送方靠持续计时器探测恢复。

相关知识点

tcp-three-way-handshake

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。