令牌桶算法(token bucket algorithm)

在实施QOS策略时,可以将用户的数据限制在特定的带宽,当用户的流量超过额定带宽时,超过的带宽将采取其它方式来处理。要衡量流量是否超过额定的带宽,网络设备并不是采用单纯的数字加减法来决定的,也就是说,比如带宽为100K,而用户发来的流量为110K,网络设备并不是靠110K减去100K等于10K,就认为用户超过流量10K。网络设备衡量流量是否超过额定带宽,需要使用令牌桶算法来计算。下面详细介绍令牌桶算法机制:

当网络设备衡量流量是否超过额定带宽时,需要查看令牌桶,而令牌桶中会放置一定数量的令牌,一个令牌允许接口发送或接收1bit数据(有时是1
Byty数据),当接口通过1bit数据后,同时也要从桶中移除一个令牌。当桶里没有令牌的时候,任何流量都被视为超过额定带宽,只有当桶中有令牌时,数据才可以通过接口。令牌桶中的令牌不仅仅可以被移除,同样也可以往里添加,所以为了保证接口随时有数据通过,就必须不停地往桶里加令牌,由此可见,往桶里加令牌的速度,就决定了数据通过接口的速度。因此,我们通过控制往令牌桶里加令牌的速度从而控制用户流量的带宽。而设置的这个用户传输数据的速率被称为承诺信息速率(CIR),通常以秒为单位。比如我们设置用户的带宽为1000
bit每秒,只要保证每秒钟往桶里添加1000个令牌即可。

例:

将CIR设置为8000 bit/s,那么就必须每秒将8000个令牌放入桶中,当接口有数据通过时,就从桶中移除相应的令牌,每通过1
bit,就从桶中移除1个令牌。当桶里没有令牌的时候,任何流量都被视为超出额定带宽,而超出的流量就要采取额外动作。

每秒钟往桶里加的令牌就决定了用户流量的速率,这个速率就是CIR,但是每秒钟需要往桶里加的令牌总数,并不是一次性加完的,一次性加进的令牌数量被称为Burst
size(Bc),如果Bc只是CIR的一半,那么很明显每秒钟就需要往桶里加两次令牌,每次加的数量总是Bc的数量。

还有就是加令牌的时间,Time
interval(Tc),Tc表示多久该往桶里加一次令牌,而这个时间并不能手工设置,因为这个时间可以靠CIR和Bc的关系计算得到, Bc/
CIR= Tc。

例:

如果CIR是8000,Bc是4000,那就是每秒加两次,Tc就是4000/8000=0.5,也就是0.5秒,即500 ms。

如果Bc设为2000,那Tc就是2000/8000=0.25, 也就是250 ms。

单速双色

在单速双色的令牌桶算法中,只存在一个令牌桶,并且流量只会出现两种结果,即符合CIR(conform)和超出CIR(exceed)。

例:

将CIR设置为8000 bit,每一秒都会往桶里加8000个令牌,在一秒钟结束后,没有用完的令牌会被全部清空,由下一秒重新加入。



第1秒,加入8000令牌,用户使用5000后,剩余3000被清空

第2秒,加入8000令牌,用户使用6000后,剩余2000被清空

第3秒,加入8000令牌,用户使用8000后,没有剩余

第4秒,加入8000令牌,用户使用7000后,剩余1000被清空

从以上过程可以看出,用户每秒都可以使用8000令牌,也就是每秒速度均可达到8000
bit,而无论上一秒钟是否传过数据,这一秒都可以保持在8000 bit/s,并且如果每秒流量超过了8000后,超过的流量都会采取已经设定的动作。

单速三色

在单速三色的令牌桶算法中,使用两个令牌桶,用户每秒的可用带宽,总是两个桶的令牌之和,第一个桶的令牌机制和单速双色算法没有任何区别,关键在于第二个桶。第二个桶的令牌不能直接加入,只有当一秒钟结束后,第一个桶中存在剩余令牌时,这些剩余令牌就可以从第一个桶中被转移到第二个桶中。但不是第一个桶所有未用令牌都可以放入第二个桶,是有限制的,最大数量被称为
Excess Burst
size(Be),由此可见,Be是不可能超过CIR的,因为第一个桶每秒的所有令牌就是CIR,即使所有令牌全部被移到第二个桶,Be最多也只能等于CIR而不能超过。而Be和Bc却毫无关系。需要注意的是,在每一秒结束时,如果用户没有将第二个桶的令牌用完,那么第二个桶的令牌也是要全部被清除的,第二个桶中的令牌,都是来自于上一秒第一个桶没用完的令牌。

由于使用了两个桶,所以用户的流量也会出现三种结果:

小于或等于CIR(也就是符合CIR) (conform)

大于CIR并小于或等于CIR与Be之和(也就是符合两个桶令牌之和)(exceed)

超过CIR与Be之和(也就是超过两个桶令牌之和)(violate)

例:

将CIR设置为8000
bit,Be设置为2000,每一秒都会往第一个桶里加8000个令牌,每一秒结束后,所有第一个桶未使用完的令牌都将放入第二个桶,并且用户每一秒能使用的带宽总是两个桶之和。

如:

第一个桶令牌数   用户用掉的带宽数  第二个桶令牌数  用户可用带宽总数

第1秒          8000             6000             0               8000

第2秒 8000 7000 2000 10000

第3秒          8000             5000             1000            9000

第4秒          8000             9000             2000            10000

第5秒          8000             8000             0               8000

第6秒          8000             6000             0               8000

第7秒          8000             10000            2000            10000

说明:

在第1秒时,第一个桶加入CIR的数量8000个令牌后,第二个桶为空,所以用户可用带宽总数为8000。用户实际使用了6000;

在第2秒时,第一个桶加入8000个令牌后,由于上一秒用户实际使用了6000,所以第二个桶获得2000令牌,此时用户可用带宽为10000,用户实际用户了7000;

在第3秒时,第一个桶加入8000个令牌后,由于上一秒用户实际使用了7000,所以第二个桶获得1000令牌,此时用户可用带宽为9000,用户实际用户了5000;

在第4秒时,第一个桶加入8000个令牌后,由于上一秒用户实际使用了5000,所以第二个桶获得2000令牌,此时用户可用带宽为10000,用户实际用户了9000;

在第5秒时,第一个桶加入8000个令牌后,由于上一秒将第一个桶中令牌用光,所以第二个桶没有获得令牌,此时用户可用带宽为8000,用户实际用户了8000;

在第6秒时,第一个桶加入8000个令牌后,由于上一秒将第一个桶中令牌用光,所以第二个桶没有获得令牌,此时用户可用带宽为8000,用户实际用户了6000;

在第7秒时,第一个桶加入8000个令牌后,由于上一秒用户实际使用了6000,所以第二个桶获得2000令牌,此时用户可用带宽为10000,用户实际用户了10000;

从上面可以看出,第一个桶中的令牌数永远都是CIR的数量,而第二个令牌桶只能在上一秒第一个桶存在没有用完的令牌的情况下,才能够获得令牌,但获得令牌的最大数量不能超过Be。用户的流量也可以出现三种结果:

即小于或等于CIR,即小于8000,如6000

大于CIE并小于或等于CIR+Be,如9000

大于两个桶之后,如11000

要使用户在某一秒的速度能够达到CIR+Be,唯一的办法是用户在上一秒钟以低于CIR的速度传输。因此,用户不可能每一秒都以CIR+Be的速度传输。

双速三色

在单速三色的令牌桶算法中,用户若想要在某一秒以CIR+Be的速度传输,只能在上一秒钟以低于CIR的速度传输。因此,用户不可能每一秒都以CIR+Be的速度传输。而在双速三色的令牌桶算法中,同样使用两个令牌桶,然而这两个桶是相互独立的,并不会将第一个桶未用的令牌放入第二个桶。第一个桶与以往的算法相同,也就是每秒都有CIR的数量,而第二个桶可以直接设置为CIR+Be之和,称为PIR,也就是说第二个桶总是比第一个桶要大,用户的流量总是以第二个桶的大小传输,而不用像单速三色的令牌桶算法中,需要在上一秒钟以低于CIR的速度传输。当用户的数据通过接口时,总是先检查第二个桶的最大速率,即PIR,如果超出则采取动作,如果未超出,再检查是是否符合第一个桶的CIR,如果超出CIR,则采取相应动作,如果未超过,则正常传输。

虽然在双速三色的令牌桶算法中,直接设置两个速率,然而,用户可以直接以CIR+Be之和的速率进行传输,此外,还可以判断出三种结果。