TCP的拥塞控制机制
字数 2250 2025-11-02 13:21:23
TCP的拥塞控制机制
描述:TCP的拥塞控制是TCP协议的核心机制之一,用于防止网络因数据流量过大而出现拥塞崩溃。它通过动态调整发送方的数据发送速率,使其与网络的当前承载能力相匹配。拥塞控制不是基于接收方的处理能力(那是流量控制),而是基于对网络中间节点(如路由器)负载情况的感知。
解题过程/知识讲解:
-
核心思想与基础概念
- 目标:最大化利用网络带宽,同时避免网络出现拥塞(路由器缓冲区溢出导致大量丢包)。
- 核心变量:发送方维护一个关键变量——拥塞窗口(cwnd, Congestion Window)。它代表了在不引起网络拥塞的前提下,发送方一次可以发送的最大数据量。发送方的实际有效窗口大小 = min(拥塞窗口, 接收方通告的接收窗口)。
- 如何感知拥塞:TCP将分组丢失(超时重传或收到重复ACK) 作为网络发生拥塞的主要信号。
-
拥塞控制的四个核心算法
TCP的拥塞控制由四个相互关联的算法组成:慢启动、拥塞避免、快速重传和快速恢复。-
a) 慢启动(Slow Start)
- 时机:当一个新的TCP连接建立时,或者发生超时重传(表明拥塞较严重)后,会进入慢启动阶段。
- 过程:
- 初始时,拥塞窗口
cwnd被设置为一个很小的值(如1个MSS,最大报文段长度)。 - 发送方每收到一个对新数据的确认(ACK),
cwnd就增加一个MSS。即cwnd = cwnd + 1(每ACK一次)。 - 这实际上是指数级增长:发送1个报文 -> 收到1个ACK ->
cwnd=2(可发2个报文)-> 收到2个ACK ->cwnd=4(可发4个报文)-> ...
- 初始时,拥塞窗口
- 目的:快速地将数据注入网络,探测可用的网络带宽,避免一开始就向未知网络注入大量数据。
- 结束条件:当
cwnd增长到一个预设的慢启动阈值(ssthresh, Slow Start Threshold) 时,就会转入“拥塞避免”阶段。或者,如果检测到分组丢失,则慢启动过程结束。
-
b) 拥塞避免(Congestion Avoidance)
- 时机:当
cwnd >= ssthresh时,进入拥塞避免阶段。 - 过程:
- 此时,发送方改为加法增大。即每收到一个对新数据的ACK,
cwnd增加 1/cwnd 个MSS。更直观的说法是:每经过一个往返时间(RTT),cwnd才增加1个MSS(因为一个RTT内会收到大约cwnd个ACK)。 - 例如,当前
cwnd=10,那么经过一个RTT,成功传输了10个报文并收到10个ACK后,cwnd会增加到11。
- 此时,发送方改为加法增大。即每收到一个对新数据的ACK,
- 目的:从指数增长的激进探测,转变为线性增长的保守爬升,小心翼翼地接近网络容量的极限,避免引发拥塞。
- 时机:当
-
c) 快速重传(Fast Retransmit)
- 背景:传统的超时重传等待时间(RTO)较长,效率低下。快速重传是一种提前重传的机制。
- 过程:
- 如果发送方连续收到3个重复的ACK(即第4个相同的ACK),它就有很强的理由认为某个报文段丢失了(而不是整个网络严重拥塞),因为后续的报文段已经到达接收方,触发了重复ACK。
- 发送方不必等待重传计时器超时,而是立即重传对方期望的那个报文段。
- 目的:更快地修复单个分组的丢失,提高传输效率。
-
d) 快速恢复(Fast Recovery)
- 时机:通常在触发快速重传后,进入快速恢复阶段。这是对“快速重传”的补充。
- 过程:
- 当收到3个重复ACK,表明网络虽然发生了丢包,但仍有数据流在传输(否则不会收到重复ACK)。因此,网络拥塞可能并不像超时那样严重。
- 发送方将
ssthresh设置为当前cwnd的一半(但不低于2):ssthresh = cwnd / 2。 - 然后,不将
cwnd重置为1(这是与发生超时重传的关键区别),而是将cwnd设置为新的ssthresh值(或ssthresh + 3,考虑已离开网络的3个报文)。之后,进入拥塞避免阶段,线性增长。
- 目的:避免在非严重拥塞的情况下,将窗口骤降至1(回到慢启动)而导致吞吐量急剧下降,使连接能更快地恢复到合理的数据传输速率。
-
-
完整流程示例
假设一次通信过程:- 连接建立,初始
cwnd = 1,ssthresh = 16。 - 慢启动:
cwnd指数增长(1, 2, 4, 8, 16)。 - 当
cwnd达到16(等于ssthresh),进入拥塞避免,cwnd开始线性增长(17, 18, ...)。 - 当
cwnd=24 时,发生报文丢失,触发了快速重传(收到3个重复ACK)。 - 随即进入快速恢复:
- 设置新的慢启动阈值:
ssthresh = 24 / 2 = 12。 - 将拥塞窗口设置为新的阈值:
cwnd = 12。 - 重传丢失的报文。
- 设置新的慢启动阈值:
- 重传成功后,收到新的ACK,表明丢失的报文已被确认。此时连接从快速恢复阶段退出,直接进入拥塞避免阶段,
cwnd从12开始线性增长。 - 如果通信过程中发生了超时重传(比收到3个重复ACK更严重的拥塞信号),则TCP会采取更严厉的措施:
ssthresh = cwnd / 2。cwnd被重置为1。- 然后重新开始慢启动过程。
- 连接建立,初始
通过这四个算法的协同工作,TCP能够智能地适应网络状况的变化,在高效利用带宽和保持网络稳定之间取得平衡。