Appearance
题目
若浏览器不支持并行 TCP 连接,使用非持久的 HTTP/1.0 协议请求浏览 1 个 web 页,该页中引用同一个网站上 7 个小图像文件,则从浏览器传输 web 页请求建立 TCP 连接开始,到接收完所有内容为止,所需要的往返时间 RTT 数至少是( )
错因
A
把"对象数"算太少或者把每对象 RTT 算太少——只算到 4 RTT,明显遗漏。可能错路:以为浏览器一次能"一并请求所有 8 个对象"用 4 RTT 解决,完全无视"非持久 + 不并行"两个约束。
B
只算了"每对象一次请求-响应共 1 RTT",得到 1(HTML) + 7(图像) + 1(建首连)= 9 RTT。错的根源:忽略了"每个对象都要先单独建立 TCP 连接(三次握手 1 RTT)"——非持久 HTTP/1.0 + 8 个对象 = 8 次独立握手,不是 1 次。
C
只算 7 个图像 × 2 RTT = 14 RTT,漏算了 HTML 页面本身的 2 RTT——HTML 页面(即"web 页")也要 1 次 TCP 建连 + 1 次请求/响应。需要先把 HTML 拿回来浏览器才能解析其中的图片引用,这一步是必不可少的开端。
总解析
第一步:列清楚要传输的对象数量
题面给出:1 个 web 页(HTML 主页面)+ 7 个小图像 = 8 个独立对象。
第二步:确认每个对象的 RTT 开销
约束条件:
- 非持久 HTTP/1.0:每个对象单独打开一次 TCP 连接,传完即关闭
- 不支持并行 TCP:所有连接串行进行,前一个对象完成后才能开下一个
对每个对象的耗时:
| 阶段 | 用时 |
|---|---|
| TCP 三次握手(建立连接) | 1 RTT |
| 发送 HTTP 请求 + 接收 HTTP 响应 | 1 RTT |
每对象 = 2 RTT。
第三步:列出全过程
| 步骤 | 对象 | 累计 RTT |
|---|---|---|
| 1 | HTML 主页面 | 2 |
| 2 | 图像 1 | 4 |
| 3 | 图像 2 | 6 |
| 4 | 图像 3 | 8 |
| 5 | 图像 4 | 10 |
| 6 | 图像 5 | 12 |
| 7 | 图像 6 | 14 |
| 8 | 图像 7 | 16 |
第四步:得到答案
最终答案是 D(16)。
编者注(知识延伸):HTTP 协议的"持久 / 并行"两条优化彼此独立——
- 持久连接(HTTP/1.1 默认):复用同一条 TCP 连接传多个对象,每对象只需 1 RTT(请求-响应),节省的是建连接时间
- 并行连接(早期浏览器优化):开多条 TCP 同时下载,把串行变并行,节省的是总耗时
- 非持久 + 不并行(本题):每对象 2 RTT、且全部串行,最耗时
- 持久 + 流水线(HTTP/1.1 pipeline):1 个 TCP,多请求可同时发出(不等响应),最快可只用 1 RTT 拿完所有响应(理想情况)