TCP 拥塞窗口的两种主要计算情景
在考研计算机网络的题目中,对 TCP 拥塞控制的考察主要围绕拥塞窗口(cwnd)的变化展开。其核心在于理解 TCP 的两个主要阶段:慢启动(Slow Start)和拥塞避免(Congestion Avoidance)。
核心概念
在深入两种情景之前,我们先回顾一下关键概念:
- 拥塞窗口 (cwnd):发送方维持的一个状态变量,用于控制在收到确认之前可以发送到网络中的数据量。
- 最大报文段长度 (MSS):一个 TCP 报文段所能携带的数据量的最大值。在计算题中,cwnd 的大小通常以 MSS 的倍数表示。
- 慢启动阈值 (ssthresh):一个门限值,用于区分慢启动阶段和拥塞避免阶段。
情景一:以轮次(RTT)为单位的宏观计算
这种视角将一个 RTT(Round-Trip Time,往返时间)视为一个整体操作单位,关注在每个 RTT 之后拥塞窗口的整体变化。这在分析慢启动阶段的指数增长时尤为常见。
- 核心思想:在慢启动阶段,每经过一个 RTT,拥塞窗口
cwnd就会翻倍。 - 适用场景:
- 计算 TCP 连接建立初期,经过 N 个 RTT 后
cwnd的大小。 - 题目信息较为简化,不涉及对单个 ACK 的精细分析。
- 计算 TCP 连接建立初期,经过 N 个 RTT 后
- 解题思路:
- 初始状态:TCP 连接刚建立时,
cwnd通常初始化为 1 个 MSS。 - 指数增长:只要
cwnd小于慢启动阈值ssthresh,就执行慢启动算法。- 第 1 个 RTT 后,
cwnd= 1 * 2 = 2 MSS - 第 2 个 RTT 后,
cwnd= 2 * 2 = 4 MSS - 第 N 个 RTT 后,
cwnd= 2^N MSS
- 第 1 个 RTT 后,
- 触及阈值:当
cwnd增长到大于或等于ssthresh时,TCP 将进入拥塞避免阶段。
- 初始状态:TCP 连接刚建立时,
例题:假设初始 ssthresh 为 16 MSS,cwnd 初始为 1 MSS。问经过 4 个 RTT 后,cwnd 是多少?
- 解答:
- 初始:
cwnd= 1 MSS - RTT 1 后:
cwnd= 2 MSS - RTT 2 后:
cwnd= 4 MSS - RTT 3 后:
cwnd= 8 MSS - RTT 4 后:
cwnd= 16 MSS。此时cwnd达到ssthresh,下个 RTT 将进入拥塞避免阶段。
- 初始:
情景二:以收到单个 ACK 为单位的微观计算
TIP
2016 年 Q41
- 原题情景: H3 收到的第 8 个确认段所通告的接收窗口是多大?此时 H3 的拥塞窗口变为多少?H3 的发送窗口变为多少?
这种视角关注每当发送方收到一个对数据报文的确认(ACK)时,cwnd 的精细变化。它能更准确地描述拥塞窗口的增长过程,尤其是在拥塞避免阶段。
- 核心思想:
- 慢启动阶段:每收到 1 个 ACK,
cwnd增加 1 个 MSS。 因为在一个 RTT 内会收到前一个窗口所有报文的 ACK,这同样会导致窗口大小翻倍的效果。 - 拥塞避免阶段:每收到 1 个 ACK,
cwnd增加MSS/cwnd(即MSS * (MSS / cwnd_bytes))。 这确保了在一个 RTT 内(即收到一个窗口大小的 ACK 后),cwnd总共只增加约 1 个 MSS,实现线性增长。
- 慢启动阶段:每收到 1 个 ACK,
- 适用场景:
- 需要精确计算拥塞避免阶段
cwnd的增长。 - 题目涉及到非整数个 RTT 或者对 ACK 的响应有特殊说明。
- 分析从慢启动到拥塞避免的平滑过渡。
- 需要精确计算拥塞避免阶段
- 解题思路:
- 判断阶段:首先根据当前的
cwnd和ssthresh判断 TCP 处于慢启动还是拥塞避免阶段。 - 计算增长:
- 慢启动:
new_cwnd = old_cwnd + 1 MSS(每收到一个 ACK)。 - 拥塞避免:
new_cwnd = old_cwnd + MSS/cwnd(每收到一个 ACK)。
- 慢启动:
- 处理拥塞事件:当发生网络拥塞(如超时或收到 3 个重复 ACK)时,需要更新
ssthresh和cwnd的值,并可能切换回慢启动阶段。
- 判断阶段:首先根据当前的
例题:当 cwnd 为 10 MSS,ssthresh 为 8 MSS 时,发送方连续发送 10 个报文段。当收到这 10 个报文段的 ACK 后,cwnd 变为多大?
- 解答:
- 判断阶段:因为
cwnd(10) >ssthresh(8),所以 TCP 处于拥塞避免阶段。 - 计算增长:每收到一个 ACK,
cwnd增加1/10MSS。收到全部 10 个 ACK 后,总共增加10 * (1/10 MSS) = 1 MSS。 - 最终结果:新的
cwnd= 10 MSS + 1 MSS = 11 MSS。
- 判断阶段:因为
总结
这两种情景并非相互排斥,而是对 TCP 拥塞控制机制不同层面的解读。
| 特性 | 情景一 (宏观/按 RTT) | 情景二 (微观/按 ACK) |
|---|---|---|
| 核心算法 | 慢启动 | 慢启动 和 拥塞避免 |
| 计算单位 | 每个 RTT | 每个 ACK |
| 增长模式 | 指数增长 (cwnd * 2) | 慢启动:+1 MSS 拥塞避免: +MSS/cwnd |
| 主要用途 | 快速估算慢启动过程 | 精确分析整个拥塞控制流程 |
在备考时,需要根据题目的具体条件灵活选用合适的模型。如果题目只给出 RTT 轮次,通常使用情景一的简化模型;如果题目涉及到具体的 ACK 回复或者拥塞避免阶段的计算,则必须采用情景二的精细模型。