拥塞控制的一般原理
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变换,叫做拥塞
拥塞控制和流量控制的区别:
拥塞控制往往是一种全局的,防止过多的数据注入到网络之中,而TCP连接的端点只要不能收到对方的确认信息,猜想在网络中发生了拥塞,但并不知道发生在何处,因此,流量控制往往指点对点通信量的控制,是端到端的问题。
当提供的负载继续增大到某一数值时,网络的吞吐量就下降到零,网络无法工作,产生所谓的死锁。
拥塞控制可以分为开环控制和闭环控制
1.开环控制,在设计网络时把因素考虑到
2.闭环控制,基于反馈环路,使用拥塞的信息来进行调整网络
---------------------------------------------------------------------------------------------------------------------
几种拥塞控制方法
总共四种:慢开始,拥塞避免,快重传,快恢复
1.慢开始和拥塞避免
发送方维持一个叫做拥塞窗口cwnd,根据网络来进行动态的调整大小,网络拥塞的时候,路由器会丢弃报文,当发送方没有按时收到确认报文,那么就知道网络发生了拥堵。
现在结合拥塞窗口cwnd的变化来看一下上述两个方法
慢开始的“慢”指的是,初始cwnd=1(此时表示的是报文段的个数,而不是真正传输时使用的字节流)
我们来简单的论一下这个过程:
1.开始时发送方cwnd=1,发送报文段M1,如果收到确认M1,那么此时增大cwnd=2,并发送M2,M3
2.要注意,发送方每收到一个确认报文段,cwnd+1(不包括缺失重传的确认)
也就是说,每经过一个传输伦次(RTT时间),cwnd加倍。
但是,为了防止拥塞窗口cwnd增长过大而引起网络拥塞,设置一个慢开始门限ssthresh。
1.当cwnd<ssthresh,使用上述的慢开始算法
2.当cwnd>ssthresh,停止使用慢开始,使用拥塞避免算法
3.当cwnd==ssthresh,两者都可以使用
那么理所当然的,现在我们要来看一下拥塞避免算法。
拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd+1,而不是加倍(也就是收到两个,四个确认,仍然+1),这样cwnd就按线性增大
此时我们假设ssthresh为16,也就是超过这个值就要转化为拥塞避免算法,并且假设到24的时候,网络出现拥堵。
此时我们注意两个词:
1.乘法减小:也就是说,当拥塞避免算法增长到24之后,我们更新ssthresh=24/2=12,之后再重新执行之前的两个算法。乘法减小,指的就是ssthresh减半
2.加法增大:指的是,执行拥塞避免算法之后,cwnd线性的进行增长,防止很快就遇到网络拥塞状态
2.快重传和快恢复
快重传的核心:
当接收方收到了一个失序的报文,马上报告给发送方,我没收到,赶紧重传(天下武功唯快不破),加入M2收到了,M3没有收到,之后的M4,M5,M6又发送了,此时接收方一共连续给发送方反馈了4个M2确认报文。那么快重传规定,发送方只要连续收到3个重复确认,立即重传对方发来的M3
那么我们再来看一下快恢复
两个要点:
1.当发送方连续收到三个重复确认,执行乘法减小,ssthresh减半
2.由于发送方可能认为网络现在没有拥塞,因此与慢开始不同,把cwnd值设置为ssthresh减半之后的值,然后执行拥塞避免算法,线性增大cwnd
其实呢,对于接收方也是用限额的,有一个rwnd,也就是接收窗口,那么实际上,发送方窗口的上限=min(rwnd,cwnd)
大哥们,我也就是回顾总结一下本科时《计算机网络》这里所说,如有不周,欢迎指正