概念详解
TCP拥塞控制是网络通信中的一个关键机制,它通过动态调整发送数据的速率来避免网络拥塞。以下是TCP拥塞控制的详细概念解释:
-
拥塞窗口(CWND, Congestion Window):
- 定义:发送方在收到接收方的确认(ACK)之前,可以发送的数据量。
- 作用:控制发送方的发送速率,是TCP拥塞控制的核心参数。
-
慢启动阈值(ssthresh, Slow Start Threshold):
- 定义:CWND的一个阈值,用于决定何时从慢启动阶段转换到拥塞避免阶段。
- 作用:平衡网络探测速度和稳定性。
-
- 定义:数据包从发送到接收到确认的时间。
- 作用:用于估算网络延迟,影响重传超时时间的计算。
-
最大报文段大小(MSS, Maximum Segment Size):
- 定义:TCP可以发送的最大数据段的大小。
- 作用:影响CWND的增长和网络效率。
-
慢启动(Slow Start):
- 概念:TCP连接初始阶段,CWND从1个MSS开始,每收到一个ACK就翻倍。
- 目的:快速探测可用带宽,但避免一开始就发送大量数据。
-
拥塞避免(Congestion Avoidance):
- 概念:CWND达到ssthresh后,每个RTT只增加1个MSS。
- 目的:在接近网络容量时,缓慢增加发送速率,避免突然的大幅增加导致拥塞。
-
快速重传(Fast Retransmit):
- 概念:收到3个重复ACK时,立即重传丢失的数据包。
- 目的:快速响应丢包,不等待重传计时器超时。
“3个重复ACK”解释
在TCP(传输控制协议)中,当发送方发送数据给接收方后,接收方会对收到的数据包发送确认(ACK)回给发送方。三个重复的ACK(Acknowledgement),也称为三个冗余ACK或三个重复确认,是指发送方连续收到三个具有相同确认号的ACK。这种情况通常表明在数据传输过程中发生了数据包丢失。
为什么会收到三个重复的ACK?
当接收方收到一个失序的数据包时(即接收到的数据包的序号不是预期的下一个序号),它会立即重复发送上一个连续序列的ACK,以通知发送方某个数据包可能已经丢失。由于TCP是基于累积确认的,这个重复的ACK会确认接收方最后一个按序接收的数据包。如果发送方连续收到三个这样的重复ACK,这通常意味着接收方在期待的数据包之后已经收到了后续的数据包,但期待的那个数据包却没有到达。
三个重复的ACK的作用
在TCP的拥塞控制机制中,收到三个重复的ACK是一个重要的信号,它触发了快速重传(Fast Retransmit)和快速恢复(Fast Recovery)机制:
- 快速重传:发送方不需要等待重传计时器超时,而是立即重传那个被认为丢失的数据包。
- 快速恢复:发送方调整拥塞窗口(CWND)和慢启动阈值(ssthresh),然后继续数据传输,而不是重新开始慢启动过程。
这种机制使TCP能够更快地响应丢包事件,减少等待时间,提高数据传输的效率。
三个重复的ACK的作用在TCP的拥塞控制机制中,收到三个重复的ACK是一个重要的信号,它触发了快速重传(Fast Retransmit)和快速恢复(Fast Recovery)机制:
- 快速重传:发送方不需要等待重传计时器超时,而是立即重传那个被认为丢失的数据包。
- 快速恢复:发送方调整拥塞窗口(CWND)和慢启动阈值(ssthresh),然后继续数据传输,而不是重新开始慢启动过程。
这种机制使TCP能够更快地响应丢包事件,减少等待时间,提高数据传输的效率。
-
快速恢复(Fast Recovery):
- 概念:快速重传后,设置ssthresh为CWND的一半,CWND为ssthresh加3个MSS。
- 目的:在轻微拥塞时保持较高的传输速率。
-
加法增大乘法减小(AIMD, Additive Increase Multiplicative Decrease):
- 概念:拥塞避免阶段线性增加CWND,拥塞时将CWND减半。
- 目的:在保持高效率的同时,快速响应网络拥塞。
-
超时重传(Timeout Retransmission):
- 概念:当重传计时器超时时,重新发送未确认的数据包。
- 作用:处理严重的网络拥塞或大量丢包情况。
-
接收窗口(RWND, Receive Window):
- 定义:接收方能够接收的数据量。
- 作用:与CWND一起决定发送方的发送窗口大小。
-
发送窗口(Send Window):
- 定义:实际可以发送的数据量,是CWND和RWND的最小值。
- 作用:综合考虑网络拥塞和接收方处理能力。
这些概念共同构成了TCP的拥塞控制机制,使TCP能够适应不同的网络条件,在保证可靠传输的同时,尽可能高效地利用网络资源。
拥塞控制阶段
TCP拥塞控制主要包括四个阶段:慢启动、拥塞避免、快速重传和快速恢复。以下是这些阶段的详细解释:
-
慢启动(Slow Start):
- 目的:快速探测网络可用带宽,但避免一开始就发送大量数据。
- 过程:
- 连接建立时,CWND初始化为1个MSS。
- 每收到一个ACK,CWND增加2n个MSS。
- CWND呈指数增长(n):1, 2, 4, 8, 16, …
- 结束条件:
- CWND达到慢启动阈值(ssthresh)
- 出现丢包(超时或收到重复ACK)
- 转换:
- 如果达到ssthresh,进入拥塞避免阶段
- 如果出现丢包,进入快速重传/快速恢复或重新开始慢启动
-
拥塞避免(Congestion Avoidance):
- 目的:在接近网络容量时,缓慢增加发送速率,避免突然的大幅增加导致拥塞。
- 过程:
- 每个RTT,CWND增加1个MSS
- CWND线性增长
- 结束条件:
- 出现丢包(超时或收到重复ACK)
- 转换:
- 如果收到3个重复ACK,进入快速重传/快速恢复
- 如果发生超时,重新进入慢启动
-
快速重传(Fast Retransmit):
- 目的:快速响应丢包,不等待重传计时器超时。
- 触发条件:收到3个重复的ACK
- 过程:
- 立即重传丢失的数据包
- 不等待重传计时器超时
- 转换:直接进入快速恢复阶段
-
快速恢复(Fast Recovery):
- 目的:在轻微拥塞时保持较高的传输速率。
- 过程:
- 将ssthresh设置为当前CWND的一半
- 将CWND设置为新的ssthresh加上3个MSS(对应3个重复ACK)
- 每收到一个重复的ACK,CWND增加1个MSS
- 当收到新的ACK(确认新数据)时,将CWND设置为ssthresh
- 结束条件:
- 收到新的ACK,确认所有未确认的数据
- 发生超时
- 转换:
- 如果收到新的ACK,进入拥塞避免阶段
- 如果发生超时,重新进入慢启动
-
超时处理:
- 当发生超时时(可能在任何阶段):
- 将ssthresh设置为当前CWND的一半
- 将CWND重置为1个MSS
- 重新进入慢启动阶段
- 当发生超时时(可能在任何阶段):
这些阶段共同构成了TCP的拥塞控制机制,使TCP能够适应不同的网络条件。通过动态调整CWND,TCP在保证可靠传输的同时,尽可能高效地利用网络资源,避免网络拥塞。
图引用自《计算机网络自顶向下方法 》图3-52 拥塞窗口的演化
- 在该图中,阈值初始等于8个MSS。在前8个传输回合, Tahoe和Reno采取了相同的动作。拥塞窗口在慢启动阶段以指数速度快速爬升,在第4轮传输时到达了阈值。然后拥塞窗口以线性速度爬升,直到在第8轮传输后出现3个冗余ACK。注意到当该丢包事件发生时,拥塞窗口值为12×MSS。于是 ssthresh的值被设置为0.5 x cwnd=6MSS。在 TCP Reno下,拥塞窗口被设置为cwnd=0.5 x cwnd+3=9MSS,然后线性地增长。在 TCP Tahoe下,拥塞窗口被设置为1个MSS,然后呈指数增长,直至到达 ssthresh值为止,在这个点它开始线性增长。
———————————————————————————————注:Tahoe和Reno都是TCP拥塞控制算法
拥塞控制算法
TCP拥塞控制算法是为了解决网络中的数据传输拥塞问题而设计的一系列算法。它们通过动态调整数据的发送速率来避免网络过载,确保数据传输的高效和稳定。不同的拥塞控制算法在处理网络拥塞的策略和效率上有所不同。以下是几种主要的TCP拥塞控制算法及其区别:
1. TCP Tahoe
- 特点:引入了慢启动、拥塞避免和快速重传机制。
- 缺点:没有快速恢复机制。当发生丢包时,Tahoe会将拥塞窗口(CWND)减少到1个MSS,并重新开始慢启动过程,这可能导致性能下降。
2. TCP Reno
- 特点:在Tahoe的基础上增加了快速恢复机制。
- 优势:当检测到三个重复的ACK时,除了立即重传丢失的数据包外,还会进入快速恢复阶段,减少了超时重传对性能的影响。
- 缺点:在多个数据包丢失的情况下,Reno的性能可能不理想。
3. TCP NewReno
- 特点:改进了Reno的快速恢复机制。
- 优势:能够更好地处理一个RTT内多个数据包丢失的情况。
- 工作方式:在快速恢复阶段,只有当所有丢失的数据包都被确认后,才会退出快速恢复阶段。
4. TCP Vegas
- 特点:基于预测的拥塞避免算法,通过监测数据包的往返时间(RTT)来预测和避免拥塞。
- 优势:能够在拥塞发生之前调整发送速率,从而避免丢包,提高网络利用率。
- 缺点:在高带宽延迟积(BDP)网络中,Vegas的性能可能不如基于丢包的算法。
5. TCP BBR (Bottleneck Bandwidth and RTT)
- 特点:基于带宽和RTT的拥塞控制算法,旨在最大化网络的吞吐量同时最小化延迟。
- 优势:不依赖于丢包作为拥塞的信号,能够更有效地利用可用带宽,减少排队延迟。
- 工作方式:周期性地测量最小RTT和最大带宽,据此调整发送速率。
总结
不同的TCP拥塞控制算法在设计理念、性能优化方面有所不同。Tahoe和Reno侧重于通过丢包信号来调整拥塞窗口大小,而Vegas和BBR则试图通过预测和测量网络状态来避免拥塞的发生。随着网络环境的不断变化和发展,新的拥塞控制算法不断被提出,以适应不同的网络条件和应用需求。
Reno 图示
+----------------+ 超时 +----------------+ CWND>=ssthresh +-------------------+ 3个重复ACK +-------------------+
| |------->| |----------------->| |------------>| |
| 慢启动 | | 慢启动 | | 拥塞避免 | | 快速重传 |
| (Slow Start) |<-------| (Slow Start) |<-----------------| (Congestion | | (Fast Retransmit) |
| | 收到新ACK | | 超时/收到新ACK | Avoidance) | | |
+----------------+ +----------------+ +--------+----------+ +--------+----------+
^ | |
| | |
+-----------------------------------------------------------------+ |
收到新的ACK/超时 |
|
|
v
+-------------------+
| |
| 快速恢复 |
| (Fast Recovery) |
| |
+-------------------+
|
| 收到新的ACK
v
+-------------------+
| |
| 拥塞避免 |
| (Congestion |
| Avoidance) |
| |
+-------------------+
状态流转条件详解:
-
慢启动(Slow Start):
- 超时:如果在慢启动阶段发生超时,TCP将ssthresh设置为当前CWND的一半,并将CWND重置为1 MSS,继续留在慢启动阶段。
- CWND>=ssthresh:当CWND达到或超过慢启动阈值(ssthresh)时,进入拥塞避免阶段。
-
拥塞避免(Congestion Avoidance):
- 超时/收到新ACK:如果在拥塞避免阶段发生超时,或者收到新的ACK,TCP将ssthresh设置为当前CWND的一半,并将CWND重置为1 MSS,回到慢启动阶段。
- 3个重复ACK:如果收到三个重复的ACK,进入快速重传阶段。
-
快速重传(Fast Retransmit):
- 触发条件:收到三个重复的ACK时,立即重传丢失的数据包,然后进入快速恢复阶段。
-
快速恢复(Fast Recovery):
- 收到新的ACK:在快速恢复阶段,当收到新的ACK确认新的数据传输成功时,TCP将CWND设置为ssthresh的大小,然后进入拥塞避免阶段。
- 超时或继续收到重复ACK:如果在快速恢复阶段再次发生超时,或者继续收到重复的ACK,TCP将根据具体实现可能重新进入慢启动或继续快速恢复的调整逻辑。
这个图示和说明提供了TCP拥塞控制机制中各个阶段的全量视图,包括快速重传和快速恢复阶段的正确位置及其与其他状态之间的流转条件。希望这次的解释能够清晰地展示TCP拥塞控制的完整流程。