令牌桶过滤器(TBF)是一个简单的队列规定,只允许不超过事先设定的速率到来的数据包通过,但可能允许短暂突发流量超过设定值。
TBF很精确,对于网络和处理器的影响都比较小。如果对一个网卡限速,它应该成为第一选择。
TBF的实现在于一个缓冲器(桶),不断地被一些叫做“令牌”的虚拟数据以特定速率填充(token rate)。同最重要的参数就是它的大小,也就是它能够存储令牌的数量。
每个到来的令牌从数据队列中收集一个数据包,然后从桶中被删除。这个算法关联到两个流上————令牌流和数据流。于是由3种情景:
- 数据流以等于令牌流的速率达到TBF。这种情况下每个到来的数据包都能应对一个令牌,然后无延迟地通过队列。
- 数据流以小于令牌流的速度到达TBF。通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里积累下来,只到桶被装满。剩下的令牌可以做需要以高于令牌流速率发送数据流的时候被消耗掉,这种情况下会发生突发传输。
- 数据流以大于令牌流的速率达到TBF。这意味着桶里的令牌很快就会被耗尽。导致TBF中断一段时间,称为“越限”。如果数据包持续到来,将发生丢包。
最后一种情景非常重要,因为它可以用来对数据通过过滤器的速率进行整形。令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包,但是持续越限的话会导致传输延迟直至丢包。
实际实现是针对数据的字节数进行的,而不是针对数据包进行的。
参数与使用
TBF提供了一些可调控的参数。
limit/latency
limit确定最多有多少数据(字节数)在队列中等待可用令牌。latency参数确定一个包在TBF中等待传输的最长等待时间。
burst/buffer/maxburst
桶的大小,以字节为单位。这个参数指定了最多可以有多少个令牌能够即刻被使用。通常,管理的带宽越大,需要的缓冲器就越大,在Intel体系上,10Mbit/s的速率需要至少10Kbit的缓冲区才能达到期望的速率。
如果缓冲区太小,就会导致潜在的丢包。
mpu
最小传输包的大小。
rate
实际分配带宽
如果桶里存在令牌而且运行没有令牌,相当于不限制速率(缺省情况)。如果不希望这样,可以调整以下参数:
peakrate
指定多长时间释放一个数据包
mtu/minburst
可接收冲突的发送最小包,