Appearance
题目
某网络拓扑如题 41 图所示:
图中说明:R1~R3 是路由器,Switch 为 100BaseT 交换机,Hub 为 100BaseT 集线器,主机 H1~H4 的默认 DNS 服务器均配置为 201.1.1.1。
假设题 33~41 图中的 H3 访问 Web 服务器 S 时,S 为新建的 TCP 连接分配了 20 KB(K = 1024)的接收缓存,最大段长 MSS = 1 KB,平均往返时间 RTT = 200 ms。H3 建立连接时的初始序号为 100,且持续以 MSS 大小的段向 S 发送数据,拥塞窗口初始阈值为 32 KB;S 对收到的每个段进行确认,并通告新的接收窗口。假定 TCP 连接建立完成后,S 端的 TCP 接收缓存仅有数据存入而无数据取出。请回答下列问题。
(1) 在 TCP 连接建立过程中,H3 收到的 S 发送过来的第二次握手 TCP 段的 SYN 和 ACK 标志位的值分别是多少?确认序号是多少?
(2) H3 收到的第 8 个确认段所通告的接收窗口是多少?此时 H3 的拥塞窗口变为多少?H3 的发送窗口变为多少?
(3) 当 H3 的发送窗口等于 0 时,下一个待发送的数据段序号是多少?H3 从发送第 1 个数据段到发送窗口等于 0 时刻为止,平均数据传输速率是多少(忽略段的传输延时)?
(4) 若 H3 与 S 之间通信已经结束,在 t 时刻 H3 请求断开该连接,则从 t 时刻起,S 释放该连接的最短时间是多少?
解析
(1) 第二次握手的 SYN / ACK / 确认序号
TCP 三次握手的标志位组合(背诵级):
| 握手 | 方向 | SYN | ACK | seq | ack_seq |
|---|---|---|---|---|---|
| 第一次 | H3 → S | 1 | 0 | 100 | — |
| 第二次 | S → H3 | 1 | 1 | y(S 选的初始序号) | 101 |
| 第三次 | H3 → S | 0 | 1 | 101 | y + 1 |
第二次握手是"S 同意建连 + 顺便确认 H3 的 SYN",所以 SYN=1 + ACK=1 同时打开。
确认序号 = 对方 seq + 1(SYN 段虽然不携带数据,但消耗一个序号)= 100 + 1 = 101。
最终答案:SYN = 1,ACK = 1,ack_seq = 101。
(2) 第 8 个 ACK 后的窗口状态
题面强调 "S 端 TCP 接收缓存仅有数据存入、无数据取出" → 接收方每确认一个 1 KB 段,接收窗口 rwnd 就少 1 KB。
慢启动阶段(初始阈值 32 KB 远未到达,全程都在慢启动),每收到一个新段的 ACK,cwnd 增加 1 KB(初始 cwnd = 1 KB)。
逐次填表(追踪到第 8 个 ACK):
| 第 N 个 ACK | rwnd(剩余接收缓存) | cwnd(拥塞窗口) |
|---|---|---|
| ACK #1 | 20 − 1 = 19 KB | 1 + 1 = 2 KB |
| ACK #2 | 19 − 1 = 18 KB | 3 KB |
| ... | ... | ... |
| ACK #8 | 20 − 8 = 12 KB | 1 + 8 = 9 KB |
发送窗口 = min(cwnd, rwnd) = min(9, 12) = 9 KB。
慢启动 vs 拥塞避免的切分点:拥塞窗口 ≤ ssthresh 时是慢启动(指数增长,每 RTT 加倍);> ssthresh 时进入拥塞避免(线性增长,每 RTT 加 1 MSS)。本题 ssthresh = 32 KB,cwnd 永远涨不到这里就被 rwnd 卡死了,所以全程慢启动。
(3) 发送窗口降为 0 时的状态
继续跟踪到 rwnd = 0:每个 ACK 都会让 rwnd 减 1,所以 rwnd 在第 20 个 ACK 后变为 0。此时 cwnd = 21 KB,但发送窗口 = min(21, 0) = 0。
下一个待发送的数据段序号:
- 初始序号 100,三次握手 SYN 消耗 1 个序号 → 数据起始序号 = 101
- 已发送 20 个 1 KB(= 20 × 1024 = 20480 B)的数据
- 下一个待发序号 = 101 + 20 × 1024 = 101 + 20480 = 20581
算"经过了几轮 RTT"(关键步骤):
慢启动每轮"翻倍"地发送,直到被 rwnd 卡住:
| 轮次(已过 RTT 数) | 本轮 cwnd | 本轮 rwnd | 本轮发送窗口 | 本轮发送段数 | 累计已发段数 |
|---|---|---|---|---|---|
| 1 | 1 | 20 | 1 | 1 | 1 |
| 2 | 2 | 19 | 2 | 2 | 3 |
| 3 | 4 | 17 | 4 | 4 | 7 |
| 4 | 8 | 13 | 8 | 8 | 15 |
| 5 | 16 | 5 | 5 | 5 | 20 |
第 5 轮收完所有 ACK 后,rwnd = 0、发送窗口 = 0,总计 5 个 RTT = 5 × 200 ms = 1000 ms = 1 s。
平均数据传输速率:
也可以写作 20 KB/s 或 20.48 KB/s(如果 K=1000;本题 K=1024 所以是 20 KB/s = 20480 B/s)。
常见单位错位:考研题里 K=1024、k=1000、B=byte、b=bit 经常混着用,注意区分 KB/s 和 kbps——前者是字节速率,后者是比特速率,差 8 倍。
(4) S 释放连接的最短时间
TCP 四次挥手 + 时间线(从 H3 发送 FIN 起算):
t = 0 H3 → S : FIN(H3 进入 FIN-WAIT-1)
t = RTT/2 S 收到 FIN
S → H3: ACK(S 进入 CLOSE-WAIT,H3 进入 FIN-WAIT-2)
S 立刻发完剩余数据后(题面无数据,立刻发 FIN)
S → H3: FIN(S 进入 LAST-ACK)
t = RTT H3 收到 ACK 和 FIN
H3 → S: ACK(H3 进入 TIME-WAIT)
t = 1.5×RTT S 收到最后 ACK,立刻 CLOSED ← 最短释放时刻S 真正"释放连接"是在收到 H3 的最后一个 ACK 之时。这一 ACK 从 H3 发出后,单程 = RTT/2 到达 S。
总时间 = 。
TIME-WAIT 在 H3 端、不影响 S:H3 在发完最后 ACK 后会进入 TIME-WAIT 状态等 2 MSL 才彻底关闭——这是为了万一最后 ACK 丢失,能重发一次以保证 S 关闭。但本题问的是"S 释放连接"的时间,不是 H3 关闭时间,所以不算 2 MSL。
为什么是四次挥手而不是三次:握手时 S 可以把"对 H3 SYN 的 ACK"和"自己的 SYN"合并成一个段;挥手时 S 收到 FIN 后可能还有数据要发完,所以 ACK 立刻回但 FIN 要等数据发完才发,两个不能合并 → 一次方向上的关闭需要 2 个段(FIN + ACK),双向共 4 个段。