拥塞控制概念
网络拥塞:当某个阶段,网络中涌入大量数据包时,可能会导致路由器的转发不及时,大量数据包会陆续填满路由器的缓冲区,缓冲区满了,再涌入数据时就会造成数据的丢失,这时网络发生了拥塞
发送网络拥塞时,如果继续发送大量数据包,可能会导致数据包丢失,这时TCP就会触发重传机制,这样会使网络负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环
拥塞控制:当发送方感知到网络发送拥塞时,发送方要减缓向网络中注入数据的速度,来减缓网络拥塞
拥塞窗口cwnd
拥塞窗口cwnd是发送方维护的一个状态变量,他会根据网络的拥塞程度动态变化;
发送窗口值swnd=min(cwnd,rwnd)
变化规律:
1.没有拥塞,增大
2.有拥塞,减小
什么时候判定网络出现拥塞
当发送方在规定时间内没有收到ACK报文,发生了超时重传,就会认为网络出现拥塞
网络延时是由什么造成的?
数据到达路由器时,路由器需要对数据进行拆包解析,决定把数据转发到哪个路由器上
慢启动算法
发送方每收到一个ACK,拥塞窗口cwnd的大小就会加1
慢启动:每经过一个传输轮次RTT,cwnd成指数型增长
1.当cwnd<ssthresh(慢启动门限slow start threshold),启用慢启动算法
2.当cwnd>=ssthresh时,启动拥塞避免算法
拥塞避免算法
拥塞避免算法:每经过一个传输轮次,cwnd+1;
所以得出,拥塞算法就是将原本慢启动算法的指数增长变成线性增长,使增长速度缓慢;
慢慢增长后,网络就会进入拥塞状态,于是会出现丢包现象,这时就需要对丢包进行重传,于是触发【拥塞发生算法】
拥塞发生
触发条件:当经过慢启动和拥塞避免算法,cwnd慢慢增长,网络就会进入拥塞状态,于是会出现丢包现象,这时就需要对丢包进行重传,于是触发【拥塞发生算法】
1.超时重传触发:
更新慢启动阈值:ssthresh=1/2*cwnd(当前窗口的一半) ,将当前窗口cwnd=1,然后执行慢启动算法,这样的话我们发送方可以在短时间内大量减小向网络中注入的速度,又可以尽快的将发送速度恢复到一个比较合适的值
2.快重传触发:
发送快重传时,TCP认为当前网络状态没那么糟,更新慢启动阈值ssthresh=1/2*cwnd,将当前窗口大小设置为慢启动阈值cwnd=ssthresh,然后执行快恢复算法;
快恢复算法: 将当前窗口大小设置为cwnd+3,发送方每收到一个冗余的ACK,cwnd+1.直到收到一个好的ACK,cwnd重新设置为慢启动的门限值,执行拥塞避免算法
快恢复算法
触发机制:快重传与快恢复算法一般同时使用,快恢复算法认为你还能收到3个重复ACK说明网络也不那么糟糕,只丢了一小部分;
在进入快恢复前,拥塞发送算法已更新cwnd和ssthresh:
Cwnd=cwnd的一半,ssthresh=cwnd;
开始启动快恢复算法:
1.Cwnd=ssthresh+3(3指的是有3个数据包被收到了)
2.重传丢失的数据包
3.如果再收到重复的ACK,那么cwnd+1
4.如果收到新数据的ACK后,将cwnd设置回cwnd=ssthresh,因为该ACK确认了新的数据,说明之前没收到ACK回复的数据已收到,该恢复过程可以结束了,可以恢复到之前状态,即再次进入拥塞避免状态
发送方允许发送的字节
流量控制中16位通告窗口大小awnd
发送方允许发送的字节数=min(awnd,cwnd)