网络拥塞控制(二) 拥塞的概述
什么是拥塞?
当网络中存在过多的报文时,网络的性能就会相应下降,这种现象就被成为拥塞。Copy一篇论文中的话来解释下:
如上图,当负载较小时,吞吐量的增长与负载相比基本呈线性关系,延时(即第二个图的纵坐标:响应时间)增长缓慢,但是当负载超过Knee点后,吞吐量增长十分缓慢,但是延迟却增长较快,当负载超过Cliff之后,吞吐量就急剧下降,延迟相应急剧上升。Cliff点也就是网络的最大负载,一旦超过网络的整体性能就大打折扣。而负载在Knee附近时网络的使用效率是最高的,此时吞吐量高,响应时间也比较快。拥塞控制的思想就是网络中的节点采取一定的措施来保证尽量使得网络的负载保持在Knee位置,需要避免拥塞的发生或者对拥塞的发生作出反应,使其能够再次恢复到Knee位置,从而保持网络的整体性能最大化。
与上面介绍的TCP的流控比较下就可以发现,流控主要是考虑接收端,不要发送过快,超过对方的接收能力,而拥塞控制则是要考虑到整个网络环境,使其负载不能超过网络的最大承受能力。显然拥塞发生的原因是因为“需求”大于了“供给”,网络中的有限资源被多用户共享使用,网络本身无法根据资源的利用情况来限制某些用户,并且随着目前互联网的发展,上网的用户和应用的数量也随之增长,这样,如果不采取某种措施来协调资源的使用,那么拥塞的发生就是必然的。
一般来说,拥塞控制算法包括拥塞避免和拥塞控制两个方面,拥塞避免是一种预防机制,也就是说避免网络进入拥塞状态,尽量使得网络保持在高吞吐量和低延迟的情况下。对应的拥塞控制就是恢复机制了,它使得网络一旦发生了拥塞,需要从拥塞状态中恢复出来,重新进入高吞吐量和低延迟的状态。看起来比较容易,然后事情不是想象中的那么简单。
看看为什么拥塞控制是一件比较困难的事情尤其是要做到很到的拥塞控制时让网络的利用率达到最大化。
首先是互联网的模型,目前互联网采用的是报文交换(packet-switched)网络,比起之前的电路交换相比,报文交换大大提高了网络的资源利用率(关于这一点,看看IP电话就知道为什么IP电话便宜了)。但是报文交换网络使得整个网络变为分布式的,在网络中间没有连接的概念,造成了每个节点所获得的信息不是很完整,而不完整的信息要完成比较好的拥塞控制,那是非常困难的。
其次就是网络环境是非常复杂的,互联网上各处的网络性能有很大的差异,比如说网通到电信的跨运营商网络丢包率就非常大,网络中间还有瓶颈链路,因此算法必须要有很好的适应性才行,处理报文丢失、乱序等情况。
第三就是算法的性能要求,整个主要包括公平性、效率、稳定性和收敛性等各个方面。公平性主要指在带宽占用方面,不能一条连接占据了大部分带宽,而让其他的连接无法跑应用。效率指的是在带宽充足的时候要能够充分利用带宽,避免带宽的浪费。稳定性则是要能够长久的运行,而不能一段时间后就出现无法上面所说的一些性能要求。收敛性性则是要对网络的动态变化快速做出响应,从而调整整个网络重新达到平衡状态。
第四点需要考虑到就是算法的开销,拥塞算法必须尽量地减少附加的网络流量,尤其是在拥塞恢复的时候。这就要求各个节点间的通信要尽可能少,这个要求使得算法设计变得十分困难。同时算法还必须网络节点的计算复杂性,否则就会降低网络节点对其它数据包的处理能力。
下一节:TCP拥塞控制机制