TCP的拥塞控制机制

咱们知道TCP经过一个定时器(timer)采样了RTT并计算RTO,可是,若是网络上的延时忽然增长,那么,TCP对这个事作出的应对只有重传数据,然而重传会致使网络的负担更重,因而会致使更大的延迟以及更多的丢包,这就致使了恶性循环,最终造成“网络风暴” —— TCP的拥塞控制机制就是用于应对这种状况。
首先须要了解一个概念,为了在发送端调节所要发送的数据量,定义了一个“拥塞窗口”(Congestion Window),在发送数据时,将拥塞窗口的大小与接收端ack的窗口大小作比较,取较小者做为发送数据量的上限。
拥塞控制主要是四个算法:算法

1.慢启动:意思是刚刚加入网络的链接,一点一点地提速,不要一上来就把路占满。
链接建好的开始先初始化cwnd = 1,代表能够传一个MSS大小的数据。
每当收到一个ACK,cwnd++; 呈线性上升
每当过了一个RTT,cwnd = cwnd*2; 呈指数让升
阈值ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”
2.拥塞避免:当拥塞窗口 cwnd 达到一个阈值时,窗口大小再也不呈指数上升,而是以线性上升,避免增加过快致使网络拥塞。
每当收到一个ACK,cwnd = cwnd + 1/cwnd
每当过了一个RTT,cwnd = cwnd + 1
拥塞发生:当发生丢包进行数据包重传时,表示网络已经拥塞。分两种状况进行处理:
等到RTO超时,重传数据包
sshthresh = cwnd /2
cwnd 重置为 1
3.进入慢启动过程
在收到3个duplicate ACK时就开启重传,而不用等到RTO超时
sshthresh = cwnd = cwnd /2
进入快速恢复算法——Fast Recovery
4.快速恢复:至少收到了3个Duplicated Acks,说明网络也不那么糟糕,能够快速恢复。
cwnd = sshthresh + 3 * MSS (3的意思是确认有3个数据包被收到了)
重传Duplicated ACKs指定的数据包
若是再收到 duplicated Acks,那么cwnd = cwnd +1
若是收到了新的Ack,那么,cwnd = sshthresh ,而后就进入了拥塞避免的算法了。网络