Appearance
题目
假设客户 C 和服务器 S 已建立一个 TCP 连接,通信往返时间 RTT = 50 ms,最长报文段寿命 MSL = 800 ms,数据传输结束后,C 主动请求断开连接。若从 C 主动向 S 发出 FIN 段时刻算起,则 C 和 S 进入 CLOSED 状态所需的时间至少分别是( )。
错因
A
C 的时间算成 850 ms = 50 ms(挥手)+ 800 ms(1 MSL)—— 把 TIME_WAIT 的等待时间记成 1 MSL(800 ms)。实际 TIME_WAIT 是 2 MSL = 1600 ms,C 应该 = 50 + 1600 = 1650 ms。S 的时间 50 ms 也错——应是 1.5 RTT = 75 ms(C 的 ACK 走半 RTT 才到 S)。
B
C 时间 1650 ms 对(2 MSL 算法),但 S 时间 50 ms 错——把 S 的时间算成 1 RTT。实际 S 在收到 C 的 ACK 后立即 CLOSED,C 的 ACK 是 1.5 RTT 后到 S,所以 S 用了 1.5 RTT = 75 ms。
C
C 时间 850 ms 错(同 A 的错,TIME_WAIT 当成 1 MSL),S 时间 75 ms 对。
总解析
第一步:列出 TCP 四次挥手时序
设 t = 0 时 C 发出 FIN,时间向右推进。
| 时刻 | 事件 | C 状态 | S 状态 |
|---|---|---|---|
| 0 | C 发 FIN | FIN_WAIT_1 | ESTABLISHED |
| 0.5 RTT = 25 ms | S 收 FIN,发 ACK + FIN(合并) | FIN_WAIT_1 | LAST_ACK |
| 1 RTT = 50 ms | C 收 ACK + FIN,发 ACK | TIME_WAIT | LAST_ACK |
| 1.5 RTT = 75 ms | S 收到 C 的 ACK | TIME_WAIT | CLOSED |
| 50 ms + 2 MSL = 1650 ms | C 等待 2 MSL 结束 | CLOSED | CLOSED |
第二步:算 C 进入 CLOSED 的时间
C 在 1 RTT = 50 ms 时进入 TIME_WAIT,然后等待 2 MSL = 1600 ms:
第三步:算 S 进入 CLOSED 的时间
S 在 LAST_ACK 等 C 的 ACK,C 的 ACK 在 1 RTT 时刻发出,传到 S 用 0.5 RTT,所以 S 在 1.5 RTT = 75 ms 收到 ACK 立即进入 CLOSED:
第四步:核对
| 选项 | C 时间 | S 时间 | 判定 |
|---|---|---|---|
| A | 850 | 50 | 双错 |
| B | 1650 | 50 | S 时间错 |
| C | 850 | 75 | C 时间错 |
| D | 1650 | 75 | 正确 |
最终答案是 D(1650 ms, 75 ms)。
编者注(生僻术语):TIME_WAIT 等 2 MSL 是为了双重保险:
- 如果最后那个 ACK 丢了,对端 LAST_ACK 状态会重传 FIN(最坏 1 MSL 后到达本端);本端在 TIME_WAIT 期间还能收到这个重传 FIN 并回复新 ACK(再 1 MSL 后到达对端)—— 共 2 MSL 覆盖最坏情形
- 让本次连接所有的"在飞"分组在网络中超时消失,避免新连接复用四元组时收到旧分组造成混乱
主动关闭方独自承担 2 MSL 的等待,被动方收到 ACK 即可立刻 CLOSED。