目录

前言
需要 Bandwidth Management 的原因
Bandwidth Management 的原理
Bucket and Token Algorithm
Traffic Shaping
  Class-based Shaping
  Committed Burst 与 Excess Burst
  PIR (Peak Information Rate)
  queue-limit
Traffic Policing
  Single-rate Two-color Policer
  Single-rate Three-color Policer
  Two-rate Three-color Policer

前言

Bandwidth Management (频宽管理) 常见於企业与服务供应商 (ISP) 之间的网络连线,当 Interface Speed 大於供应商所承诺的 Committed Information Rate (CIR),则企业网管人员需主动限制输出频宽。学习 Bandwidth Management 主要在於两个范畴:Traffic Shaping 和 Traffic Policing。本篇文章会先探讨 Bucket 与 Token 原理,再阐述 Traffic Shaping 和 Traffic Policing 的设定。

需要 Bandwidth Management 的原因

用以连接 Remote Site 的 Point-to-Point 或 Point-to-Multipoint 连线频宽一般成本较高,ISP 只能提供不高於 CIR 的服务保证,超出 CIR 的 Traffic 就不会保证能否送达目的地了,也有可能需要为额外使用的频宽收费。因此,网管人员应实施有效的 Bandwidth Management 去限制 Bandwidth 使用量。

Bandwidth Management 的原理

Bandwidth Management 的原理很简单!只要 ISP 告诉我们 CIR 限制是多少,我们就把 Interface 的传输速度压下去,这就成功了!好像很废话!请先看下图,例如:一个速度 10 Mbps 的 Interface,CIR 只容许 2 Mbps。

bandwidth management

如图所见,Interface 以 1 秒为间距,每 1 秒只容许传输 2 Mbits,传够 2 Mbits 後便停止传送,然而 Interface 以 10 Mbps 的速度工作,只需 0.2 秒便完成 2 Mbits 的数据传输,然後等待 0.8 秒才再做下一次传送。问题是:0.8 秒的等待时间实在太久了,用 VoIP 作例子,持续的 VoIP Packet 之间不应相距多於 100 ms (0.1 秒)。VoIP Packet 多被 QoS 设定为高重要性,所以可以幻想得到在每一次的传输,VoIP Packet 都被安排在较前列位置,可惜每隔 0.8 秒才获得一次传输机会对 Voice Traffic 带来重大影响。

如果把间距由 1 秒缩短至 0.25 秒,每段间距改成只限制传输 0.5 Mbits。有趣的是:这改变一样可以达成每秒传输 2 Mbits 这个限制,但每次传送的相距时间却可大幅降低。

bandwidth management

Bucket and Token Algorithm

为了更加实体化,我们一般会使用 Bucket and Token 去解释 Bandwidth Management。在 Bucket and Token Algorithm 里,Interface 每传送 1 Bit,必需从 Bucket 消耗一粒 Token,如果 Bucket 里没有 Token 则不容许传送。每隔一定时间 (Time Interval Tc),系统就会向 Bucket 补充一定数量 (Committed Burst Bc) 的 Token。以上图为例,系统每隔 0.25 秒就向 Bucket 注入 50 万粒 Token,而 Bucket 的容量刚好也等於 Committed Burst Bc,满泻的 Token 会被移除,这意味着 Interface 在未来 0.25 秒内最多只能传送 0.5 MBits (500,000 Bits) ,这就可以确保传输速度不会超过限额。

bandwidth management

所以当 ISP 告诉我 CIR 是 2 Mbps,假若我们把 Committed Burst Bc 设定成 500,000 Bits,系统就会很容计算出 Time Interval Tc 是 0.25 秒,即每秒有 4 次注入 Token 的循环。公式如下:

                                                      Tc = Bc / CIR

Bc 的大小是可以自行决定的,从刚才的例子可见,Bc 的 Size 太大,间距增长导致 Delay 增加,那麽把 Bc 设定成细小的值,情况又会怎样呢?今次我们以 Interface Speed 10 Mbps,设定 CIR 为 1 Mbps 去传送一个 1,500 Bytes (12,000 Bits) 的 Packet 作例子,计算一下使用不同 Bc 的传送时间。

1. 如 Bc = 900,Tc = 900/1,000,000=0.0009 秒
2. 以 Packet Size 12,000 除 900 得出要传送完成需要 13 个循环再多一点点。
3. 13 个循环所需时间为 13 x 0.0009 = 0.0117 秒,即 0.0117 秒传送了 13 次 900 Bits,共 11,700 Bits,剩馀的 300 Bits 就要等待下一次循环了。
4. 到了第 14 个循环,Interface 以 10 Mbps 的速度把剩馀的 300 Bits 传送,共使用:300/10,000,000 = 0.00003 秒
5. 因此整个传送过程共用了 0.0117+0.00003=0.01173 秒,这个由 Packet 开始被传送至到完成传送的时间可称之为 Lead Time。

只要计算不同 Bc 所得出的 Lead Time,可得出下图,从图中可见,不同 Bc 之 Lead Time 相距甚远,可以有数倍之差。当 Bc 增加至与 Packet Size 相等时 (12,000 Bits),Lead Time 变得较少。由此可见,把 Bc 设定成与 Packet Size 相等是一个很好的选择。但问题是,网络上 Traffic 的 Packet Size 千变万化,我们需要估算一下什麽 Traffic 比较多和重要,如果网络大部份 Traffic 是 VoIP,则可把 Bc 设成 RTP 的 Payload Size,例如:G711 是 160 Bytes。如果 Traffic 以大 Size 的 File Transfer 为主,则可设成一般系统的 Maximum Transmission Unit (MTU) 1,500 Bytes。

bandwidth management

Traffic Shaping

如果看到这里你还应付得来的话,我们便可以开始讨论 Traffic Shaping 了。所谓 Shaping 的意思很简单,就是把超出 CIR 的 Packet 暂时放在一个 Buffer 之中等待一下,到情况许可时再传送出去,这样就可以低成本地和更有效率地使用 Bandwidth。从下图可以看到 Shaping 後的 Traffic 看起来比较平整,尖峰被削掉并安排在较後时间输出。

bandwidth management

图片来源

Class-based Shaping

以下介绍一个最基本的 Shaping 设定。

第一步:设定 Policy Map。Keyword class-default 意思是所有未分类的 Traffic,由於我们并没有做 QoS Classification,所以这里的意思就是把所有 Traffic 来做一个 Shaping 设定。当然我们可以为不同的 Traffic 类型分别做不同的 Shaping 设定,但很少会这样处理,因为我们通常会为不同的 Traffic Class 做了 CBWFQ 和 LLQ 等设定来限制其 Bandwidth。关於 Classification 和 QoS 设定将会在日後介绍 QoS 的文章中再详细说明。

Shape 指令第一个选项请选 average (稍後说明),然後第二个选项是要限制的 CIR,第三个选项就是 Committed Burst Bc,最後是 Excess Burst Be 暂时设为 0 (稍後说明)。

R2(config)#policy-map SHAPE-TO-1M
R2(config-pmap)#class class-default
R2(config-pmap-c)#shape average 1m 12000 0

第二步:把 Policy Map 放到 Outgoing Interface。

R2(config)#int ethernet 1/1
R2(config-if)#service-policy output SHAPE-TO-1M

show policy-map interface 指令查看结果。

R2#show policy-map interface ethernet 1/1
 Ethernet1/1 

  Service-policy output: SHAPE-TO-1M

    Class-map: class-default (match-any)  
      7944 packets, 7651699 bytes
      5 minute offered rate 20000 bps, drop rate 0000 bps
      Match: any 
      Queueing
      queue limit 64 packets
      (queue depth/total drops/no-buffer drops) 0/2/0
      (pkts output/bytes output) 7944/7651699
      shape (average) cir 1000000, bc 12000, be 0
      target shape rate 1000000

Committed Burst 与 Excess Burst

一切设定好後,本来以为可以休息一下,突然你又收到 ISP 销售人员来电,告诉你不如多付一点点钱,他们便容许你在必要时提升 Bandwidth,这又是什麽回事呢?原来 ISP 的连线和网络设备在同一时间正招呼不同的顾客,每位顾客都拥有自己的 CIR,但 ISP 知道不可能每位顾客都在同一时间用到 CIR 的上限,所以他们还有空间把非繁忙时间剩馀的 Bandwidth 卖出去,称为 Over-subscription。於是他们介绍你一个新计划,除了那 1 Mbps 的保证服务外,你还可以使用额外 0.5 Mbps,但使用这些额外 Bandwidth 的 Traffic 只能在网络畅通时送达。於是网管人员该怎样修改 Shaping 设定呢?

我们再拿水桶图出来解说一下,左面是原设定。如要使用额外频宽,我们可以把 Bucket 的 Size 加大,让它可以装载更多的 Token,留意补充 Token 的速度并无改变,可以幻想得到,在 Traffic 量少时,Token 便会被贮起来,最终能贮至 Bc + Be。假设把 Be 设成 6,000,当 12,000 + 6,000 Token 在同一循环被使用时,该时刻的理论 Bandwidth 达 18,000/0.012 = 1.5 Mbps,然而平均 Bandwidth 却从来没有改变,因为 Token 补充速度没有改变,这就好像把用不完的 Bandwidth 先贮起来,到有需要时一次过爆发。

bandwidth management

修改 Be 设定如下:

R2(config)#policy-map SHAPE-TO-1M
R2(config-pmap)#class class-default
R2(config-pmap-c)#shape average 1m 12000 6000
R2#show policy-map interface ethernet 1/1
 Ethernet1/1 

  Service-policy output: SHAPE-TO-1M

    Class-map: class-default (match-any)  
      16123 packets, 15515474 bytes
      5 minute offered rate 19000 bps, drop rate 0000 bps
      Match: any 
      Queueing
      queue limit 64 packets
      (queue depth/total drops/no-buffer drops) 0/4/0
      (pkts output/bytes output) 16123/15515474
      shape (average) cir 1000000, bc 12000, be 6000
      target shape rate 1000000

PIR (Peak Information Rate)

我们还可以进一步把补充 Token 的水量加大,更进取地使用额外 Bandwidth。只要把 Shape 指令里的 keyword average 换成 peak,则 Token 补充量变为 Bc + Be,在 Tc 不改变的情况下,传输频宽因而变大,亦称为 PIR (Peak Information Rate)。

bandwidth management

设定如下:

R2(config)#policy-map SHAPE-TO-1M
R2(config-pmap)#class class-default
R2(config-pmap-c)#shape peak 1m 12000 6000
R2#show policy-map interface ethernet 1/1
 Ethernet1/1 

  Service-policy output: SHAPE-TO-1M

    Class-map: class-default (match-any)  
      19117 packets, 18386110 bytes
      5 minute offered rate 19000 bps, drop rate 0000 bps
      Match: any 
      Queueing
      queue limit 64 packets
      (queue depth/total drops/no-buffer drops) 0/4/0
      (pkts output/bytes output) 19117/18386110
      shape (peak) cir 1000000, bc 12000, be 6000
      target shape rate 1500000

网管人员需注意 ISP 只为 CIR Bandwidth 作保证传输,超过 CIR 则有机会被 Drop 或 Delay,考虑以上因素才决定使用那一种设定。

queue-limit

刚开始介绍 Shaping 时有提过 Packet 等待传送时会被储存在 Buffer 之中,此 Buffer 也称为 queue-limit,容量可以调校。Packet 会在这 Buffer 里排队等候传送,但如果 queue-limit 爆满,则会发生 Tail Drop,即後来想进入 Buffer 的 Packet 会被 Drop 掉,除非使用了 WRED,这又是 QoS 的话题,在稍後关於 QoS 的文章再说明。修改 queue-limit 指令如下:

R2(config-pmap-c)#queue-limit 200
R2#show policy-map interface ethernet 1/1
 Ethernet1/1 

  Service-policy output: SHAPE-TO-1M

    Class-map: class-default (match-any)  
      27918 packets, 26846162 bytes
      5 minute offered rate 20000 bps, drop rate 0000 bps
      Match: any 
      Queueing
      queue limit 200 packets
      (queue depth/total drops/no-buffer drops) 0/4/0
      (pkts output/bytes output) 27918/26846162
      shape (peak) cir 1000000, bc 12000, be 6000
      target shape rate 1500000

修改 queue-limit 时除了可用 Packet 作单位外,也可以容量 Bytes 和时间 ms 或 us 作单位。如使用时间作单位,则系统会以 [CIR x 时间] 计算出 Bytes,这很实用,例如:网络以传送 Live Video 为主,基本上超过 1 秒 delay 的影像 Payload 对 Client 来说已经没有意义了,倒不如把 queue-limit 定在 1000ms,这就能把超出 1 秒 Delay 的 Packet Drop 掉,留些空间给未来的影像 Payload 进入 queue。

R2(config-pmap-c)#queue-limit 1000 ms
R2#show policy-map interface ethernet 1/1
 Ethernet1/1 

  Service-policy output: SHAPE-TO-1M

    Class-map: class-default (match-any)  
      30041 packets, 28890083 bytes
      5 minute offered rate 20000 bps, drop rate 0000 bps
      Match: any 
      Queueing
      queue limit 1000 ms/ 125000 bytes
      (queue depth/total drops/no-buffer drops) 0/4/0
      (pkts output/bytes output) 30041/28890083
      shape (peak) cir 1000000, bc 12000, be 6000
      target shape rate 1500000

修改 queue-limit 需注意如果 queue-limit 值太短可能会触发不必要的 QoS Congestion Management (未来 QoS 文章中再解说),相反如果 queue-limit 太长则会导致 Packet 在 queue 里等太久而发生 delay 问题。

Traffic Policing

现在我们换个身份,变成 ISP 那边的网管人员,虽然我们已告诉客户 CIR 或 PIR,但我们无法保证客户有乖乖的做好 Bandwidth Management,他们可能把超额的 Traffic 硬塞过来给我们。因此作为 ISP 的一方必需做好我们自家的 Bandwidth Management,去好好处理客户硬塞过来的 Traffic。ISP 用的不会是 Shaping,试想想,Traffic 已经来到我的 Interface 了,进来的 Traffic 必需尽快处理掉,要传送或是丢弃还是做其他动作?这要靠 Traffic Policing 设定去决定。Traffic Policing 与 Traffic Shaping 相似的地方是一样用到水桶理论,但很玩野的是:Policing 的 Token 单位是 Bytes 而不是 Bits。另外,Policing 不会作延时传送,Token 的足够与否所决定的是对 Packet 的政策 (即 Policy),也称为颜色 (Color)。Traffic Policing 一共有 3 种:分别是 Single-rate Two-color Policer丶Single-rate Three-color Policer 与及 Two-rate Three-color Policer (或称 Dual-rate Three-color Policer)。

Single-rate Two-color Policer

透过查看 Bc Bucket 是否有足够 Token 来作出判断执行绿色动作 (Conform Action) 还是红色动作 (Exceed Action),Action 是可以自订的,选项包括:传送 (Transmit)丶丢弃 (Drop) 或者重新标记 (Remark)。

bandwidth management

以下 Policing 设定把 CIR 设为 1 Mbps,Bc 设为 1500 Bytes,Conform Action 设为 Transmit,Exceed Action 设为 Drop。透过这设定,客户传过来的流量一旦超过了双方协议的 CIR,就会开始被 Drop 掉。

R3(config)#policy-map ONE-RATE-TWO-COLOR
R3(config-pmap)#class class-default
R3(config-pmap-c)#police cir 1000000 bc 1500
R3(config-pmap-c-police)#conform-action transmit 
R3(config-pmap-c-police)#exceed-action drop
R3(config-pmap-c-police)#exit
R3(config-pmap-c)#exit
R3(config-pmap)#exit
R3(config)#int ethernet 1/0
R3(config-if)#service-policy input ONE-RATE-TWO-COLOR
R3#show policy-map interface ethernet 1/0
 Ethernet1/0 

  Service-policy input: ONE-RATE-TWO-COLOR

    Class-map: class-default (match-any)  
      42 packets, 41468 bytes
      5 minute offered rate 1000 bps, drop rate 1000 bps
      Match: any 
      police:
          cir 1000000 bps, bc 1500 bytes
        conformed 27 packets, 18758 bytes; actions:
          transmit 
        exceeded 15 packets, 22710 bytes; actions:
          drop 
        conformed 1000 bps, exceeded 1000 bps

Single-rate Three-color Policer

增加 Be Bucket,从 Bc 满泻的 Token 会被移到 Be Bucket。透过查看两个 Bucket 是否有足够 Token 来作出判断执行绿色动作 (Conform Action)丶黄色动作 (Exceed Action) 还是红色动作 (Violate Action)。与 Single-rate Two-color Policer 不同的是,Single-rate Three-color 可以对超额流量提供一定程度的容忍,例如用 Remark 的方法降低其重要性并尝试传送。

bandwidth management

以下 Policing 设定加入了 Be 设定使其成为 Single-rate Three-color,Exceed Action 设为 set-dscp-transmit af23 表示 Packet 会被更改 DSCP 才传送。(DSCP 原理将会在 QoS 文章中详细说明)

R3(config)#policy-map ONE-RATE-THREE-COLOR
R3(config-pmap)#class class-default
R3(config-pmap-c)#police cir 1000000 bc 1500 be 1500
R3(config-pmap-c-police)#conform-action transmit 
R3(config-pmap-c-police)#exceed-action set-dscp-transmit af23 
R3(config-pmap-c-police)#violate-action drop
R3(config-pmap-c-police)#exit
R3(config-pmap-c)#exit
R3(config-pmap)#exit
R3(config)#int ethernet 1/0
R3(config-if)#service-policy input ONE-RATE-THREE-COLOR 
R3#show policy-map interface ethernet 1/0
 Ethernet1/0 

  Service-policy input: ONE-RATE-THREE-COLOR

    Class-map: class-default (match-any)  
      21 packets, 21446 bytes
      5 minute offered rate 1000 bps, drop rate 1000 bps
      Match: any 
      police:
          cir 1000000 bps, bc 1500 bytes, be 1500 bytes
        conformed 13 packets, 9334 bytes; actions:
          transmit 
        exceeded 0 packets, 0 bytes; actions:
          set-dscp-transmit af23
        violated 8 packets, 12112 bytes; actions:
          drop 
        conformed 1000 bps, exceeded 0000 bps, violated 1000 bps

Two-rate Three-color Policer

Two-rate Three-color 比起 Single-rate Three-color 不同的地方是 Be Bucket 透过 PIR 补充,而非来自满泻的 Bc Bucket。这设定能准确判断 Traffic 是否已超出 CIR 而落入 PIR 范围,并执行相应动作。

bandwidth management

以下 Policing 设定加入了 PIR 设定使其成为 Two-rate Three-color。

R3(config)#policy-map TWO-RATE-THREE-COLOR
R3(config-pmap)#class class-default
R3(config-pmap-c)#police cir 1000000 bc 1500 pir 1500000 be 1500
R3(config-pmap-c-police)#conform-action transmit 
R3(config-pmap-c-police)#exceed-action set-dscp-transmit af23 
R3(config-pmap-c-police)#violate-action drop
R3(config-pmap-c-police)#exit
R3(config-pmap-c)#exit
R3(config-pmap)#exit
R3(config)#int ethernet 1/0
R3(config-if)#service-policy input TWO-RATE-THREE-COLOR 
R3#show policy-map interface ethernet 1/0
 Ethernet1/0 

  Service-policy input: TWO-RATE-THREE-COLOR

    Class-map: class-default (match-any)  
      83 packets, 84250 bytes
      5 minute offered rate 3000 bps, drop rate 3000 bps
      Match: any 
      police:
          cir 1000000 bps, bc 1500 bytes
          pir 1500000 bps, be 1500 bytes
        conformed 51 packets, 35802 bytes; actions:
          transmit 
        exceeded 0 packets, 0 bytes; actions:
          set-dscp-transmit af23
        violated 32 packets, 48448 bytes; actions:
          drop 
        conformed 3000 bps, exceeded 0000 bps, violated 3000 bps