TCP 拥塞控制由四个核心算法组成:慢启动、拥塞避免、快重传、快恢复。
| 事件 | ssthresh | cwnd | 进入阶段 |
|---|---|---|---|
| 超时 | $cwnd/2$ | 1 MSS | 慢启动 |
| 3 个重复 ACK | $cwnd/2$ | $ssthresh$(或 $ssthresh+3$) | 拥塞避免 |
| 阶段 | 增长方式 | 每 RTT 增长量 | 触发切换条件 |
|---|---|---|---|
| 慢启动 | 指数增长 | cwnd 翻倍 | $cwnd \geq ssthresh$ |
| 拥塞避免 | 线性增长 | +1 MSS | 丢包事件 |
初始 $ssthresh = 16$ MSS,$cwnd = 1$ MSS。实际计算中通常简化为 cwnd 为整数(单位 MSS),每 RTT 计算一次。
| RTT | 阶段 | cwnd 变化 | cwnd | 说明 |
|---|---|---|---|---|
| 1 | 慢启动 | 1→2 | 2 | 指数增长 |
| 2 | 慢启动 | 2→4 | 4 | 指数增长 |
| 3 | 慢启动 | 4→8 | 8 | 指数增长 |
| 4 | 慢启动 | 8→16 | 16 | $cwnd = ssthresh$,转入拥塞避免 |
| 5 | 拥塞避免 | 16→17 | 17 | 线性增长 |
| 6 | 拥塞避免 | 17→18 | 18 | 线性增长 |
| 7 | 拥塞避免 | 18→19 | 19 | 线性增长 |
假设 $RTT=7$ 时收到 3 个重复 ACK(快重传 + 快恢复):$ssthresh = \frac{19}{2} = 9$(向下取整),$cwnd = 9$(408 通常取 $cwnd = ssthresh$),进入拥塞避免。
| RTT | 阶段 | cwnd 变化 | cwnd | 说明 |
|---|---|---|---|---|
| 8 | 拥塞避免 | 9→10 | 10 | 线性增长 |
| 9 | 拥塞避免 | 10→11 | 11 | 线性增长 |
假设 $RTT=9$ 时发生超时:$ssthresh = \frac{11}{2} = 5$,$cwnd = 1$,进入慢启动。
| RTT | 阶段 | cwnd 变化 | cwnd | 说明 |
|---|---|---|---|---|
| 10 | 慢启动 | 1→2 | 2 | |
| 11 | 慢启动 | 2→4 | 4 | |
| 12 | 慢启动 | 4→5 | 5 | $cwnd = ssthresh(5)$,转入拥塞避免 |
| 13 | 拥塞避免 | 5→6 | 6 |
设 TCP 的 ssthresh 初始值为 12(单位 MSS)。当拥塞窗口 cwnd 上升到 16 时,网络发生超时。求之后的 cwnd 变化过程。
解析:超时前 $cwnd = 16$,说明正处于拥塞避免阶段(已过慢启动)。
| RTT | 阶段 | cwnd |
|---|---|---|
| 1 | 慢启动 | 1→2 |
| 2 | 慢启动 | 2→4 |
| 3 | 慢启动 | 4→8 |
| 4 | 拥塞避免 | 8→9($cwnd = ssthresh = 8$,转入拥塞避免) |
| 5 | 拥塞避免 | 9→10 |
| 6 | 拥塞避免 | 10→11 |
$ssthresh = 8$,$cwnd = 10$(拥塞避免阶段),此时收到 3 个重复 ACK。
| RTT | 阶段 | cwnd |
|---|---|---|
| 1 | 拥塞避免 | 5→6 |
| 2 | 拥塞避免 | 6→7 |
| 3 | 拥塞避免 | 7→8 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。