Appearance
题目
若主机甲与主机乙已建立一条 TCP 连接,最大段长(MSS)为 1 KB,往返时间(RTT)为 2 ms,则在不出现拥塞的前提下,拥塞窗口从 8 KB 增长到 32 KB 所需的最长时间是:
错因
A
按**慢启动(指数增长)**算:cwnd 8 → 16 → 32,2 个 RTT = 4 ms。这是慢启动阶段每 RTT 翻倍的算法。错的根源:题问"最长时间"——意味着选最慢的那种增长方式(拥塞避免,线性),不是最快的(慢启动,指数)。
B
可能算了"cwnd 8 → 32 共增长 24 KB,每个 RTT 增 6 KB" → 4 RTT = 8 ms。错的根源:拥塞避免阶段每 RTT 只加 1 MSS = 1 KB,不是任意"凑出来的速率"。
C
把"24 KB 的差值"误解读为"24 ms"——把 KB 当 RTT 数:24 KB → 24 RTT = 48 ms 才对,但 24 ms 对应 12 RTT、12 KB 增量,与题面差距相反。或者用了"每 RTT 增 2 KB"的误算法:24 KB / 2 KB/RTT = 12 RTT = 24 ms。
总解析
第一步:理解 TCP 拥塞控制两个阶段
| 阶段 | cwnd 增长方式 | 触发条件 |
|---|---|---|
| 慢启动 | 每 RTT 翻倍(指数) | cwnd < ssthresh(慢启动阈值) |
| 拥塞避免 | 每 RTT + 1 MSS(线性) | cwnd ≥ ssthresh |
题面问"最长时间"——意味着选增长最慢的方式:拥塞避免(线性,每 RTT 仅增 1 KB)。
第二步:套拥塞避免的线性增长
cwnd 从 8 KB 增到 32 KB,需要增加 KB。每 RTT 增 1 KB(= 1 MSS),共需 24 个 RTT。
第三步:核对
| 阶段 | 算法 | 结果 |
|---|---|---|
| 慢启动 | 8→16→32,2 RTT | 最短 4 ms(A) |
| 拥塞避免 | 8→9→...→32,24 RTT | 最长 48 ms(D) |
题问"最长",对应拥塞避免:D(48 ms)。
思考:为什么有"最长 vs 最短"两种可能?
题面只说"在不出现拥塞的前提下",没规定 ssthresh 是多少。
- 若 ssthresh ≤ 8:cwnd 一开始就大于 ssthresh,全程走拥塞避免(线性)→ 24 RTT = 48 ms
- 若 ssthresh ≥ 32:cwnd 全程小于 ssthresh,全程走慢启动(指数)→ 2 RTT = 4 ms
- 若 8 < ssthresh < 32:先慢启动后拥塞避免,时间介于两者之间
题问"最长时间",所以取拥塞避免全程,答 D。
最终答案是 D(48 ms)。
编者注(生僻术语):慢启动阈值 ssthresh(slow start threshold)是控制 cwnd 增长方式切换的临界值——cwnd < ssthresh 时走慢启动(指数翻倍)、cwnd ≥ ssthresh 时走拥塞避免(线性增长)。ssthresh 在每次发生拥塞时被设为当前 cwnd 的一半,作为下次"应该谨慎一些"的参考值。本题没给 ssthresh 是开放性的——所以问"最长 / 最短"通过取极端 ssthresh 来确定增长路径。