流量控制和拥塞控制是 TCP 协议的两大核心机制。流量控制解决发送方与接收方之间的速度匹配问题,防止发送过快导致接收方缓冲区溢出;拥塞控制解决网络整体负载过大的问题,防止过多数据注入导致路由器/链路过载。
流量控制通过滑动窗口实现:接收方在 TCP 首部的窗口字段(rwnd)告知自己的接收缓冲剩余空间,发送方的发送窗口不能超过该值。当 rwnd 为 0 时发送方停止发送,但会启动持续计时器周期性发送探测报文,防止窗口恢复通知丢失导致死锁。
拥塞控制有四种核心算法:慢开始、拥塞避免、快重传、快恢复。发送方维护拥塞窗口 cwnd,实际发送窗口取 min(rwnd, cwnd)。慢开始阶段 cwnd 从 1 开始指数增长,达到阈值 ssthresh 后进入拥塞避免线性增长;发生超时后 ssthresh 减半、cwnd 重置为 1 重新慢开始;收到 3 个重复 ACK 时执行快重传和快恢复,ssthresh 减半、cwnd 设为新的 ssthresh。
| 概念 | 定义 |
|---|---|
| rwnd | 接收窗口,接收方告知发送方的可用缓冲区大小 |
| cwnd | 拥塞窗口,发送方根据网络拥塞程度估算的窗口大小 |
| ssthresh | 慢开始门限,区分慢开始和拥塞避免的阈值 |
| 滑动窗口 | 发送方维护的"已发送但未确认"的数据范围 |
| 超时重传 | 超时未收到 ACK 时重传丢失的报文段 |
| 快重传 | 收到 3 个重复 ACK 后立即重传丢失报文段,不等待超时 |
| 慢开始 | cwnd 从 1 开始,每收到一个 ACK 翻倍(指数增长) |
| 拥塞避免 | cwnd 每个 RTT 增加 1(线性增长) |
| AIMD | 加法增大乘法减小,拥塞避免的基本策略 |
| 考点 | 说明 |
|---|---|
| 滑动窗口工作原理 | 发送窗口、接收窗口的关系,窗口滑动过程 |
| 流量控制计算 | 根据 rwnd 计算发送速率,处理窗口为 0 的情况 |
| 拥塞窗口变化曲线 | 画出 cwnd 随传输轮次变化的曲线图 |
| 慢开始与拥塞避免切换 | 根据 ssthresh 判断当前阶段,计算各阶段 cwnd 值 |
| 超时与快重传的区别 | 超时 → 慢开始;3 个重复 ACK → 快重传 + 快恢复 |
| 发送窗口确定 | 发送窗口 = min(cwnd, rwnd) |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。