TCP拥塞控制算法

TCP报文

在这里插入图片描述
rwnd(Receive Window)接受窗口:如果发送方传输的数据量超过了接收方的处理能力,那么接收方会出现丢包。为了避免出现此类问题,流量控制要求数据传输双方在每次交互时声明各自的接收窗口「rwnd」大小,用来表示自己最大能保存多少数据
cwnd(congetion Window)拥塞窗口:接受窗口只能表示个体自己的网络情况,不能表示网络路由器等设备的状况,所以引入了拥塞窗口的概念。为了避免过载网络的问题,慢启动引入了拥塞窗口「cwnd」的概念,用来表示发送方在得到接收方确认前,最大允许传输的未经确认的数据。「cwnd」同「rwnd」相比不同的是:它只是发送方的一个内部参数,无需通知给接收方,其初始值往往比较小,然后随着数据包被接收方确认,窗口成倍扩大.

基本概念

MSS(对最大报文长度):
rwnd(接收窗口):
cwnd(拥塞窗口):通常初始化为MSS较小的值,慢启动阶段每过一个RTT就会翻一番
ssthresh(slow start threshold慢启动门限,ssthresh默认为65535个字节。)

其中慢启动思想主要是一种探测一下网路的拥塞程度,就是不要一开始就发送大量的数据,也就是说当拥塞窗口小于阈值时,有小到大逐渐增加(指数)拥塞窗口的大小。
直到cwind == ssthress开始执行拥塞避免算法,拥塞窗口cwnd按线性规律增长。
当cwnd<ssthresh时,使用慢开始算法(指数增长
当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
当cwnd>ssthresh时,改用拥塞避免算法。(线性增长,每经过一个RTT,cwnd就增加一个的MSS,ssthresh也会跟着变)
何时结束线性增长??
当出现超时或者收到3个相同的ACK即丢包事件出现就会结束,迁移到慢启动状态或者直接降低cwnd和慢启动阀值进入拥塞避免状态。
如何迁移:
1.超时重传时(Tahoc):cwnd设置为1,慢启动阀值ssthresh=ssthresh/2
重新指数增长,线性增长。。
2:出现冗余ACK(Reno):认为当出现冗余ack而重传下一个报文段的时候严格上不算是拥塞导致的。所以不必要让cwnd重新从1开始,把cwnd和慢启动阀值都改为原来的一半+收到的冗余ACK数量;直接进入拥塞避免状态

直接进入拥塞避免
在这里插入图片描述

慢启动

在慢启动的过程中,随着「cwnd」的增加,可能会出现网络过载,其外在表现就是丢包,一旦出现此类问题,「cwnd」的大小会迅速衰减,以便网络能够缓过来。
在这里插入图片描述

拥塞避免

从慢启动的介绍中,我们能看到,发送方通过对「cwnd」大小的控制,能够避免网络过载,在此过程中,丢包与其说是一个网络问题,倒不如说是一种反馈机制,通过它我们可以感知到发生了网络拥塞,进而调整数据传输策略,实际上,这里还有一个慢启动阈值「ssthresh」的概念,如果「cwnd」小于「ssthresh」,那么表示在慢启动阶段;如果「cwnd」大于「ssthresh」,那么表示在拥塞避免阶段,此时「cwnd」不再像慢启动阶段那样呈指数级整整,而是趋向于线性增长,以期避免网络拥塞,此阶段有多种算法实现,通常保持缺省即可,这里就不一一说明了,有兴趣的读者可以自行查阅。

如何调节一个合理的cwnd参考

快重传

一般来说,TCP拥塞控制默认认为网络丢包是由于网络拥塞导致的,所以一般的TCP拥塞控制算法以丢包为网络进入拥塞状态的信号。对于丢包有两种判定方式,一种是超时重传RTO[Retransmission Timeout]超时,另一个是收到三个重复确认ACK。
 超时重传是TCP协议保证数据可靠性的一个重要机制,其原理是在发送一个数据以后就开启一个计时器,在一定时间内如果没有得到发送数据报的ACK报文,那么就重新发送数据,直到发送成功为止。 但是如果发送端接收到3个以上的重复ACK,TCP就意识到数据发生丢失,需要重传。这个机制不需要等到重传定时器超时,所以叫做快速重传,而快速重传后没有使用慢启动算法,而是拥塞避免算法,所以这又叫做快速恢复算法。
 ## 快恢复
三个ACK收到之后,会进行快重传,快重传之后会进行快恢复

参考