当
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
欲留一个标签块。