408考研逐题详解:2009年第39题
2009年第39题
一个 TCP 连接总是以 1KB 的最大段长发送 TCP 段,发送方有足够多的数据要发送。当拥塞窗口为 16KB 时发生了超时,如果接下来的 4 个 RTT(往返时间)时间内的 TCP 段的传输都是成功的,那么当第 4 个 RTT 时间内发送的所有 TCP 段都得到肯定应答时,拥塞窗口大小是( )
A. 7KB \qquad B. 8KB \qquad C. 9KB \qquad D. 16KB
解析
本题考查 TCP 拥塞控制机制,特别是超时后拥塞窗口(cwnd)的变化过程,涉及慢启动(Slow Start)和拥塞避免(Congestion Avoidance)两个阶段的核心知识点。
-
拥塞窗口(Congestion Window, cwnd):是 TCP 协议中由发送方维护的一个状态变量,用于动态控制发送速率,防止网络过载。它表示在当前网络状态下允许发送但尚未收到确认(ACK)的最大数据量(单位通常是字节或 MSS)。其核心作用包括:
- 拥塞控制:通过动态调整 cwnd 的大小,避免网络因流量过大而瘫痪。
- 平衡效率:在最大化吞吐量和避免丢包之间寻找平衡点。
- 自适应网络:根据网络状况(如丢包、延迟)自动调整发送速率。
拥塞窗口与接收窗口的区别如下表所示:
特性 拥塞窗口(cwnd) 接收窗口(rwnd) 控制方 发送方维护 接收方通告 目的 防止网络拥塞 防止接收方缓冲区溢出 依据 网络拥塞状况(如丢包、超时) 接收方可用缓冲区大小 动态性 根据拥塞算法自动调整 由接收方显式通知 实际发送窗口大小 = min(cwnd, rwnd)
-
TCP 拥塞控制基础:
- TCP 使用拥塞窗口控制发送速率,避免网络拥塞。cwnd 表示发送方在未收到确认前可以发送的最大数据量(单位为字节或 MSS)。
- MSS(Maximum Segment Size)是最大段长,本题中为 1KB。
- 当发生超时(表明网络拥塞)时,TCP 会触发拥塞控制机制:慢启动阈值(ssthresh)设置为当前 cwnd 的一半,cwnd 重置为 1 个 MSS。
-
慢启动(Slow Start):
- 触发条件:cwnd < ssthresh 时。
- 窗口增长规则:每收到一个确认(ACK),cwnd 增加 1 个 MSS(即指数增长)。每个 RTT 内,cwnd 大约翻倍(因为所有段被确认后,cwnd 会倍增)。
- 增长公式:若初始 cwnd = 1 MSS,则:
- 第 1 个 RTT 后:cwnd = 2 × 1 MSS = 2 MSS
- 第 2 个 RTT 后:cwnd = 2 × 2 MSS = 4 MSS
- 以此类推。
-
拥塞避免(Congestion Avoidance):
- 触发条件:cwnd ≥ ssthresh 时。
- 窗口增长规则:每个 RTT 内,cwnd 线性增加 1 个 MSS(无论当前 cwnd 大小)。具体实现中,每收到一个 ACK,cwnd 增加 (MSS × MSS) / cwnd(字节单位),但整体效果是每个 RTT 结束(所有段被确认后),cwnd 增加 1 个 MSS。
- 增长公式:若进入拥塞避免时 cwnd = w MSS,则:
- 第 1 个 RTT 后:cwnd = w + 1 MSS
- 第 2 个 RTT 后:cwnd = w + 2 MSS
- 以此类推。
-
超时处理:
- 发生超时时,ssthresh 更新为当前 cwnd 的一半(向下取整),cwnd 重置为 1 MSS。
- 本题中,超时前 cwnd = 16KB,因此:
- ssthresh = floor(16KB / 2) = 8KB
- cwnd 重置为 1 MSS = 1KB。
-
RTT 与传输过程:
- RTT(往返时间)是发送数据到收到确认的时间。
- 题目要求在“第 4 个 RTT 时间内发送的所有 TCP 段都得到肯定应答时”的 cwnd,即第 4 个 RTT 结束时(所有 ACK 到达后)的 cwnd 值。
- “传输成功”表示所有段都被确认,无丢包,cwnd 按规则增长。
根据知识点,逐步计算超时后 4 个 RTT 内的 cwnd 变化。初始状态:超时后,cwnd = 1KB, ssthresh = 8KB(因超时前 cwnd = 16KB,ssthresh = 16KB / 2 = 8KB)。
-
第 1 个 RTT:
- 起始 cwnd = 1KB(cwnd < ssthresh,处于慢启动)。
- 发送数据量 = cwnd = 1KB(即 1 个段,因 MSS = 1KB)。
- 传输成功:所有段被确认。
- 结束 cwnd:每收到一个 ACK,cwnd 增加 1 MSS(慢启动规则)。由于发送 1 个段,收到 1 个 ACK,cwnd = 1KB + 1KB = 2KB。
- 此时,cwnd = 2KB < ssthresh = 8KB,仍处于慢启动。
-
第 2 个 RTT:
- 起始 cwnd = 2KB(cwnd < ssthresh,慢启动)。
- 发送数据量 = cwnd = 2KB(2 个段)。
- 传输成功:所有段被确认。
- 结束 cwnd:收到 2 个 ACK,每个 ACK 使 cwnd 增加 1 MSS,因此 cwnd = 2KB + 2 × 1KB = 4KB(或指数增长:2KB × 2 = 4KB)。
- 此时,cwnd = 4KB < ssthresh = 8KB,仍处于慢启动。
-
第 3 个 RTT:
- 起始 cwnd = 4KB(cwnd < ssthresh,慢启动)。
- 发送数据量 = cwnd = 4KB(4 个段)。
- 传输成功:所有段被确认。
- 结束 cwnd:收到 4 个 ACK,每个 ACK 使 cwnd 增加 1 MSS,因此 cwnd = 4KB + 4 × 1KB = 8KB(或指数增长:4KB × 2 = 8KB)。
- 此时,cwnd = 8KB ≥ ssthresh = 8KB,因此进入拥塞避免阶段(根据 TCP 标准,当 cwnd ≥ ssthresh 时切换)。
-
第 4 个 RTT:
- 起始 cwnd = 8KB(cwnd ≥ ssthresh,处于拥塞避免)。
- 发送数据量 = cwnd = 8KB(8 个段)。
- 传输成功:所有段被确认(题目要求)。
- 结束 cwnd:在拥塞避免阶段,当所有段被确认后(即所有 ACK 到达),cwnd 线性增加 1 个 MSS(每个 RTT 增加 1 MSS)。因此,cwnd = 8KB + 1KB = 9KB。
- 详细增长:每收到一个 ACK,cwnd 增加 (MSS × MSS) / cwnd = (1KB × 1KB) / 8KB = 0.125KB。发送 8 个段,收到 8 个 ACK,总增加 8 × 0.125KB = 1KB,故 cwnd = 8KB + 1KB = 9KB。
当第 4 个 RTT 时间内发送的所有 TCP 段都得到肯定应答时(即第 4 个 RTT 结束时),拥塞窗口大小是 9KB。
本题答案:C