TCP拥塞控制有四种算法:慢开始,拥塞避免,快重传,快恢复。
1.慢开始:
如图所示,拥塞窗口初始值为cwnd=1,慢开始门限值初始值为ssthresh=16。慢开始过程为:拥塞窗口初始值为1,发送端先发送一个数据包,如果该数据包没有没有出现超时重传,拥塞窗口cwnd翻倍,即变为2X1=2,发送端继续发送一个数据包,数据包依旧没有超时,拥塞窗口cwnd变为2X2=4,以此类推,cwnd的变化依次为:cwnd=4X2=8,cwnd=8X2=16。如果cwnd再继续翻倍,则cwnd大于慢开始门限值ssthresh=16,此时慢开始结束,进入拥塞避免阶段。因此,慢开始可以总结为:以拥塞窗口cwnd=1为初始值,如果发送的包没有超时重传,则cwnd每次翻倍,直到cwnd>ssthresh,慢开始结束,拥塞避免开始。
2.拥塞避免
判断网络拥塞的依据是:发送的数据包出现超时重传。
当cwnd>ssthresh时,采用拥塞避免算法控制。拥塞避免的过程为:cwnd=16,发送一个数据包,没有超时重传,cwnd=cwnd+1=16+1=17,再次发送数据包,依旧没有超时,cwnd=cwnd+1=17+1=18,以此类推:cwnd=19,cwnd=20,cwnd=21,cwnd=22...,假设在cwnd=24时,发送的数据包出现超时重传,说明了网络出现拥塞,拥塞避免的算法为:把cwnd设置为1,ssthresh设置为cwnd/2=24/2=12,这样又以慢开始传输,当拥塞窗口大小超过慢开始门限,又采用拥塞避免控制。
3.快重传
如图所示:
如果接收方收不到数据包是因为数据包丢失,而不是网络拥塞,如果把cwnd设置为1,ssthresh设置为原来cwnd的一半,那网络传输的效率就会低很多。针对这一问题的解决方法是采用快重传算法,其核心是:如果接收方连续三次发送相同的确认包,发送方收到三次确认包后就认为该包丢失,于是重新发送丢失的包给接收端。
4.快恢复
当发送方连续收到三个重复确认时,把慢开始门限设置为cwnd/2=24/2=12,拥塞窗口的值设置为慢开始门限减半后的值,即cwnd=12,然后开始执行拥塞避免算法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。