TCP拥塞控制机制详解:从慢启动到快速恢复
TCP拥塞控制机制详解:从慢启动到快速恢复
TCP(传输控制协议)是互联网中最重要的协议之一,它提供了可靠的数据传输服务。为了在网络拥塞时控制数据传输速率,TCP设计了多种拥塞控制算法。本文将详细介绍TCP的拥塞控制机制,包括慢启动、拥塞避免、快速重传和快速恢复等算法。
慢启动算法
慢启动算法的基本思想是:TCP连接建立后,不要急于发送大量数据,而是先探测网络的拥塞程度。拥塞窗口(cwnd)的大小从1开始,每收到一个ACK确认,cwnd就加1。每经过一个往返时间(RTT),cwnd就增加一倍,呈指数增长。如果出现丢包,则cwnd减半,进入拥塞避免阶段。
具体步骤如下:
- TCP连接完成时,初始化cwnd = 1,表示可以发送一个MSS(最大段大小)单位的数据。
- 每当收到一个ACK确认,cwnd就加1。
- 每当过了一个RTT,cwnd就增加一倍。
为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢启动阀值ssthresh(slow start threshold)。当cwnd到达该阀值后,就会进入拥塞避免阶段。
拥塞避免算法
拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送窗口的cwnd加1。一般来说,慢启动阀值ssthresh是65535字节,cwnd到达慢启动阀值后:
- 每收到一个ACK时,cwnd = cwnd + 1/cwnd
- 当每过一个RTT时,cwnd = cwnd + 1
这是一个线性上升的算法,可以避免过快增长导致网络拥塞。
拥塞发生
当网络拥塞发生丢包时,会有两种情况:
- RTO(重传超时)超时重传
- 快速重传
如果是发生了RTO超时重传,就会使用拥塞发生算法:
- 慢启动阀值sshthresh = cwnd /2
- cwnd 重置为 1
- 进入新的慢启动过程
快重传和快恢复
在TCP/IP中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。如果没有FRR,如果数据包丢失了,TCP将会使用定时器来要求传输暂停。有了FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。
快速重传和恢复算法一般同时使用。快速恢复算法认为,还有3个重复ACK收到,说明网络也没那么糟糕,所以没有必要像RTO超时那么强烈。
进入快速恢复之前,cwnd和sshthresh已被更新:
- cwnd = cwnd /2
- sshthresh = cwnd
然后,真正的快速恢复算法如下:
- cwnd = sshthresh + 3
- 重传重复的那几个ACK(即丢失的那几个数据包)
- 如果再收到重复的ACK,那么cwnd = cwnd +1
- 如果收到新数据的ACK后, cwnd = sshthresh。因为收到新数据的ACK,表明恢复过程已经结束,可以再次进入了拥塞避免的算法了。