当 PE 上增加一个 CE 的相关配置时,需要指定标签块的大小 LR , LB 是 PE 自动分配的。这个标签块作为一个 NLRI 条目通过 BGP 传递到其它 PE 。当该 CE 配置被删除或者 PE 与该 CE 的连接失效,这个标签块也要被删除, BGP 同样会做撤消通告。
假设,在开始部署的时候, CEm 需要与远端其它 CE 建立两条 VC ,那么定义标签块的大小不能小于 2 。当然,为了今后扩容的考虑,我们可以定义 Rang=10 。无论 Rang 为多大,随着网络的扩容 VC 数量的增加,总会出现标签不够用的时候。这时候我们就需要重新定义 Rang 的大小,给一个更大的标签空间。但问题出现了,前面我们谈到标签块的数据是通过 BGP 的 NLRI 来传递的,并且这个标签块已经被用于计算 VC 标签和实际数据的转发。为了不破坏原有的 VC 连接,采用一个办法,就是给这个 CE 分配一个新的标签块,并且作为一条新的 NLRI 通过 BGP 通告。也就是说一个 CE 的标签空间可能是由许多个标签块组成的( Rang 等于 LR 的总和),这种机制解决了网络扩展的需求。多个标签之间的联系通过一个偏移量来定义 LO ( Label-block Offset )。 LO 标志出了前面所有标签块大小的总和。比如第一个标签块的 LR 为 100 , LO 为 0 ;第二个标签块的 LR 为 50 ,那么 LO 为 100 ;如果有第三个标签块,它的 LO 就是 150 。 LO 会在 VC 标签计算被使用。现在每一个标签块都可以用三个参数来描述,那就是 LB/LR/LO 。
CE ID 是在同一个 ××× 内唯一标识 CE 的参数。在同一个 ××× 内,每个 CE ,其 CE ID 必须是不同的, CE ID 会在每一个 NLRI 中携带,这样就可以将标签块和对应的 CE 关联起来。在 Kompella draft 中, CE ID 也被用于 VC 标签的计算。
假设 PEk 本地有一个 CE-k ,其 CE ID 为 k ,收到远端 PE-m 发过来的 CE-m 的一个或多个标签块,根据 Kompella draft 规定, CE-k 连接到 CE-m 的标签必须满足以下两个条件:
( 1 ) LOm <= k < LOm + LRm  
然后从标签块 LBm/LRm/LOm 中选择标签,标签值为:
( 2 ) LBm+k - LOm     
公式( 1 )的右半部分很好理解,结合公式( 2 ),如果不能满足 k < LOm + LRm , CE-k 选用的标签将超出 LBm/LRm/LOm 标签块的范围。但为什么要求 LOm <= k ,其中包含着什么意义?事实上,理解了 LOm <= k ,也就理解了 Kompella 标签分配算法中隐含的思想。
根据前面的叙述, LOm 代表的是当前这个标签块之前 CE-m 的标签总和,也就是已经为 CE-m 分配掉的标签总数。要求 LOm<=k ,就是规定,标签与 CE ID 是一一对应的。所有标签块里的第一个标签是分为 CE 1 的;所有标签里的第二个标签,是分给 CE 2 的。如果 CE ID 大于 LOm ,那么说明这个 CE 已经无标签可分了。 CE ID 如果是不连续的,那么 LOm 里面的标签有些会空余出来,这些已分配标签留给谁用呢?当然是留给 CE ID 比 LOm 小的 CE 使用。这反映了 Kompella 标准设计者的一个默认假设,即,如果一个 CE ID 为 k ,那么从 0 到 k 的 CE ID 都应该会被应用,并因此为这些 CE 预留了标签。
这就提出了一个问题,如果在配置 CE ID 时,不按自然数顺序编号,而是跳跃性的配置,一些 CE ID 配置得特别大,就会导致跳跃区域的 CE ID 没有被使用,但系统仍然给其预留标签,从而浪费标签,这是标准所不乐见的。因此,用户在配置时,最好能对 CE 顺序分配 CE ID ,这样能作到最节省的使用标签。
要求 LOm <= k ,事实上反映了 Kompella 标准设计者的一个美好愿望:用户配置时,能顺序配置 CE ID ,这样标准中的标签分配算法就能作到最节省标签空间。
下面详细描述了计算 VC 标签的过程。假设 PE-k 本地有一个 CE-k , CE ID 为 k ,收到远端 PEm 为 CE-m 分配的一个标签块 LBm/LRm/LOm 。
首先检查从 PEk 收到 CEm 的封装类型是否与 CEk 的相同,如果不一致,停止处理;
检查是否 k=m ,如果是,报错 “CE ID k has been allocated to two CEs in ××× X (check CEm at PEk)” ,然后停止处理;
如果 CEm 有多个标签块,检查这些标签块是否有满足 LOm <= k < LOm + LRm ,如果任何一个标签块都不满足,报错 “Cannot communicate with CE m (PE A) of ××× X:outside range” 然后停止处理;
检查和 CE k 相关的所有的标签块是否有满足 LOk <= m < LOk + LRk ,如果任何一个标签块都不满足,报错 “Cannot communicate with CE m (PE A) of ××× X:outside range” 然后停止处理;
检查 PEk 和 PEm 之间的外层通道是否正常建立,如果没有就停止处理,这里假设为 LSP 隧道,标签为 Z ;对于外层隧道的判断决定了是否为一个 VC 计算 VC 标签,这一点与 L3××× 不同。如果外层隧道没有建立,就不应该为 VC 计算标签。
PEk 为 CE-m 分配内层出标签为 (LBm + k - LOm) , PEk 为 CE-k 分配内层入标签为 (LBk + m - LOk) ;
PEB 到 PEA 的外层隧道的标签为 Z ;
内外层标签都已经计算出来, VC 处于 UP 状态,可以用于二层报文的传输了。
我们分阶段来看一个例子:前提是 PE 之间都是通过 BGP 来交换标签块的信息。全部公网 LSP 隧道是正常 UP 的状态,我们只关心 VC 标签的计算。图中 CE1 的 CE ID 为 1 ,以此类推。在下面的例子中 CE22 是一个单独的 ××× ,并且没有建立任何连接,但是 PE1 同样会为 CE22 欲留一个标签块。