MPLS基础
PHP倒数第二跳弹出机制


PenultimateHop Poppoing,简称PHP,翻译为次末跳弹出或者倒数第二跳弹出,这是MPLS的一个基础性机制,下面我们来分析一下:

如果没有PHP机制?

上图中,ABC路由器都通过路由协议学习到30.0/24的路由,由于设备都激活了LDP,因此大家都会为30.0/24路由捆绑标签,并且将标签映射分发给自己的LDP邻居,从图中我们可以看到C为路由分配了标签301,B为路由分配了标签201。


现在A路由器收到一个目的地是30.0/24网络的IP数据包,经过FIB查表后将数据包压入标签201然后转发给B(注意,A发送标签数据给B,要压入的是B给分的标签),B收到这个标签包后,通过LFIB表(标签转发信息表)查找后将标签置换成301然后转发给C。


C收到这个标签包,先查LFIB表,发现要将标签弹出,于是它将标签弹出,弹出后发现是个IP报文,于是又去查FIB表,最终将这个IP数据包转发出去。C进行了两次查找动作。这显然降低了转发效率。其实标签可以在倒数第二跳(也就是在B)上弹出,如此一来C收到的就是一个IP数据包,它只需查找FIB表将收到的IP报文路由出去即可。

那么有了PHP机制呢?

有了PHP倒数第二跳弹出机制的话,路由器为本地的路由分配的标签就是一个特殊的标签值:3。当一台标签交换路由器收到一个标签包,在LFIB中进行查表时,若出站标签为3,则意味着需要将标签包的顶层标签弹出。


回到本例,C为本地的直连路由30.0/24所分配的标签为Well-Known(被保留的约定标签)标签3,它将标签映射传递给B。如此一来,B收到A发送过来的标签值为201的标签包,会将标签弹出得到IP包,再转发给C,如此C仅需对IP包进行FIB表的查询和转发即可,提高了转发效率。


LDP 在帧模式Frame Mode下(现在基本都用帧模式了),LSR会为本地路由捆绑标签值3,3是一个LDP保留的标签,叫做“impilict null隐式空”标签。
倒数第二跳弹出机制(PHP)有两种标签:


一是implicit null(隐式空),在LDP中标签值为3;另一个是explicit null(显式空),在LDP中标签值为0。


如果收到LDP邻居发送来的关于某条路由分配的标签值为3,则我发送前往该目标网段的数据给该邻居时,我会将该标签弹出,再将内层数据转给邻居。而如果邻居关于某条路由分配的标签值为0,那么本地在转数据给邻居时,会带上标签头(标签值为0的),一并发给邻居。


在MPLS视图下:

  • 使用“label advertise explicit-null”命令,可以让设备向倒数第二跳分配显式空标签;

  • 使用“label advertise implicit-null”命令(默认即开启)则会使得设备向倒数第二跳分配隐式空标签。

  • 使用“label advertise non-null”命令则相当于关闭PHP机制,使得设备正常分配标签而不使用空标签。

注意,如果收到一个标签包,标签为0,则直接弹出标签,并将数据交给FIB进行查找,不会有两次查找的损耗。标签为0的标签包,为什么不干脆将标签去掉,为什么还要保留这个为0的标签头呢?


这是为了在某种情况下保持网络规划的统一性,例如部署了MPLS的QoS,则需使用标签包中的EXP字段,那么就需要有标签。在实施QoS时,最后一跳必须携带exp位,因此标签不能被弹出。


大家有关MPLS的问题请直接在帖子下面留言吧~~~我们有专家团队在向您招手哦~~~别不好意思啦~~~


一指禅 戳戳戳!

(下载iPhone或Android应用“经理人分享”,一个只为职业精英人群提供优质知识服务的分享平台。不做单纯的资讯推送,致力于成为你的私人智库。)

作者:佚名
来源:华为产品资料