Appearance
题目
Time 是一个提供时间查询服务的 C/S 架构网络应用,支持客户通过 UDP 和 TCP 向 Time 服务器请求时间。若某客户与 Time 服务器通信往返时间为 8ms,则该客户分别通过 UDP 和 TCP 向该服务器请求服务,所需的最少时间分别是( )。
错因
A
把 TCP 当成 UDP 算——以为 TCP 也是"发请求 → 收响应"一个 RTT 搞定,完全忽略了 TCP 必须先三次握手建立连接 才能传数据。这是基础概念漏洞:TCP 是面向连接协议,连接建立本身就要消耗 1 个 RTT。
C
把 UDP 和 TCP 的耗时反了——给 UDP 分配 16 ms(多算了一步)、给 TCP 分配 8 ms(漏算握手)。可能的思路:把 UDP 误以为"发请求 + 收响应 + 还要回个 ACK"(多了一个半 RTT),同时把 TCP 误以为"建好连接后只算一个 RTT"。两个错误都是常见认知偏差。
D
UDP 算成 16 ms 是错的——UDP 是无连接协议,没有任何握手。客户发请求(半 RTT)到服务器,服务器回响应(半 RTT)回客户,合计 1 个 RTT = 8 ms。选 D 的人可能误把 UDP 当成"也要交互握手才能传数据",或者把"请求 + 响应 + 应用层确认"凑够 2 RTT。
总解析
第一步:UDP 走完一次请求 / 响应需要多少 RTT
UDP 无连接、无握手,最少流程:
- 客户发"请求时间"报文 → 服务器(半 RTT)
- 服务器回"当前时间"报文 → 客户(半 RTT)
合计 1 RTT = 8 ms。
第二步:TCP 走完一次请求 / 响应需要多少 RTT
TCP 必须先完成三次握手才能传应用数据:
| 步骤 | 方向 | 累计耗时 |
|---|---|---|
| ① SYN | 客户 → 服务器 | 0.5 RTT |
| ② SYN+ACK | 服务器 → 客户 | 1 RTT |
| ③ ACK(可与请求数据捎带) | 客户 → 服务器 | 1.5 RTT |
| ④ 服务器返响应 | 服务器 → 客户 | 2 RTT |
关键技巧:第三次握手 ACK 可以与"请求时间"应用数据捎带(piggyback) 一起发出,省下一次 RTT。这是 TCP "首次数据可与第三次握手一起发"的标准优化。
合计 2 RTT = 16 ms。
第三步:核对
UDP 8 ms + TCP 16 ms → 命中选项 B(8 ms,16 ms)。
最终答案是 B。
编者注(生僻术语):"最少时间" 这里的关键限定 = "成功完成一次时间查询所需的最低 RTT 数",假设网络无丢包、无重传、无拥塞延迟。如果题面问"最坏" 时间,要把 SYN 重传、应用层超时等纳入,结果会大得多——本题只问最少所以走最优路径。