- 慢开始
- 拥塞避免
- 快重传
- 快恢复
首先咱们须要知道一个概念就是拥塞窗口cwnd和慢开始门限ssthresh和传输轮次。算法
慢开始:网络
最开始发送数据时,因为不清楚网络的负载状况,因此若是当即把大量数据本身注入网络,那么就可能引起网络拥塞。
所以须要慢慢注入,即由小到大逐渐增大发送窗口
通过一个RTT时间,拥塞窗口翻一倍blog可是这个慢并非指由小到大的速率慢,而是指最开始为1,而后再逐渐增长。方法
以下图:im
最开始的这一段即为慢开始,等到增长到16时,碰到了慢开始门限。而后就用到了拥塞避免算法数据
由于慢开始的增加速率是指数级增加,速度很快,因此须要用慢开始门限加以限制。慢开始门限的用法:图表
- 当拥塞窗口 < 慢开始门限时,使用上述的慢开始算法
- 当拥塞窗口 > 慢开始门限时,中止使用慢开始算法而改用拥塞避免算法
- 当拥塞窗口 = 慢开始门限时,便可以使用慢开始算法也可使用拥塞避免算法
拥塞避免算法:db
这个地方是让拥塞窗口缓慢增长,没通过一个往返时间RTT,就把拥塞窗口加1,而不是成倍增长。img
所以在拥塞避免阶段就有“加法增大”的特色,拥塞窗口按线性规律缓慢增加。注入
以下图:
红色这一部分就是拥塞避免算法,每次拥塞窗口仅仅增长一个大小,当增长到必定大小时,就碰到了网络超时,即出现网络拥塞。
当出现阻塞以后,会调整慢开始门限ssthresh以及拥塞窗口的值:
新的慢开始门限的值:ssthresh=cwnd/2。
如上图所示,此时cwnd已经增加到了24大小,因此此时ssthresh=24/2=12。拥塞窗口则再次变为1..
调整后的运行过程以下图所示:
如上图所示,当在24出现阻塞后,将cwnd变为了1,将ssthresh变为了12
而后在12以前依旧是进行慢开始算法,在12以后进行拥塞避免算法,直到16发生了3个ACK状况(这个后面讲)又一次出现了网络阻塞。
上面三步就展现了普通状况下传输的方法以及调整
从上面可知,在16的时候又一次出现了拥塞,而此次拥塞出现的缘由就是这3个ACK。这个也就是快重传。
快重传:
当发生包文丢失时,为了让发送方尽早知道发生了个别报文段的丢失,所以当即发送确认,怎样让发送方知道是哪一个报文段丢失的方法就是连读发送三个确认。
以下图所示:
当丢失某个数据包时,连续发送三个确认,则发送方就知道某个包丢失了,而后当即启动快重传。
快恢复:
发送方知道如今只是丢失了个别的报文段。因而不执行慢开始,而是执行快恢复算法。
新的慢开始门限的值:ssthresh=cwnd/2。
如上图所示,此时新的cwnd已经增加到了16大小,因此此时ssthresh=16/2=8。拥塞窗口不是变为1,而是和门限值同样,此时cwnd=ssthresh=8,而后开始执行拥塞避免算法
以下图所示:
如上图是怎样判断出现了丢包现象,以及出现丢包状况下进行快恢复的流程。
在拥塞避免阶段,拥塞窗口时按照线性规律增大的,这一般称为"加法增大"
而一旦出现超时或者3个重复的确认,就要把门限变为当前的一半,这个称为”乘法减少“
最后一张流程图表示TCP的拥塞控制流程图
只要上面几张图都可以理解,大概就知道了拥塞避免控制的方法。