要实现流量的控制,必须有一种机制可以对通过设备的流量进行度量。令牌桶(Token-Bucket)是目前最常采用的一种流量测量方法,用来评估流量速率是否超过了规定值。这里的令牌桶是指网络设备的内部存储池,而令牌则是指以给定速率填充令牌桶的虚拟信息包。
令牌桶可以看作是一个存放令牌的容器,预先设定一定的容量。系统按设定的速度向桶中放置令牌,当桶中令牌满时,多余的令牌溢出。令牌桶只是一种流量测量方法,并不能对流量进行过滤或采取某种措施,比如说丢弃数据包等,这些操作由其他功能完成,而且令牌桶中装的是令牌而不是报文分组。
图1 令牌桶示意图
当数据流到达设备时首先会根据数据的大小从令牌桶中取出与数据大小相当的令牌数量用来传输数据(RFC 标准中定义的大小以 b/s 为单位)。也就是说要使数据被传输必须保证令牌桶里有足够多的令牌,如果令牌数量不够,则数据会被丢弃或缓存。这就可以限制报文的流量只能小于等于令牌生成的速度,达到限制流量的目的。
图2 使用令牌桶处理报文示意图
关于令牌桶处理报文的方式,RFC中定义了两种令牌桶算法
- 单速率三色标记(single rate three color marker,srTCM,RFC2697 定义,或称为单速双桶算法)算法,主要关注报文尺寸的突发。
- 双速率三色标记(two rate three color marker,trTCM,RFC2698 定义,或称为双速双桶算法)算法,主要关注速率的突发。
两种算法的评估结果都是为报文打上红、黄、绿三种颜色的标记,所以称为“三色标记”。 QoS 会根据报文的颜色,设置报文的丢弃优先级,两种算法都可工作于色盲模式和非色盲模式。
单速双桶算法(srTCM)
- 单速双桶令牌桶参数
- CIR(Committed Information Rate):承诺信息速率,单位是 bit/s,表示向令牌桶中投放令牌的速率。
- CBS(Committed Burst Size):承诺突发尺寸,单位是 bit,用来定义在部分流量超 过CIR之前的最大突发流量,即为令牌桶的容量(深度)。承诺突发尺寸必须大于报文的最大长度(最大时一个分组可以领取桶中的全部令牌)。CBS 越大,表示所允许的突发量越大。
- EBS(Extended burst size):超额突发尺寸,用来定义在所有流量超过CIR之前的 最大突发量。
- **单速双桶令牌桶结构 **
双桶结构由两个桶实现,为方便将两个令牌桶称为C桶和E桶。C 桶容量为CBS, E 桶容量为EBS,总容量是CBS+EBS。如果不允许有突发流量,EBS 则设置成 0。 当 EBS≠0 时,称为单速双桶。当 EBS=0,E桶的令牌数始终为 0,相当于只使用了一个令牌桶——C桶,这种情况也称为单速单桶。
图3 单速双令牌桶示意图
- 单速双桶令牌添加方式
单速双桶令牌添加方式比较简单,先以CIR的速率往C桶中添加令牌,当C桶容 量到达 CBS 后(C桶满了),再以相同的速率往E 桶中添加令牌(E 桶的令牌用做 以后临时超过CIR的突发流量),当E桶容量到达 EBS 后(E 桶也满了),则新产 生的令牌将会被丢弃。 初始状态下,C 桶和 E桶都是满的。 - 单速双桶流量评估规则
当报文到来后,直接与桶中的令牌数相比较,如果有足够的令牌就转发(通常用一个令牌关联一个比特的转发权限),如果没有足够的令牌则丢弃或缓存。 为方便表示,用 Tc 和 Te 表示桶中的令牌数量,Tc 和 Te 初始化等于CBS 和EBS。
色盲模式下,在对到达报文(假设报文大小为B)进行评估时,遵循以下规则:
- 对于单速单桶(EBS=0):
- 如果报文长度不超过 C桶中的令牌数 Tc,则报文被标记为绿色,且 Tc=Tc-B;
- 如果报文长度超过C 桶中的令牌数 Tc,报文被标记为红色,Tc 值不变。
- 对于单速双桶(EBS≠0):
- 如果报文长度不超过 C桶中的令牌数 Tc,则报文被标记为绿色,且 Tc=Tc-B;
- 如果报文长度超过C 桶中的令牌数 Tc 但不超过E 桶中的令牌数 Te,则报文被 标记为黄色,且 Te=Te-B;
如果报文长度超过E 桶中的令牌数 Te,报文被标记为红色,但 Tc 和 Te 不变。
色敏模式下,在对到达报文(假设报文大小为B)进行评估时,遵循以下规则:
- 对于单速单桶(EBS=0):
- 如果报文已被标记为绿色但报文长度不超过C 桶中的令牌数 Tc,则报文被标记为绿色,且 Tc=Tc-B;
- 如果报文已被标记为绿色且报文长度超过 C桶中的令牌数 Tc,则报文被标记为红色,Tc 保持不变;
- 如果报文已被标记为黄色或红色,都直接将报文标记为红色,Tc 保持不变;
- 对于单速双桶(EBS≠0):
- 如果报文已被标记为绿色且报文长度不超过C桶中的令牌数 Tc,则报文被标记为绿色,且 Tc=Tc-B;
- 如果报文已被标记为绿色且报文长度超过C桶中的令牌数Tc但不超过E桶中的令牌数Te,则报文被标记为黄色,且 Te=Te-B;
- 如果报文已被标记为黄色但报文长度不超过E桶中的令牌数 Te,则报文被标记为黄色,且 Te=Te-B;
- 如果报文已被标记为黄色且报文长度超过E桶中的令牌数 Te,则报文被标记为红色,且Te保持不变;
- 如果报文已被标记为红色,直接将报文标记为红色,Tc 和Te不变。
双速双桶算法(trTCM)
- 双速双桶令牌桶参数
- CIR(Committed Information Rate):承诺信息速率,表示端口允许的信息流平均速率,单位是 bit/s。
- CBS(Committed Burst Size):承诺突发尺寸,用来定义在部分流量超过CIR之前 的最大突发流量,单位为 bit。承诺突发尺寸必须不小于报文的最大长度。
- PIR(Peak Information Rate):表示峰值信息速率,表示端口允许的突发流量的最大速率,单位是 bit/s。该值必须不小于CIR的设置值。
- PBS(Peak Burst Size):表示峰值突发尺寸,用来定义每次突发所允许的最大的流量尺寸。
- 双速双桶令牌桶结构
双速率三色标记算法业界都使用两个令牌桶,但它关注的是速率的突发,所以不像单速率三色标记算法那样把第一个桶中溢出的令牌放到第二个桶中,而是使用两个独立的令牌桶,存在两个令牌填充速率。为方便将两个令牌桶称为C桶和P桶,C桶容量为CBS,令牌填充速率为CIR,P桶容量为PBS,令牌填充速率为 PIR。
图4 双速双桶示意图
- 双速双桶令牌添加方式
初始状态时C桶和P桶都是满的。往C桶和P桶分别以CIR和PIR的速率填充令牌。因这两个令牌桶是相互独立的,当其中一个桶被填满时,这个桶新产生的令牌将会被丢弃,而另一个桶则不受影响,继续填充令牌。 - 双速双桶流量评估规则
双速率三色标记算法关注的是速率的突发,首先评估的是数据流的速率是否符合规定的突发要求,其规则是先比较P桶,再比较C桶。 双速率三色标记算法也有色盲模式和色敏模式两种。为方便用Tc和Tp表示桶中的令牌数量,Tc 和 Tp 初始化等于CBS 和PBS。
色盲模式下,在对到达报文(假设数据包大小为B)进行评估时,遵循以下规则:
- 如果报文长度超过P桶中的令牌数Tp,则报文被标记为红色,且Tc和Tp保持 不变,
- 如果报文长度不超过P桶中的令牌数 Tp 但超过C桶中的令牌数 Tc,则报文被标记为黄色,且 Tp=Tp-B,
- 如果报文长度不超过C桶中的令牌数Tc,报文被标记为绿色,且 Tp=Tp-B, Tc=Tc-B。
色敏模式下,在对到达报文(假设报文大小为 B)进行评估时,遵循以下规则:
- 如果报文已被标记为绿色且报文长度超过P桶中的令牌数Tp,则报文被标记为红色,且 Tp 和 Tc 不变。
- 如果报文已被标记为绿色且报文长度不超过P桶中的令牌数Tp但超过C桶中的令牌数 Tc,则报文被标记为黄色,且 Tp=Tp-B,Tc 不变。
- 如果报文已被标记为绿色且报文长度不超过C 桶中的令牌数 Tc,则报文被标记为绿色,且 Tp=Tp-B,Tc=Tc-B。
- 如果报文已被标记为黄色,则只比较P桶,如果报文长度超过P桶中的令牌数 Tp,则报文被标记为红色,且 Tp 和 Tc 不变。
- 如果报文已被标记为黄色,且报文长度不超过P桶的令牌数,则报文被标记为 黄色,且 Tp=Tp-B,Tc 不变。
- 如果报文已被标记为红色,直接将报文标记为红色,Tc 和 Tp 不变。