(2)拥塞避免。拥塞避免与慢启动类似,都是通过拥塞窗口cwnd对源端的发送速率进行限制。不过不同于慢启动算法拥塞窗口cwnd的指数增长,拥塞避免算法的拥塞窗口cwnd每接收到一个确认字符ACK都会增长1/cwnd,也就是呈线性增长。这两种算法都存在问题,慢启动算法后期阶段增长过快容易造成溢出,而拥塞避免算法前期增长过慢导致网络效率不高,因此通常情况下,我们通过设置一个慢启动阈值ssthresh,当拥塞窗口cwnd小于ssthresh时,采用慢启动算法;拥塞窗口cwnd大于ssthresh时,采用拥塞避免算法。
(3)快速重传。快速重传基于的是对分组丢失的判断。源端根据在接收端对分组处理前接受到的重复的确认字符ACK来判断是分组乱序还是分组丢失。当源端接收到一到两个重复的确认字符ACK时,判断分组出现了乱序;如果接收到两个以上的重复确认字符ACK的话,认为出现了分组丢失的现象,即网络出现了拥塞。基于网络正处于拥塞情况下的判断,源端不再等待分组的超时信息,而选择直接重复发送,直到接收端接收到分组。
(4)快速恢复。快速恢复是在完成快速重传之后所采用的算法,为的是减少网络性能的浪费。当快速重传结束后,如果将拥塞窗口相关数据重置,即重新将拥塞窗口cwnd设置为1,重新开始逐步增加拥塞窗口,那么必然会浪费一段时间和网络性能。而快速回复所做的事是将慢启动阈值ssthresh设置为快速重传进行之前拥塞窗口cwnd的一半,然后将cwnd的值也减小到之前的一半。这样一来,拥塞窗口直接以新的cwnd值进入拥塞避免算法,而不需要重新从1逐步增加,有效地增加了网络的吞吐量和节省了时间。[3]
1.2.2 基于中间节点的拥塞控制算法
随着网络快速发展,网络规模迅速增大,网络情况也越来越复杂,单纯地依靠源端窗口流量控制机制已经不足以满足对网络拥塞控制的要求。因此,中间节点的拥塞控制也参与到网络拥塞控制中去,而针对路由器的拥塞控制为队列管理机制。
队列管理机制可以分为被动式队列管理机制和主动式队列管理机制(AQM)。
在网络中最简单且最普遍的队列管理机制就是DropTail,也就是丢尾算法。丢尾算法属于被动式队列管理机制,是基于FIFO(先进先出)排程管理机制的算法。丢尾算法的运作方式为:传送封包的顺序依照封包进入队列的顺序,先进入队列的封包会先传送出去,后进入队列的封包会较晚传送出去;如果队列长度超过了缓存空间,队列最后的封包会被丢弃,直到队列长度不大于缓存空间的大小。
由于丢尾算法仅仅是在满队列的情况下,将队列最后的封包进行丢弃,而不会去考虑封包属于哪一个数据流,因此丢尾算法有着操作简单、易于实现的优势,加之大多数的网络产生网络拥塞的几率较小,因此现今互联网网络主要使用的队列管理机制仍然是丢尾算法。
但是,丢尾算法在网络拥塞状况下的表现却不尽如人意。因为丢尾算法仅在满队列情况下才会丢弃封包,网络拥塞情况下,丢尾算法也会使得队列长期处于充满或接近充满的状态,封包的延时也大为增加,以及造成TCP全局同步化现象,使得网络效率大大降低。
除了丢尾算法以外,还有Random Drop和Drop Front两种被动式队列管理机制,不同于丢尾算法丢弃队列尾部封包,这两种算法在满队列的情况下分别是随机丢弃和丢弃队列最前端的封包。由于这两种算法也同样是在满队列的情况下才触发丢弃封包,因此也同样存在满队列和TCP全局同步化的问题。以上三种队列管理机制都是队列充满之后被迫丢弃封包,因此属于被动式队列管理机制。[4] 网络拥塞控制中丢尾算法与PI算法的分析比较(3):http://www.youerw.com/tongxin/lunwen_18892.html