漏桶算法(Leaky Bucket)是网络世界中
流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。
概述
漏桶可以看作是一个带有常量服务时间的单服务器
队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。
在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。
基本内容
* 漏桶算法强制一个常量的输出速率而不管输入数据流的突发性。当输入空闲时,该算法不执行任何动作;
* 主机在每一个时间片向网络注入一个
数据包,因此产生了一致的
数据流,平滑了突发的流量;
* 当
数据包具有相同尺寸的时候(例如ATM信元),每个时间片传输一个数据包的工作机制没有任何问题。但对于可变包长,这种工作机制可能存在一点问题,此时,最好每个时间片传输固定数目的字节。例如:如果每个时间片传输1024字节,那么一个时间片允许传输一个1024字节的包,两个512字节的包,或者四个 256字节的包;
概念理解
* 到达的
数据包(网络层的PDU)被放置在底部具有漏孔的桶中(数据包缓存);
* 漏桶最多可以排队b个字节,漏桶的这个尺寸受限于有效的系统内存。如果
数据包到达的时候漏桶已经满了,那么数据包应被丢弃;
* 数据包从漏桶中漏出,以常量速率(r字节/秒)注入网络,因此平滑了突发流量。
在
流量整形中还存在另外一个流行的算法:
令牌桶算法(Token Bucket)。有时人们将漏桶算法与
令牌桶算法错误地混淆在一起。而实际上,这两种算法具有截然不同的特性并且为截然不同的目的而使用。它们之间最主要的差别在于:漏桶算法能够强行限制数据的传输速率,而
令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。
在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使某一个单独的流突发到
端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而
令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与
令牌桶算法可以结合起来为
网络流量提供更大的控制。
应用实例
在ATM网络的交换层,漏桶算法可以用来实现CBR业务。当数据流量超过协商速率一段时间后,漏桶(
缓存)将会溢出。这时需要检查每一个信元中的信元丢失优先级(CLP)字段,低优先级的信元将会被丢弃并被原始发送设备重新传输。
优点
*信源可以容易地保证它的通信量符合标准;
*网络可以容易地验证通信量是否符合规范;
*网络可以保证严格的延迟界限,避免一切由
缓冲区溢出引起的丢失;
*由于服务质量根据严格的界限说明,用户能够验证网络是否提供了请求的服务质量。
实现原理
如下图(b)所示,当主机接口向网络中传送数据包时,可采取漏桶算法,使得接口输出数据流的速率恒定。
流量输出漏桶类似漏桶漏水
接下来,详细分解一下漏桶算法在数据包传送过程中的实现原理。
1、队列接收到准备转发的数据包。
2、队列被调度,得到转发机会。由于队列配置了流量整形,队列中的数据包首先进入漏桶中。
3、根据数据包到达漏桶的速率与漏桶的输出速率关系,确定数据包是否被转发。
如果到达速率≤输出速率,则漏桶不起作用。
如果到达速率>输出速率,则需考虑漏桶是否能承担这个瞬间的流量。
1) 若数据包到达的速率-漏桶流出的速率≤配置的漏桶突发速率,则数据包可被不延时的送出。
2) 若数据包到达的速率-漏桶流出的速率>配置的漏桶突发速率,则多余的数据包被存储到漏桶中。暂存在漏桶中的数据包在不超过漏桶容量的情况下延时发出。
3) 若数据包到达的速率-漏桶流出的速率>配置的漏桶突发速率,且数据包的数量已经超过漏桶的容量,则这些数据包将被丢弃。
漏桶算法和令牌桶算法的区别
漏桶算法与令牌桶算法在表面看起来类似,很容易将两者混淆。但事实上,这两者具有截然不同的特性,且为不同的目的而使用。漏桶算法与令牌桶算法的区别在于:
l 漏桶算法能够强行限制数据的传输速率。
l 令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。
需要说明的是:在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法结合起来为网络流量提供更高效的控制。