Appearance
题目
一个 TCP 连接总是以 1 KB 的最大段长发送 TCP 段,发送方有足够多的数据要发送。当拥塞窗口为 16 KB 时发生了超时,如果接下来的 4 个 RTT(往返时间)时间内的 TCP 段的传输都是成功的,那么当第 4 个 RTT 时间内发送的所有 TCP 段都得到肯定应答时,拥塞窗口大小是( )。
错因
A
可能算到 cwnd = 7(少 1 跳),或者把 ssthresh 算错。错的根源:慢启动 / 拥塞避免阶段切换的 RTT 数算错。
B
只算到 cwnd 达到 ssthresh = 8(第 3 RTT 末),漏掉第 4 RTT 的拥塞避免 + 1。错的根源:以为达到 ssthresh 后 cwnd 就停止增长,但实际进入拥塞避免后每 RTT 仍 +1。
D
直接给 16 KB(超时前的值)——完全忽略超时事件 + 慢启动重置。超时后 cwnd 必须重置为 1 KB,从慢启动重新开始。错的根源:以为超时只是"发送暂停一下、然后继续",但实际 TCP 会重启拥塞控制状态。
总解析
第一步:超时事件的影响
cwnd = 16 KB 时超时:
| 变量 | 超时前 | 超时后 |
|---|---|---|
| cwnd | 16 KB | 重置为 1 KB(即 1 MSS) |
| ssthresh | 不知道 | KB |
| 阶段 | 拥塞避免 | 重新进入慢启动 |
第二步:列出 4 个 RTT 内的 cwnd 变化
慢启动每 RTT cwnd 翻倍;达到 ssthresh = 8 后切到拥塞避免(每 RTT + 1 MSS)。
| 时刻 | 事件 | cwnd(KB) | 阶段 |
|---|---|---|---|
| 0(超时刚结束) | 重置 | 1 | 慢启动起步 |
| 第 1 RTT 末 | 翻倍 | 2 | 慢启动 |
| 第 2 RTT 末 | 翻倍 | 4 | 慢启动 |
| 第 3 RTT 末 | 翻倍达 ssthresh | 8 | 切到拥塞避免 |
| 第 4 RTT 末 | + 1(拥塞避免) | 9 | 拥塞避免 |
第三步:核对
题面问"第 4 个 RTT 时间内发送的所有 TCP 段都得到肯定应答时" → 第 4 RTT 末 → cwnd = 9 KB。
| 选项 | 值 | 错处 |
|---|---|---|
| A | 7 | RTT 数算错 |
| B | 8 | 漏第 4 RTT 的 +1 |
| C | 9 | 正确(慢启动 1→2→4→8 + 拥避 +1 = 9) |
| D | 16 | 漏超时重置 |
最终答案是 C(9 KB)。
编者注(生僻术语):本题 cwnd 增长的关键节点是 ssthresh = 8 处——前 3 RTT 是慢启动(指数翻倍),第 4 RTT 是拥塞避免(线性 +1)。这种"先指数后线性"的混合增长是 TCP 拥塞控制的标准行为。
区别于 cn-2014-38(10 RTT 后 cwnd 也类似算法),cn-2022-38(11 RTT 后 cwnd 回到 16)等题——所有这类题的核心都是:① 超时后 ssthresh = cwnd/2、cwnd = 1;② cwnd < ssthresh 时翻倍、≥ ssthresh 时 +1;③ 数 RTT 数。