1. 什么叫桶子算法?
桶子算法是网络通讯的两端看成是一定时间上的具有长度和宽度的桶子;数据在通讯的两端传输时候数据在不停的过去,这个时间可以看成是长度,及从开始通讯到现在已经经过了多长时间,而宽度当然是网络带宽了;二者的乘积可以看成是具有一定体积的桶子。如下图:
2. 用途
桶子算法的目的是为了对发送端的数据流量进行控制。
3. 原理
我们假定这个桶子具有T (ms)长度,带宽为B (kbps),那么这个桶子的体积位:
V=T * B
从某个时间T1开始,有数据不断填充这个桶子,但如果数据填充的不是非常快,或者说数据的流量小于网络带宽B的时候,这个桶子永远都填不满,如下列图表示:
如图所示我们这个桶子的体积随着时间在增加,从T1时刻的V1(B*(T1-T0))变化到T2时刻的V2(B*(T2-T0)),桶子的体积增加了B*(T2-T1),如果在这段时间内,实际的数据流量小于这个增量,那么桶子始终有空闲的地方,这样桶子就不会满,实际上在这种情况下桶子算法对流量是控制不了的。
如果在T2-T1时间内,网络的实际数据流量很大,即数据在很短的时间内(小于T2-T1)就将填满了这段容量,那么桶子算法开始发挥流量控制的作用。
在发送数据的时候需要检测桶子的可用大小,如果桶子的可用大小为0表示已经不能再向这个桶子填充任何数据了,必须等待桶子恢复到一定的体积之后才能再接收数据(我们假设为半桶的体积);当桶子恢复的时候我们又可以向这个桶子填充数据了,但如果又很快满了,那么必须又停止下来等待桶子恢复。桶子算法就是通过发发停停来控制流量的。当然如果你将带宽设置的大一些,桶子的体积就大一点,就不那么容易被填满,也能够更快速的发送数据。
4. 注意
桶子算法又几点需要注意:
桶子算法又几点需要注意:
l 桶子的最大容积;这是由时间来决定,我们假定的T,这个值的选择也决定了你可以向桶子发送多大的数据,当然这个时间在不同的网络环境下取值是不同的;在有的网络下,即使你设置的很大,但下面的套接字层已经没有办法发送更快了。
l 恢复算法的采用;一般桶子满了之后需要等待一段时间,如果设置一个时间让网络不至于太闲或造成数据的突然高峰,也不至于让数据不停的跳动,确实很重要。
l 这个流量控制只能对物理带宽以内的流量进行控制。
本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/197371,如需转载请自行联系原作者