MPLS L3VPN为什么要使用两层MPLS标签?

MPLS L3VPN为什么要使用两层MPLS标签?
MPLS L3VPN为什么要使用两层MPLS标签?

如上图所示,这是一个MPLS L3VPN的实验拓扑。大家都知道,MPLS L3VPN是使用两层MPLS标签的。第一个问题,那如果只使用一层外层MPLS标签会出现什么问题呢?

回答:如果在R6(172.16.6.6)上ping R1(10.1.1.1),因为在R5上R5知道10.1.1.1这条路由属于BGP路由,所以R5将会为该ping包打上这条BGP路由的下一跳IP地址的MPLS标签,而BGP VPNv4路由10.1.1.0/24的下一跳IP地址显然是R2(2.2.2.2),于是该ping包在R5上会打上去往R2(2.2.2.2)的MPLS标签。

R4收到这个带有MPLS标签的ping包时会查LFIB,然后根据LFIB的指示转发给R3。R3收到这个带有MPLS标签的ping包后会Pop Label(弹出一层MPLS标签,正常的次末跳弹出行为),然后转发给R2。所以这个纯的IP数据包到了R2上R2就懵逼了:这个ping包的目的IP地址是10.1.1.1,而R2没法判断这个ping包是要转发给R1还是R7,因为R1和R7上都有10.1.1.0/24的LAN网段。

当然啦,R2的全局路由表上也不可能会存有CE的路由,所以就算R7没有10.1.1.0/24的LAN网段,R2也不知道这个ping包该发往哪儿。

其他相关文章:

第二个问题,现在肯定有人会问:MPLS L3VPN不是用RD值来区分路由了么(64bit的RD值 + 32bit的IP地址 = 96bit的VPNv4地址)?怎么还区分不出来目的IP地址是10.1.1.1的数据包到底是要去往R1的还是去往R7的?

回答:首先,在控制层面确实是用RD值来区分路由的,但这仅仅只是控制层面,VPNv4路由是没法在数据层面上真正地去做路由转发的。正是因为数据包的目的IP地址只能是IPv4或者IPv6地址,不能是VPNv4地址,所以R2上收到一个目的IP地址是10.1.1.1的数据包它还真就懵逼了,数据包里没有存有RD值和VPNv4地址等相关信息来帮助R2转发数据包。

从全局的角度来说,我们现在也只有IPv4和IPv6的路由表,你可不会在路由器里面看到一个能用来进行数据转发的VPNv4路由表,并没有show vpnv4 route这种命令。所以,RD值(和VPNv4路由)仅仅只是在控制层面区分路由,数据层面的数据包转发只能靠IPv4路由表、IPv6路由表、FIB(如果开启了IP CEF)和MPLS。

其他相关文章:

RD值只在控制层面区分路由,不能用于数据层面的转发了,那第三个问题:MPLS L3VPN的两层MPLS标签又是如何工作的呢?

回答:首先,外层MPLS标签的工作方式就是我在第一个问题的回答里描述的那样,所以该问题只会详细描述内层MPLS标签是如何工作的。

如果只有一层外层MPLS标签,在R6(172.16.6.6)上ping R1(10.1.1.1),数据包到了R2,因为所有的MPLS标签都弹出了,所以R2只能根据数据包的目的IP地址去FIB里查找,显然R2的全局路由表里不会有CE的路由(如果你了解CEF转发机制你就知道,FIB是路由表的拷贝,他们是同步的);就算有,R2也不知道要转发给R1还是R7。所以,内层MPLS标签要解决的就是这个问题:PE如何把数据包转发给CE。

内层MPLS标签要解决的就是这个问题:PE如何把数据包给CE
内层MPLS标签要解决的就是这个问题:PE如何把数据包给CE

如上图所示,PE还会给CE上来的路由分配MPLS标签,而且是一条VPN路由分配一个MPLS标签。当R2把这些VPNv4路由发给R5时,同时还把这些MPLS标签也发了过去(上图中的2001、2002和2003就是R2为R1的三条CE路由分配的MPLS标签,2004、2005和2006就是R2为R7的三条CE路由分配的MPLS标签)。

于是,在R6(172.16.6.6)上ping R1(10.1.1.1),数据包到了R5,R5会压两层MPLS标签:

  1. 内层是R2给R1的路由10.1.1.0/24分配的MPLS标签(如上图画的那样,该内层MPLS标签就是2001)
  2. 外层是R4给R5分配的去往2.2.2.2/32路由的MPLS标签,2.2.2.2是BGP中VPNv4路由10.1.1.0/24的下一跳IP地址。

所以,当外层MPLS标签在R3上弹出后,R2还将看到编号为2001的内层MPLS标签,这个时候R2就知道这个数据包要转发给R1而不是R7。

总结,以在R6(172.16.6.6)上ping R1(10.1.1.1)为例子举例:

外层MPLS标签 内层MPLS标签
谁分配的 R4(与之相连的P) R2(对端PE)
哪个协议分配 LDP BGP
FEC,转发等价类
(或标签分配对象)
R4上看,每条IGP路由就是一个FEC❶

R5上看,每条BGP路由的下一跳就是一个FEC❷

每条CE路由就是一个FEC
具体为哪个IP地址分配的MPLS标签 2.2.2.2,对端PE的BGP指定的下一跳IP地址(next-hop-self) 10.1.1.0/24,R1里的CE路由
作用 帮助数据包穿越MPLS域 帮助R2(对端PE)把数据包转发给CE

注释:

  • 注❶:在R4上看,R4给R5分配的关于2.2.2.2/32路由的MPLS标签,是R4为IGP路由2.2.2.2/32分配的MPLS标签,然后该MPLS标签发给了R5(即每一条IGP路由就是一个FEC);
  • 注❷:在R5上看,R5之所以会为该ping包打上2.2.2.2/32路由的MPLS标签是因为这是VPNv4路由10.1.1.0/24的下一跳IP地址(即每条BGP路由的下一跳就是一个FEC)。虽然这个MPLS标签是R4发给它的,但我们说的是FEC(转发等价类)嘛。

其他相关文章:

 

通过实验来验证上面的描述:

一、以下是上述实验拓扑的traceroute测试:

在R1(10.1.1.1)上 traceroute R6(172.16.7.6),可以看到具体的MPLS标签的变化。

MPLS L3VPN为什么要使用两层MPLS标签?ping包测试
MPLS L3VPN为什么要使用两层MPLS标签?ping包测试

如上图所示,外层MPLS标签都是一样的(两次ping都是3002和4000),而内层MPLS标签都不一样(两次ping,一次5001,一次5002)。

  • 外层MPLS标签都一样是因为R2上的VPNv4路由172.16.7.0/24和172.16.8.0/24的下一跳IP地址都是5.5.5.5/32,所以都是借用去往5.5.5.5/32的MPLS标签穿越MPLS域到达R5(对端PE)的。
  • 内层MPLS标签都不一样是因为R5(PE)上会给每条VPN路由分配一个MPLS标签,所以去往172.16.7.0/24的内层MPLS标签是5001,而去往172.16.8.0/24的内层MPLS标签是5002。

二、现在我们使用show命令去详细地跟踪每一跳,看每一跳MPLS标签的具体变化

在跟踪每一跳前,还得说清楚一个问题:R5给R2发的BGP的VPNv4路由都包含了什么?

回答:因为R5(PE)上会给每条CE路由分配一个MPLS标签,所以R5的BGP除了要通告每条VPN路由的VPNv4地址、每条VPN路由的下一跳IP地址和每条VPN路由携带的RT值给R2(对端PE)以外,还要通告R5为每条VPN路由分配的MPLS标签

VPNv4路由更新基本包括以下四个组成部分:

VPN路由的MPLS标签    VPNv4地址(RD值+IP地址)     下一跳     RT
            5000          100:6:172.16.6.0    5.5.5.5    6:6

使用show bgp vpnv4 unicast all labels命令就可以查看这些VPN路由的MPLS标签:

MPLS L3VPN为什么要使用两层MPLS标签?show bgp vpnv4 unicast all labels
MPLS L3VPN为什么要使用两层MPLS标签?show bgp vpnv4 unicast all labels

如上图所示,R5上为R6(CE)中的172.16.6.0/24、172.16.7.0/24和172.16.8.0/24路由所分的MPLS标签分别是5000、5001和5002。

注意:

  • 虽然实验拓扑中有R7和R8,但是为了省事儿我没配置R7和R8,因为用R1和R6就已经能说明问题了;
  • R2上我为R1配置的RD值是100:1,R5上我为R6配置的RD值是100:6。

现在开始跟踪每一跳,首先,R2具体是如何压制两层MPLS标签的呢?

回答:当R2收到一个来自R1的目的IP地址为172.16.7.6的ping包时,R2首先判断这个数据包是从CE来的,查相应VRF的FIB得知要压两层MPLS标签,内层MPLS标签为5001,外层MPLS标签为3002。

R2将ping包发给R3,ping包带有两层MPLS标签:
┏━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ ICMP ┃ D : 172.16.7.6 ┃  S : 10.1.1.1  ┃  Label : 5001  ┃  Label : 3002  ┃
┗━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛
(注:上面的图是拿字符画的,手机上一自动换行就乱了,如果出现了变形,请在电脑上观看,下同)

接着,R3和R4又是如何转发的?

回答:当ping包到达R3后,因为这是带有MPLS标签的数据包,所以R3查LFIB(如下图所示)。

MPLS L3VPN为什么要使用两层MPLS标签?R3上show mpls forwarding-table
MPLS L3VPN为什么要使用两层MPLS标签?R3上show mpls forwarding-table

由上图可知,R3将数据包的外层MPLS标签从3002替换成4000后,数据包将从Et0/0.34接口发出去,下一跳是34.1.1.4,也就是转发给R4。

R3将ping包发给R4,ping包带有两层MPLS标签:
┏━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ ICMP ┃ D : 172.16.7.6 ┃  S : 10.1.1.1  ┃  Label : 5001  ┃  Label : 4000  ┃
┗━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛

ping包到了R4上,因为这还是带有MPLS标签的数据包,所以R4还查LFIB(如下图所示)。

MPLS L3VPN为什么要使用两层MPLS标签?R4上show mpls forwarding-table
MPLS L3VPN为什么要使用两层MPLS标签?R4上show mpls forwarding-table

由上图可知,R4将数据包的外层MPLS标签4000弹出后,数据包将从Et0/0.45接口发出去,下一跳是45.1.1.5,也就是转发给R5。

R4将ping包发给R5,ping包带有一层MPLS标签:
┏━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ ICMP ┃ D : 172.16.7.6 ┃  S : 10.1.1.1  ┃  Label : 5001  ┃
┗━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛

最后,R5又是如何处理这个ping包的?

回答:ping包到了R5上,因为这还是带有MPLS标签的数据包,所以R5还查LFIB(如下图所示)。

MPLS L3VPN为什么要使用两层MPLS标签?R5上show mpls forwarding-table
MPLS L3VPN为什么要使用两层MPLS标签?R5上show mpls forwarding-table

因为R2上打的内层MPLS标签是5001,所以R5查LFIB后会根据LFIB来执行下一步的处理。由上图可知,R5会弹出所有的MPLS标签(No Label),同时数据包将从Et0/0.56口发出去,下一跳是56.1.1.6,也就是转发给R6。

R5将ping包发给R6,此时的ping包是纯的IP数据包了:
┏━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ ICMP ┃ D : 172.16.7.6 ┃  S : 10.1.1.1  ┃
┗━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛

此时,数据包就转发到目的地上了。

 

本文完。如有疑问,欢迎在下方留言;如本文有什么错误,欢迎在下方留言指正,谢谢。

Was this article helpful?

Related Articles

Leave A Comment?

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据