网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

漏桶算法

更新时间:2026年03月27日   作者:spoto   标签(Tag):

“漏桶算法”是一种用于网络中的方法,它用于调节数据的传输速率。即使数据以突发的方式到达时,该算法也能保持稳定的发送速度,从而防止网络出现过载现象。

  • 传入的数据包在传输之前会被存储在一个固定大小的缓冲区中。
  • 数据以恒定的速率被传输到网络中。
  • 当缓冲区已满后,到达的数据包将被丢弃。
  • 有助于路由器与交换机以可控的方式使用带宽。

工作/运作

Leaky Bucket算法使用FIFO队列来调度流量。对于固定大小的数据包,每时钟周期会移除固定数量的数据包。而对于可变大小的数据包,则基于固定的字节/比特传输速率来进行传输。以下是针对可变长度数据包的算法描述:

在时钟的每一次滴答声中,将计数器初始化为 n。
重复上述操作,直到 n 小于队列中第一个数据包的包大小为止。

  • 从队列的头部取出一包东西,记为“P”。
  • 将数据包P发送到网络中。
  • 将计数器的值减去数据包P的大小。

3. 重置计数器,然后回到步骤1。

例如:令 n=1000

让Packet等于

  • 因为 n > 队列中第一个数据包的大小,即 n > 200。
  • 因此,n = 1000 - 200 = 800
  • 大小为200的数据包被发送到网络中。

  • 现在,再次考虑 n > 队列中第一个数据包的大小,即 n > 400。
  • 因此,n = 800 - 400 = 400
  • 大小为400的数据包被发送到网络中。

  • 因为,n小于队列中第一个数据包的大小,即 n < 450。因此,该过程将被终止。
  • 在时钟的下一个计时周期中,将 n 初始化为 1000。
  • 这个过程会持续进行,直到所有数据包都被发送到网络中为止。

以下是上述方法的实现步骤:

C++
// 用于实现“漏桶算法”的C++程序#include<bits/stdc++.h>使用命名空间标准;整数主要/核心(){整数查询次数,存储/储存,输出数据包的大小;整数输入数据的大小,桶大小,左侧尺寸;// 桶中初始的数据包存储/储存=0;// 桶内内容被检查的总次数查询次数=4;// 能够传输的总数据包数量// 可以存储在桶中桶大小=10;// 一次进入桶中的数据包数量输入点大小=4;// 一次从桶中取出的数据包数量输出数据包的大小=1;为了(整数i=0;i<查询次数;i++)// 剩余的空间{左尺寸=桶大小-存储/储存;if(输入点的大小<=左侧的尺寸){// 更新存储数据存储/储存+=输入点大小;}否则{printf(数据包丢失率 = %d\n",输入点大小);}printf(缓冲区大小 = %d,而桶的大小 = %d。\n",存储/储存,桶大小);存储/储存-=输出数据包的大小;}返回0;}// 这段代码由 bunny09262002 贡献而来。// 由 rishitchaudhary 改进
Java
// 漏桶算法的Java实现方式进口java.io.*;进口java.util.*;类/类别 LeakyBucket{公共的静态的无效/无意义主要/核心(字符串[]参数/输入项){整数查询次数,存储/储存,输出数据包的大小;整数输入数据的大小,桶大小,左侧尺寸;// 桶中初始的数据包存储/储存=0;// 桶内内容被检查的总次数查询次数=4;// 能够处理的包总数// 可以存储在桶中桶大小=10;// 一次进入桶中的数据包数量输入点大小=4;// 一次从桶中释放出来的数据包数量输出数据包的大小=1;为了(整数i=0;i<查询次数;i++){左側的尺寸=桶大小-存储/储存;// 剩余空间if(输入数据的大小<=(左尺寸)){存储/储存+=输入数据的大小;}否则{系统/体系.出去.println(数据包丢失率 =+输入数据的大小);}系统/体系.外出/离开.println(缓冲区大小 = “+存储/储存+桶的尺寸为“out of bucket size”+桶大小);存储/储存-=输出数据包的大小;}}}// 由 rishitchaudhary 改进而成
Python
# 桶中的初始数据包存储/储存 = 0# 桶内内容被检查的总次数查询次数 = 4# 可以容纳的总包数# 可以放置在桶里桶大小 = 10# 一次进入桶中的数据包数量输入数据的大小 = 4# 一次从桶中释放出的数据包数量输出数据包的大小 = 1为了 i in 范围/区间(0, 查询次数):  # 剩余空间    左侧的尺寸 = 桶大小 - 存储/储存    if 输入数据的大小 <= 左侧的尺寸:      # 更新存储功能        存储/储存 += 输入字符的大小    否则:        打印(数据包丢失率 =, 输入字符的大小)    打印(f缓冲区大小 ={存储/储存}桶的容量之外的内容 ={桶大小}")    # 随着数据包被发送到网络中,存储空间的大小也会随之减小。    存储/储存 -= 输出文件的大小# 这段代码由Arpit Jain贡献而来。# 由 rishitchaudhary 改进
C#
// C# 实现中的“泄漏桶”机制使用系统/体系;类别/等级漏水的情况{静态的无效/无意义主要/核心(字符串[]参数/变量){整数查询次数,存储/储存,输出数据包的大小;整数输入点大小,桶大小,左尺寸;// 桶中初始的数据包存储/储存=0;// 桶内内容被检查的总次数查询次数=4;// 能够处理的包总数// 可以存储在桶中桶大小=10;// 一次进入桶中的数据包数量输入点的大小=4;// 一次从桶中释放出来的数据包数量输出文件的大小=1;为了(整数i=0;i<查询次数;i++){左尺寸=桶大小-存储/储存;// 剩余空间if(输入数据的大小<=(左尺寸)){存储/储存+=输入点的大小;}否则{控制台.WriteLine(数据包丢失率 =+输入字符的大小);}控制台.WriteLine(缓冲区大小 = “+存储/储存+桶的尺寸为“”。+桶大小);存储/储存-=输出文件的大小;}}}// 这段代码由 phasing17 提供。
JavaScript
// 用于实现该方法的 JavaScript 代码// 桶中初始存在的数据包让/允许存储/储存=0;// 桶中内容的检查总次数让/允许查询数量=4;// 能够处理的包总数// 可以存放在这个桶里。桶大小=10;// 一次进入桶中的数据包数量让/允许输入数据的大小=4;// 一次从桶中释放出的数据包数量输出数据的大小=1;为了(i=0;i<查询数量;i++){// 剩余的空间sizeLeft=桶大小-存储/储存;if(输入数据的大小<=sizeLeft){// 更新存储数据存储/储存+=输入数据的大小;}否则{控制台.日志/记录(数据包丢失率 =,输入数据的大小);}控制台.日志/记录(缓冲区大小 =${存储/储存}桶的容量之外的内容 =${桶大小}`);// 当数据包被发送到网络中时,存储空间的大小就会逐渐减小。存储/储存-=输出数据的大小;}// 这段代码由 phasing17 贡献而来。

输出结果/内容

缓冲区大小 = 4,桶的大小 = 10
缓冲区大小 = 7,桶的大小 = 10
缓冲区大小 = 10;桶的大小 = 10
数据包丢失量 = 4
缓冲区大小 = 9,桶的大小 = 10

漏桶模型与令牌桶模型

漏桶模型令牌桶模型
当主机需要发送一个数据包时,该数据包会被放入相应的桶中。在这种情况下,这个桶会存储以固定时间间隔生成的代币。
桶子以恒定的速率泄漏液体。这个桶的最大容量已经达到了极限。
那些混乱的交通状况,可以通过“漏桶算法”来转化为更加有序的交通流。如果已经准备好数据包,那么就会从桶中移除该令牌,然后发送该数据包。
实际上,桶式调度器是一种以固定速率输出元素的有限队列调度方式。如果桶中没有令牌,那么就无法发送该数据包。

优势/有利条件

  • 可以防止突然的交通拥堵现象。
  • 能够产生平稳且稳定的数据流。
  • 实施起来非常简单,所需的控制逻辑也很少。
  • 使带宽使用情况更加可预测。
  • 适用于需要稳定传输的应用场景。

缺点/不利因素

  • 无法有效处理突发流量情况。
  • 当缓冲区达到最大容量时,数据包可能会被丢弃。
  • 在流量较低的时候,可用的带宽可能会被闲置不用。
  • 不太能适应动态网络环境的变化。
  • 不适合处理变化幅度很大的数据流量。

应用程序/软件

  • 路由器和交换机中的流量整形功能。
  • 服务质量(QoS)网络中的带宽控制。
  • 采用IP语音技术,以确保通话质量的稳定性。
  • 视频流传输,实现持续的数据传递。
  • 像ATM这样的传统网络,其所需的流量模式是可预测的。
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料