Appearance
题目
假设主机 H 通过 HTTP/1.1 请求浏览某 Web 服务器 S 上的 Web 页 news408.html,news408.html 引用了同目录下的 1 幅图像,news408.html 文件大小为 1 MSS(最大段长),图像文件大小为 3 MSS,H 访问 S 的往返时间 RTT = 10 ms,忽略 HTTP 响应报文的首部开销和 TCP 段传输时延。若 H 已完成域名解析,则从 H 请求与 S 建立 TCP 连接时刻起,到接收到全部内容止,所需的时间至少是( )。
错因
A
按"无慢启动 + 持久连接"算:1 RTT 握手 + 1 RTT HTML + 1 RTT 图像 = 3 RTT = 30 ms。错的根源:忽略了 TCP 慢启动——图像 3 MSS 不能一次性发完,cwnd 初始为 1 MSS,发完 HTML 后 cwnd=2,发图像第一轮只能发 2 MSS,剩下 1 MSS 还要再 1 RTT。
C
可能算成了"非持久连接 + 慢启动"或者"图像 3 MSS 串行各 1 RTT"——按 1 RTT 握手 + 2 RTT HTML + 2 RTT 图像 = 5 RTT = 50 ms。错的根源:把"图像 3 MSS 用 3 RTT"或"持久连接每对象仍要握手"。
D
按"非持久连接 + 不并行"算:每对象 2 RTT × 2 对象 = 4 RTT = 40 ms(这是骨架答案 B 的算法);如果再多算 2 RTT 凑成 6 RTT = 60 ms 就是 D,但题面是 HTTP/1.1 持久连接,不应再每对象单独握手。错的根源:把 HTTP/1.0 非持久连接的算法套到 1.1 上,且把 RTT 数算大了。
总解析
第一步:理清前提条件
- HTTP/1.1 → 持久连接(多个 HTTP 请求复用同一条 TCP)
- 不并行(默认顺序处理 HTML → 图像)
- 1 个 HTML(1 MSS)+ 1 个图像(3 MSS)= 共 4 MSS 数据
- 忽略 TCP 段传输时延 → 不影响 cwnd 增长,但 cwnd 仍受慢启动约束
第二步:列出每 RTT 的事件
TCP 连接初始 cwnd = 1 MSS。
| RTT | 时刻 | 事件 | cwnd 变化 |
|---|---|---|---|
| 0 | 0 | 开始三次握手 | 1 |
| 1 | 10 ms | 握手完成;H 立即发 GET HTML(与第三次握手 ACK 捎带) | 1 |
| 2 | 20 ms | S 用 cwnd=1 发 1 MSS HTML 给 H;H 收到 HTML | cwnd → 2(收 ACK 后翻倍) |
| 2 | 20 ms | H 收完 HTML 立即发 GET 图像 | 2 |
| 3 | 30 ms | S 用 cwnd=2 发 2 MSS 图像(剩 1 MSS 没发);H 收到 2 MSS | cwnd → 4 |
| 4 | 40 ms | S 用 cwnd=4(仍剩 1 MSS)发剩下 1 MSS 图像;H 收到第 3 个 MSS | — |
第三步:H 在第 4 RTT 末(t = 40 ms)收到全部内容
合计:
第四步:核对
| 选项 | 算法 | 错误源 |
|---|---|---|
| A | 30 ms | 漏慢启动,以为图像 3 MSS 一次性发完 |
| B | 40 ms | 正确(含慢启动) |
| C | 50 ms | 多算 1 RTT |
| D | 60 ms | 误用非持久连接算法 |
最终答案是 B(40 ms)。
编者注(生僻术语):HTTP/1.1 持久连接(默认 keep-alive)相比 HTTP/1.0 非持久连接节省的是"每对象单独握手"的开销;但 TCP 慢启动仍然作用于这条复用的连接——cwnd 从 1 起步、每 RTT 翻倍。当题面给"忽略 TCP 段传输时延"时,cwnd 是唯一限制每 RTT 能发多少数据的因素。本题里 cwnd 增长 1 → 2 → 4 → ...,3 MSS 图像在 cwnd=2 时只能发 2,要再 1 RTT 才能把第 3 MSS 发完。