目录
TCP的拥塞控制
拥塞控制的一般原理
什么是拥塞:在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,叫做拥塞。
拥塞控制:就是防止过多的数据注入到网络中,这样可以使网络中的路由器和链路不致过载,是个全局性过程。
流量控制:指点对点通信量的控制,是个端到端的问题。流量控制控制所要做的就是抑制发送端发送数据的速率,以便接收端来得及接收。
拥塞控制和流量控制:之所以两者常常被弄混,是因为某些拥塞控制算法是向发送端发送报文,并告诉发送端,网络以及经出现麻烦,必须放慢发送速率,这点有何流量控制很相似。
![](https://i-blog.csdnimg.cn/blog_migrate/d0e121c47fdc3c94730e6fb480b6987d.jpeg)
死锁:当提供的负载增大到某一数值是,网络的吞吐量就会下降到零,网络无法正常工作。这就是所谓的死锁。
从大方面可以分为开环控制和闭环控制
开环控制:在设计网络之时事先将有关发生拥塞的因素考虑到,力求网络在工作时不产生拥塞。一旦系统运行,就不能中途改正。
闭环控制:是基于返回环路的概念,使用拥塞的信息来进行调整网络
几种拥塞控制方法
四种拥塞控制算法:慢开始、拥塞避免、快重传、快恢复
1、慢开始和拥塞避免
拥塞窗口:发送方维持一个叫做拥塞窗口cwnd的状态变量,窗口大小取决于拥塞大小。
发送方控制拥塞窗口的原则是:没有拥塞,窗口增大。出现拥塞窗口减小,以减少注入到网络中的分组数。
如何知道发生拥塞:当发送方没有按时收到确认报文,那么就知道网络发生了拥堵。
慢开始算法:
慢开始的“慢”指的是,由小到大逐渐增大拥塞窗口而不是一次性的注入,初始cwnd=1(这里表示的是报文段的个数,而不是真正传输时使用的字节流)
算法原理:
1、开始时发设置送方cwnd=1,发送第一段报文段M1,如果发送方收到确认M1,那么此时增大cwnd=2,并发送M2,M3
2、发送方每收到一个确认报文段,cwnd+1(缺失重传的确认不包括在内)
3、也就是说,每经过一个传输伦次(RTT时间),拥塞窗口cwnd都会加倍。
但是,为了防止拥塞窗口cwnd增长过大而引起网络拥塞,设置一个慢开始门限ssthresh。
1.当cwnd<ssthresh,使用上述的慢开始算法
2.当cwnd>ssthresh,停止使用慢开始,使用拥塞避免算法
3.当cwnd==ssthresh,两者都可以使用
拥塞避免算法:
拥塞避免算法的思路是让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd+1,而不是加倍。拥塞窗口cwnd就按线性缓慢增大。
那么当发现拥塞了cwnd又该怎样去调整呢?
当TCP初始化时,我们假设cwnd=1、ssthresh为16。当网络发生拥塞时(TCP认为网络拥塞的主要依据是它重传了一个报文段。因为TCP对每一个报文段都有一个定时器,称为重传定时器(RTO),当RTO超时且还没有得到数据确认,那么TCP就会对该报文段进行重传)会有以下操作:
1、把ssthresh降低为cwnd值的一半12(乘法减小)。
2、把cwnd重新设置为1。
3、重新进入慢启动过程(加法增长)。乘法减小:是指不论在慢开始阶段还是拥塞避免阶段,只要出现超时,就把ssthresh减半。也就是说,我们更新cwnd=1 、ssthresh=12,之后再重新执行之前的两个算法。
加法增大:指的是执行拥塞避免算法之后,cwnd线性的进行增长,防止网络过早出现拥塞。
2、快重传和快恢复
快重传:当接收方收到了一个失序的报文段后就立即发出重复确认,而不要等待自己发送数据时才捎带确认。假设M3没有收到,紧接着M4,M5,M6又发送了(由于没有按照顺序的M3那么M4就是失序报文段),接收方需要重复发送对M2的确认(让对方知道M3还没来)此时接收方一共连续给发送方反馈了4个M2的确认报文。其中三个是重复确认保温,那么快重传规定,发送方只要连续收到3个重复确认,立即重传对方尚未收到的M3,不必等待重传计时器。
快恢复:就是收到3个相同的ACK,此时进行快速重传,快速重传做的事情有:
1、把ssthresh设置为cwnd的一半
2、把cwnd再设置为ssthresh的值(具体实现有些为ssthresh+3)
3、重新进入拥塞避免阶段。