更新时间:2022-09-23 10:21
在计算机网络中的链路容量(即常说的带宽)、交换节点的缓冲和处理机等,都是网络资源。在谋段时间里,若对网络中的某一资源的需求部分超过了该资源所能提供的可用部分,网络的特性就会变坏, 这种 情况就叫做拥塞。
简单的举例说:现在有1000台接入网络的机器同时向一台提供网络服务的计算机发出请求,而该计算机只能在该时段向一台设备提供服务,那么999台将会堵塞在服务之外,成功请求服务的计算机甚至可能都无法得到正常的服务。这时就产生了拥塞。
而常常有人这样的认为:增多网络资源提供方式或者增大可用资源的提供限度,其实这种方法这不然,这是因为网络拥塞是一个非常复杂的问题,简单的采用这些方法,根本不能解决问题,有时反而会使网络的性能更差。
问题复杂在拥塞往往有多方面因素引起的。如结点容量太小时,达到结点容量因为没有存储空间而不得不放弃;如果这时扩展容量到非常大。凡到达的均可在这缓存队列中,不收限制时。而输入链路和处理机的速度并未提高时,这样让然是长长的数据排列这,多整个系统并为提高,却浪费了资源,这些输出的数据却还需要不断重传,这将不断增加网络负载,加载拥塞的程度。
拥塞常常是问题复杂化,可能因为拥塞而瘫痪,如:简单文件传送,在前一批数据包被阻塞时,后来的数据一直处于阻塞状态,在传输源端泽不断发生数据,这是数据包不断积累在链路上,是整个系统一直处于接受状态但却没有接受到正确的数据,而是丢失在路上,越来越多的数据被丢失和不断的输入就会使系统瘫痪。
数据传输信息时代必然需求,高速传输、实时高效传输则必须首要解决的问题就是拥塞,而拥塞管理就显的尤为重要了。
从理论上讲,按上述方程式就能解决拥塞问题,但是往往拥塞管理是一个动态的,当前网络正朝着高速的方向发展。解决问题也就越复杂,这样是这方面管理的趋势。
这方面的专业名词:
当网络的吞吐量明显的小于理想的吞吐量时,网络进入轻度拥塞。
死锁中的一种:即互相占有对方需要的资源而造成的死锁。
从大的方面来看,分为两种:开环控制和闭环控制方式。 开环方法:就是开始设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞,一旦系统运行起来就不在进行修正了。设计难度较大,闭环方法是基于反馈环路的概念,具体方法:
①检测网络系统以便拥塞在何时、何处发生。
②将拥塞信息传输到可采取行动的地方。
③调整网络系统的运行以解决出现的问题。
有许多的 方法可以检测的网络的拥塞。主要的指标有:缺少的缓存空间和被丢失的分组的百分比;平均队列长度;超时传输的分组数;平均时延;分组时延的标准差等等。
另一种管理方式是在路由器的分组保留一个bit的空间,来判断网络是否拥塞,这种方式能够有效的控制系统产生的震荡。
拥塞管理是指网络在发生拥塞时,转发设备对数据报文流进行管理和控制,以满足业务的服务质量要求。当网络接口没有发生拥塞时,数据报文进入接口时就立即被发送出去。当数据报文到达设备的速度大于其离开设备速度时,就会发生拥塞。接口的拥塞管理需要把到达的报文按优先级分成不同的类,送入优先级不同的队列,队列调度处理对不同优先级的报文进行区别处理。不同的队列算法用来解决不同的问题,并产生不同的效果。常用的队列技术有FIFO、PQ、CQ、WFQ、CBWFQ等,下文逐一介绍这些常用队列技术的基本原理。
1. FIFO(First In First Out,先进先出)队列
2.PQ(Priority Queuing,优先队列)
3. CQ(Custom Queuing,定制队列)
4. WFQ(Weighted Fair Queuing,加权公平队列)
5. CBWFQ(Class Based Weighted Fair Queuing,基于类的加权公平队列)
由于内存资源的有限,按照传统的处理方法,当队列的长度达到规定的最大长度时,所有到来的报文都被丢弃。对于TCP报文,如果大量的报文被丢弃,将造成TCP超时,从而引发TCP的慢启动和拥塞避免机制,使TCP减少报文的发送。当队列同时丢弃多个TCP连接的报文时,将造成多个TCP连接同时进入慢启动和拥塞避免,称之为:TCP全局同步。这样多个TCP连接发向队列的报文将同时减少,使得发向队列的报文的量不及线路发送的速度,减少了线路带宽的利用。并且,发向队列的报文的流量总是忽大忽小,使线路的上的流量总在极少和饱满之间波动。
为了避免这种情况的发生,队列可以采用加权随机早期检测WRED(Weighted Random Early Detection)的报文丢弃策略(WRED与RED的区别在于前者引入IP优先权,DSCP值,和MPLS EXP来区别丢弃策略)。采用WRED时,用户可以设定队列的阈值(threshold)。当队列的长度小于低阈值时,不丢弃报文;当队列的长度在低阈值和高阈
值之间时,WRED开始随机丢弃报文(队列的长度越长,丢弃的概率越高);当队列的长度大于高阈值时,丢弃所有的报文。
设置一个变的阈值-Threshold 。
在丢包事件发生时,阈值Threshold设置为发生丢包以前的CongWin的一半。