Appearance
题目
假设主机甲和主机乙已建立一个 TCP 连接,最大段长 MSS = 1 KB,甲一直有数据向乙发送,当甲的拥塞窗口为 16 KB 时,计时器发生了超时,则甲的拥塞窗口再次增长到 16 KB 所需要的时间至少是( )。
错因
A
只算了慢启动指数翻倍的 RTT 数:cwnd 1→2→4→8→16,4 RTT。错的根源:忽略了超时后 ssthresh 被设为 cwnd/2 = 8——cwnd 增长到 8 时切到拥塞避免阶段,不再翻倍。慢启动只走到 8(3 RTT),后面 8→16 必须走线性增长。
B
可能算成了 4 RTT 慢启动 + 1 RTT 拥塞避免 = 5 RTT。错的根源:算法切换点错了——本题 ssthresh = 8,慢启动只能走到 8(3 RTT),不是走到 16(4 RTT)。
D
按"全程线性增长"算:cwnd 1→2→...→16,16 个值需 15 RTT,凑成 16 RTT。错的根源:完全没用慢启动(指数加速)的部分,把整个恢复期都当成线性增长。实际起步阶段(cwnd < ssthresh)是慢启动阶段,比线性快得多。
总解析
第一步:超时事件后的状态变化
TCP 超时(重传计时器溢出)触发"严重拥塞推断":
| 变量 | 超时前 | 超时后 |
|---|---|---|
| cwnd | 16 KB(=16 MSS) | 重置为 1 MSS |
| ssthresh | (不知道) | = cwnd / 2 = 8 KB(即 8 MSS) |
| 算法阶段 | 拥塞避免 | 重新进入慢启动 |
第二步:慢启动阶段(cwnd < ssthresh = 8)
cwnd 每 RTT 翻倍:
| 时刻(RTT 数) | cwnd(MSS) |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 4 |
| 3 | 8(达到 ssthresh,切换到拥塞避免) |
慢启动用 3 RTT 把 cwnd 从 1 增到 8。
第三步:拥塞避免阶段(cwnd ≥ ssthresh = 8)
cwnd 每 RTT + 1 MSS:
| 时刻(RTT 数) | cwnd(MSS) |
|---|---|
| 3 | 8 |
| 4 | 9 |
| 5 | 10 |
| 6 | 11 |
| 7 | 12 |
| 8 | 13 |
| 9 | 14 |
| 10 | 15 |
| 11 | 16 ✓ |
拥塞避免用 8 RTT 把 cwnd 从 8 增到 16。
第四步:合计
最终答案是 C(11 RTT)。
编者注(生僻术语):TCP 拥塞控制的两类失败信号触发不同的恢复路径——
- 超时(本题)→ 严重拥塞 → cwnd = 1 MSS、ssthresh = cwnd/2,重新慢启动
- 3 个重复 ACK(快速重传)→ 较轻拥塞 → ssthresh = cwnd/2、cwnd = ssthresh,进入快速恢复(拥塞避免阶段直接接续,不重启)
本题用的是超时路径,所以从 cwnd=1 起步。如果换成快速重传,cwnd 直接从 8 起步走线性,恢复仅需 8 RTT,不需要慢启动那 3 RTT。