2.2 转发的基本原理
基于MPLS的流量工程(修订版)
表2-1通过术语和定义简单介绍了一下MPLS。这一节将会把这些概念结合起来作更深入的介绍。
2.2.1 什么是标签
如你所料,标签是多协议标签交换的一个组成部分。标签使得路由和转发可以分离,这样便于灵活地进行处理。
什么是标签?在定义标签之前,应该知道MPLS可以在两种模式下工作:
帧模式。
信元模式。
1.帧模式
帧模式是指在分组的第三层分组头(例如IP分组头)前加入标签进行转发。
RFC 3031,“多协议标签交换体系结构”,定义了标签的概念,“短的固定长度的物理邻接的标识,用来识别FEC,通常局部有效”。
简而言之,标签就是加入数据分组的数值,用来标识数据分组走向。标签是一个20位的数值,也就说可以有220个可能的标签值,数量超过了1 000 000。
一个分组可以有多级标签,形成一个标签栈。标签栈就是一系列的标签在分组中组成的。在网络中的每一跳,只有最外层的标签起作用。用于LSR数据平面分组转发的标签是通过控制平面分配的。因此,在中间节点中内层标签无关紧要。
标签加入数据分组时,20位的标签值本身和其他一些信息进行编码,协助分组在网络中转发。
图2-1描述了MPLS分组头的编码格式。
这个32位的数据就是一条标签栈项,往往称为标签。所以在讨论标签时,可能是20位的标签,也可能是32位的标签栈项。额外的12位将会在下面介绍。
EXP——EXP位是用来保留做试验使用的。Cisco IOS(还有很多MPLS实现)使用这些EXP位保存QoS标识,通常是直接从后面的IP分组的IP优先级位拷贝而来。当MPLS分组进入队列时,EXP位就可以发挥和IP优先级位一样的作用。第6章中有详细的介绍。
S——S位是栈底标志位。因为栈里可以(通常)有多个标签,栈底标签会把S位置1,其他标签S位置0。这样就可以通过判别S位识别出栈底。
TTL——TTL位是直接对IP TTL头的拷贝(有时不是)。在每一跳都会把TTL减1,这样可以防止由环路引起的无限数据风暴,和IP TTL作用一样。TTL也可以是其他的值。网络管理员为了防止外部网络通过路由跟踪了解内部网络拓扑结构,会采用其他的值。
注意:
在某些情况下,例如出于安全的考虑或者为了满足SLA(Service-Level Agreement)要求(尽管给人一种欺骗的印象),需要把提供商的核心网信息与用户群隔离起来。可以在Cisco路由器上使用no mpls ip propagate-ttl{ forwarded local}命令。当这条命令带有转发选项时,只会作用在经过这台路由器的流量上。这样可以在*traceroute命令中使用TTL定位核心网的问题。
2.信元模式
信元模式是指在ATM LSR组成的MPLS网络中,在控制平面使用MPLS交换VPI/VCI信息,而不是采用ATM信令。
在信令模式下,标签编码在信元的VPI/VCI字段(见图2-2)。在控制平面完成标签交换后,入口路由器在转发平面把数据报分割成ATM信元,然后加入合适的VPI/VCI值后,转发出去。中间点的ATM LSR和普通ATM交换机一样——根据进入数据报的VPI/VCI和进入端口的信息进行转发。最终,由出口路由器重新把信元组装成数据分组。
信元模式也称为标签控制的ATM(Label-Controlled ATM,LC-ATM)。LC-ATM的标签发布将会在2.2.6节深入讨论。信元模式的讨论是出于完整性的考虑。本书的MPLS流量工程并不要了解此概念,因为在Cisco路由器上的MPLS TE不支持信元模式。
注意:
在本章一些关于MPLS的例子中,你将会注意到ATM VPI/VCI值出现在出标签栏中。这些例子都是ATM上的MPLS交换的例子,在ATM接口上MPLS控制平面完成VPI/VCI的交换,在此接口上的下游邻居期望在收到的信元中看到这个VPI/VCI值。
3.帧模式和信元模式下的ATM
如你目前所了解的,ATM交换机可以作为LSR使用。当ATM交换机作为核心网的一部分时,可以以两种方式操作:
帧模式。
信元模式。
当建立一条常规的ATM PVC用来实现基于ATM的经典IP(例如aal5snap封装),而MPLS也通过这条PVC传送,这种方式称作帧模式的MPLS。为了更容易理解,可以参考MPLS头格式,也就是图2-1中的标签栈项。
图2-2表示MPLS标签和第二三层分组头的关系。在PPP和LAN分组头中,标签都被插入在第二三层分组头中间(例如以太和IP之间)。这一层称作垫层(shim header)。当处理帧模式的MPLS时,你就会看到垫层。当通过ATM PVC连接路由器时,在经典IPoA(IP-over-ATM)环境运行MPLS时也会看到这一层。
如果运行在信元模式,ATM LSR在控制平面完成路由器的功能。换句话说,需要运行IGP协议交换路由信息,如OSPF,还要运行标签分配协议,如TDP或者LDP。
注意:
你也许认为ATM交换机仅仅传送ATM信元,因此只要是在MPLS核心网的ATM交换机,都必须进行像ATM LSR那样运行,这只是在信元模式下而已。这是不对的。因为可以用ATM交换机建立路由器间的常规的点到点的PVC连接。这样PVC任何一端的路由器都可以直接和LSR相连。在进行数据传送时,首先要在数据分组加上MPLS头,然后再把整个分组(包括IP头和MPLS头)分为ATM信元。当这些信元到达PVC的另一端路由器时,再重新组装成分组。如果需要继续转发,转发就依据标签头中的标签值。这样,即使MPLS分组分解为了ATM信元,也没有从MPLS标签到ATM信元的VPI/VCI字段之间的映射。因此,这会认为是帧模式。
2.2.2 控制平面和数据平面
控制平面进行LSR之间的路由信息和其他控制信息(如标签绑定)的交换。MPLS是控制平面驱动的协议,也就是说在当第一个数据分组转发前先要进行控制信息的交换。数据分组的转发是在数据平面进行的。
2.2.3 分类
当IP分组到达LER(入口路由器)时,和普通IP转发一样,根据接收分组的目的IP地址在FIB表中进行最长匹配查找。在MPLS术语表中,这个过程称为对分组分类。这一节将会介绍术语FEC(Forwarding Equivalence Class,转发等价类),也就是分类是在哪里进行的以及它和传统IP网的分类有什么不同。
1.转发等价类(FEC)
如果入口路由器收到的分组都是到达同一子网的,则这些分组就属于同一类——这是依据FIB中的最长匹配查找决定的。例如,假设在FIB表中有一项目的地址为171.68.0.0/16,下一跳地址为12.12.12.12。如果你收到了两个目的IP地址分别是171.68.1.1和171.68.23.5的分组,这两个分组都会转发给同样的下一跳——12.12.12.12。一般来说,可以说171.68.1.1和171.68.23.5属于同一个FEC。
FEC的分类可以不仅仅依据接收分组的目的IP地址。FEC分类也可以依据分组到达的接口、IP分组头中优先权、分组目的端口号,或者你能想象的其他任何机制。无论分类的依据是什么,所有归于同一FEC的分组都得到同样的处理。处理可以是通过某一路径进行转发、在核心网中优先处理或者是丢弃分组。现在Cisco IOS不需要其他如路由策略的辅助,直接支持根据目的IP地址进行分类。
如果把MPLS术语翻译成IP术语,那么FEC就是FIB中和到来的分组最匹配的一条路由(也称为地址前缀)。
2.边界处理
在传统IP网络中,分组的转发是基于其目的IP地址的。传送路径上的每一个节点都根据IP分组中的目标IP地址进行转发。也就是说路径上的每个节点都要对分组进行分类。这将会在2.2.5一节进行讨论。
在基于MPLS的转发中,网络边缘的入口路由器进行分组分类后,会把和相应FEC对应的标签加入数据分组。这个过程称为加标签或者标签入栈。核心网中的LSR不再需要对分组进行重新分类。当核心路由器收到分组后,进行三项处理:
根据入标签进行查找。
找到分组的出接口和出标签。
进行标签交换,然后在出接口发送分组。
这个过程称为标签交换。
LSR是如何知道下游LSP的标签呢?这是通过标签分配协议(LDP、RSVP、BGP等)在控制平面进行标签绑定交换进行的,这个过程是在分组转发之前进行的。
三种基本的标签操作(入栈、交换和出栈)满足了MPLS的所有需求。标签的入栈/出栈和转发对任何复杂的分类方式都是允许的,但是需要边界路由器有很强的处理能力,而核心路由器只需要完成简单的分组转发。
2.2.4 MPLS网络中的控制平面
这一节讲解分组在IP网络和MPLS网络的传送过程。
对于IP和MPLS网络来说,考虑图2-3所示的网络拓扑结构。这表示一个服务提供商的网络,其中的7200a和7200b作为网关路由器,7500a和12008c分别是它们的EBGP对应端。AS1中的核心路由器(12008a和12008b)仅仅是作为IBGP对应端。
要在这个网络中传送数据分组,首先要建立控制平面机制。
在IP网络中,控制平面机制的构成如下:
内部网关协议(Interior Gateway Protocol,IGP)——大多数服务提供商网络使用OSPF或者IS-IS。也可以是EIGRP,RIP或者静态路由。
边界网关协议(Border Gateway Protocol,BGP)——用来发布从外部邻居学习到的路由。图2-3中7200b和12008c之间运行扩展BGP(EBGP)。7200b把从AS1中所有路由器学习到的路由发布过去。在本例中,7200b把其他的所有路由器都作为了IBGP邻居,在实际网络中,经常使用路由反射器(Route Reflector,RR)。重要的一点是AS1中的所有路由器都需要学习来自7200b的路由。
在MPLS网络中,控制平面机制如下所示:
IGP——和在只有IP的网络中的用途相同。如果MPLS网络使用了流量工程,IGP会作为链路状态协议,可以是OSPF或者IS-IS。因为本例中没有考虑流量工程,所以IGP没有什么作用。
标签分配协议——MPLS网络中三个主要的标签分配协议分别是:
标记分配协议(TDP)。
标签分配协议(LDP)。
RSVP。
RSVP在流量工程中使用,本例不涉及。TDP和LDP实际是两个不同版本的同一种协议,TDP版本老一些,LDP已经标准化了。因此假设采用LDP进行标签分配。
标签分配是什么意思?标签绑定是把标签和地址前缀(路由)联系起来。LDP协同IGP一起把所有的非BGP路由分配的标签绑定关系发布给它的邻居。LDP邻居关系通过LDP链路建立。因此,当图2-3中12008a和12008b建立LDP邻居关系时,它们就会互相交换它们为学习到的IGP路由的分配的标签,但是不会交换从7200b学到的BGP路由。
BGP——这里介绍MPLS和非MPLS网络之间的主要区别。BGP仅仅在网络边界使用,而不需要每个路由器都使用。7200b只有7200a一个对端,而不是三个BGP对端(7200a,12008a和12008b)。
为什么核心网不需要BGP?因为入口路由器运行了完整的BGP,它知道所有通过BGP路由学习到的路由的下一跳。标签是根据分组的BGP下一跳对应加入到分组中的,然后通过MPLS把分组传送到下一跳。在2.2.5一节将会详细介绍这个问题。
由于大规模的IBGP互联可以通过路由反射器或者路由组解决,所以如果配置合理,可以很好地控制BGP的规模。但是,有些人不愿意在核心网运行BGP。外部网络的路由变化会导致核心网不稳定,越少使用BGP,需要的管理就越少。有些情况下,核心网因为某种原因仍然需要运行BGP,例如为了运行多播。
2.2.5 转发机制
这一节介绍IP网络和MPLS网络转发的不同之处。将会使用一个提供商网络的例子来澄清这个概念。因此,需要阅读关于Cisco路由器中FIB在转发中的作用的相关内容。这一节介绍了FIB、LIB和LFIB表在支持MPLS的网络中转发分组的作用。
1.MPLS和IP
RFC3031定义了MPLS的结构。MPLS转发和IP转发的不同之处在于:
IP转发是基于目的IP地址和FIB的。
MPLS转发是基于MPLS标签和标签转发信息库(LFIB)的。
MPLS转发和IP转发都是逐跳转发。IP转发在每一跳都对分组进行识别分类,而MPLS转发只在入口路由器进行分类。
图2-4是一个典型的ISP主干网,外部路由通过EBGP学习,然后通过IBGP全连接在核心路由器进行分发。(路由反射器或路由组在无法实现全连接IBGP的大型网络中使用。)路由171.68.0.0/16是通过网关路由器7200b从外面学习到。核心中的所有路由器通过IBGP学习到此条路由。同样,核心路由器通过IGP路由协议学习到的路由知道如何到达对方,例如通过OSPF或者IS-IS。
注意:
虽然服务提供商可以在主干网选择OSPF或者IS-IS作为IGP路由协议,但是MPLS转发并不关心你使用哪种IGP。对于流量工程来说,需要运行IS-IS或者OSPF(参见的第3章可以了解具体原因),但是如果不使用流量工程,也可以使用任何IGP。
在图2-4中,7200a是接收发往目的网络172.68.0.0的数据分组的入口路由器。例2-1列出了7200a上的路由表(RIB)的内容。你可以看到,172.68.0.0/16这条路由项是7200a通过IBGP学到的外部路由。
注意:
172.168.0.0是通过IBGP学到的路由,而不是通过EBGP学到的路由,因为在表中的管理距离字段(administrative distance field)是200,表明这是一条IBGP学到的路由,如果是EBGP学到的路由,管理距离应该是20。
例2-1 路由器7200a上的路由表
7200a#show ip route
Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
* - Candidate default, U - per-user static route, o - ODR
Gateway of last resort is 7.1.5.1 to network 0.0.0.0
B 171.68.0.0/16 [200/0] via 12.12.12.12, 01:10:44
3.0.0.0/32 is subnetted, 1 subnets
当开始转发数据分组时,7200a查找通过路由表建立的FIB。例2-2中列出了7200a上为171.68.0.0/16建立的FIB表项。
例2-2 7200a上为171.68.0.0/16建立的FIB
7200a#show ip cef 171.68.0.0
171.68.0.0/16, version 69, cached adjacency to POS3/0
0 packets, 0 bytes, wccp tag 139
via 12.12.12.12, 0 dependencies, recursive
next hop 10.0.3.5, POS3/0 via 12.12.12.12/32
valid cached adjacency
现在你已经查看了7200a上RIB和FIB的内容,知道控制信息已经经过了交换,7200a可以转发目的网络171.68.0.0的数据。同样地,核心网的每台路由器都建立了转发表(本例中的12008a和12008b)。下一步,你将会了解到转发是怎样一步步进行的。
假设一个目的地址为171.68.1.1的IP分组到达入口路由器(图2-4中的7200a)。当分组到达进入端口后,路由器查找FIB表。将目的地址171.68.1.1和FIB表项进行比较,进行最长项匹配选择。作为查找的结果,入口路由器(7200a)知道分组最终要从7200b(出口路由器)离开网络。其中,包括要把分组转发到直接相连的邻居之一,本例中是12008a。这个过程将会不断重复直到分组到达出口。图2-5表示下一跳路由器12008a查找FIB表转发数据分组。注意12008a在转发表中有两个出接口,这样可以进行负荷分担。
由于你对IP转发很熟悉,也许会的认为分组到达网络出口点的方式是理所当然的。进一步观察,在转发路径上的每一台路由器,都会在FIB中进行最长匹配并查找目的地址的下一跳路由器。
现在看看图2-6,核心网进行的是MPLS转发。网关路由器之间运行的是IBGP,核心路由器不运行IBGP。在完成IGP汇聚后,7200a学到了7200b的回环地址12.12.12.12。同时,LDP也在汇聚。最后,7200a收到了来自12008a的标签12323,和7200b的环回地址12.12.12.12对应。12008a收到来自12008b类似的标签12324。12008b收到来自7200b的POP标签,因为它是倒数第二跳路由器,负责弹出顶层标签。
通过TDP/LDP和RSVP发布的标签一般来说都是局部链路有效——也就是说只是在两个邻居之间,而不会像OSPF或者IS-IS进行泛洪。也就是说12008a发布的映射12.12.12.12/32的12323标签和12008a收到的12324没有关系,不同的是12008a会把入标签12323和出标签12324关联起来。换句话说,如果12008b可能发布给了12008a标签42967或者41243,而12008a仍然可能发布标签12323。
下面,我们来看一下数据平面。假设目的地址是171.68.1.1的数据分组从7200a进入网络,7200a仍然查询FIB表,因为到来的是IP分组。不同的是7200a要加标签。在FIB表中进行最长匹配,如果这时核心网还没有建立MPLS转发,7200a会确定数据分组最终要转发给7200b——数据分组的出口。现在在FIB表项中有一项标签,目的地为7200b的数据分组都要打上此标签。如图2-6中出标签栏里表示的值,正好是12323。例2-3列出了7200a上的FIB表。如果注意到突出显示的输出部分,你就会发现在核心网使用MPLS转发后,出现了标签字段。也就是说,如果7200a收到一个需要发往12.12.12.12的IP分组或者标签为36的MPLS分组,7200a都会把它的标签改为12323,然后从POS 3/0端口上以MPLS分组的形式发送出去。图2-7表示分组进入12008a核心路由器后的情况。此时分组是带有标签12323的MPLS分组。
例2-3 在启用MPLS转发后,7200a上为171.68.0.0建立的FIB表项
7200a#show ip cef 171.68.0.0 detail
171.68.0.0/16, version 1934, cached adjacency to POS3/0
0 packets, 0 bytes
tag information from 12.12.12.12/32, shared
local tag: 36
fast tag rewrite with PO3/0, point2point, tags imposed {12323}
via 12.12.12.12, 0 dependencies, recursive
next hop 10.0.3.5, POS3/0 via 12.12.12.12/32
valid cached adjacency
tag rewrite with PO3/0, point2point, tags imposed {12323}
对MPLS还不了解的读者往往想知道路由器是如何分辨MPLS分组和IP分组的。如果你了解路由器是如何区分IP分组和IPX分组的,你就知道了问题的答案。在二层封装中IP或IPX的包头包含了一个协议类型字段。在LAN中,被称为以太类型。在PPP封装中,网络控制协议(NCP)标识出承载的三层的数据分组类型。对MPLS分组来说,已经定义了新的以太类型和NCP。它们列在表2-2中。
12008a不再需要查看第三层IP地址。它只需要简单地查找LFIB表,得知可以从两个地方发送入标签为12323的MPLS分组,一个是打上标签12324从POS 1/0发送,一个是VPI/VCI为1/19从ATM 3/0.1发送。为什么这个入标签有两条路径呢?因为有到目的地的两条等价路由——一条经过POS,一条经过ATM。12008a在POS 1/0使用帧模式转发。在ATM 3/0.1使用信元模式,信元中VPI/VCI的值为1/49。下面的讨论将集中在通过POS 1/0的帧模式转发。信元模式的转发将会在“标签分配概念”一节中讨论。本章中,术语标签,在信元模式的MPLS上下文中指ATM VPI/VCI。
当标签值为12324的分组从POS 1/1进入12008b后,处理和在12008a中的一样,查找LFIB表,如图2-7所示。但是因为12008b是倒数第二跳路由器,它从7200b接收的是POP标签,所以它直接弹出12324标签,露出IP包头,直接把分组发送给7200b。要注意的是,分组的目的地址是171.68.1.1,由于12008a和12008b没有配置BGP,所以它们的RIB/FIB中都没有和此地址有关的表项。当分组进入7200b时,由于分组是IP分组,所以进行FIB查找。因为7200b是网关(边缘)路由器,运行了BGP,通过EBGP学习到了171.68.0.0的路由。因此,它直接把分组进行了转发。
例2-4列出了路由器12008a用来转发标签分组的LFIB表。为了把分组转发到网络171.68.0.0,分组要先送到12.12.12.12(7200b)——出口路由器。上游路由器,如7200a,根据对应的下一跳地址12.12.12.12(7200b)加上12323标签。注意,在例2-4明显标识的部分,标签12323在本地栏(Local column)的下面,这是因为它是12008a为FEC 12.12.12.12分配的标签,并把此标签发布给了它的上游邻居7200a。
例2-4 12008a上的LFIB表
12008a#show mpls forwarding
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
12318 Pop tag 10.0.57.0/24 0 PO1/0 point2point
1/43 10.0.57.0/24 0 AT3/0.1 point2point
12319 12320 10.0.86.0/24 0 PO1/0 point2point
1/44 10.0.86.0/24 0 AT3/0.1 point2point
12320 12321 10.1.1.1/32 0 PO1/0 point2point
1/45 10.1.1.1/32 0 AT3/0.1 point2point
12321 12322 10.1.1.2/32 0 PO1/0 point2point
1/46 10.1.1.2/32 0 AT3/0.1 point2point
12322 12326 16.16.16.16/32 0 PO1/0 point2point
1/51 16.16.16.16/32 0 AT3/0.1 point2point
12323 12324 12.12.12.12/32 575 PO1/0 point2point
1/49 12.12.12.12/32 0 AT3/0.1 point2point
12324 12325 13.13.13.13/32 0 PO1/0 point2point
1/50 13.13.13.13/32 0 AT3/0.1 point2point
12325 12327 17.17.17.17/32 144 PO1/0 point2point
如例2-4所示中的输出,120008a有两条到达12.12.12.12(7200的回环接口)的通路。
在MPLS转发中,和IP转发类似,要查询CEF表(和FIB一样)。如果到下一跳有多个出口链路,就可以实现负载均衡,如例2-5所示,突出显示的部分说明12008a进行了负荷分担。
例2-5 路由器12008a的CEF表表明对MPLS分组进行了负荷分担
12008a#show ip cef 12.12.12.12 internal
12.12.12.12/32, version 385, per-destination sharing
0 packets, 0 bytes
tag information set, shared
local tag: 12323
via 10.0.5.11, POS1/0, 0 dependencies
traffic share 1
next hop 10.0.5.11, POS1/0
unresolved
valid adjacency
tag rewrite with PO1/0, point2point, tags imposed {12324}
via 10.0.4.11, ATM3/0.1, 1 dependency
traffic share 1
next hop 10.0.4.11, ATM3/0.1
unresolved
valid adjacency
tag rewrite with AT3/0.1, point2point, tags imposed {1/49(vcd=65)}
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
Load distribution: 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 (refcount 2)
Hash OK Interface Address Packets Tags imposed
1 Y POS1/0 point2point 0 {12324}
2 Y ATM3/0.1 point2point 0 {1/49}
3 Y POS1/0 point2point 0 {12324}
4 Y ATM3/0.1 point2point 0 {1/49}
5 Y POS1/0 point2point 0 {12324}
6 Y ATM3/0.1 point2point 0 {1/49}
7 Y POS1/0 point2point 0 {12324}
8 Y ATM3/0.1 point2point 0 {1/49}
9 Y POS1/0 point2point 0 {12324}
10 Y ATM3/0.1 point2point 0 {1/49}
11 Y POS1/0 point2point 0 {12324}
12 Y ATM3/0.1 point2point 0 {1/49}
13 Y POS1/0 point2point 0 {12324}
14 Y ATM3/0.1 point2point 0 {1/49}
15 Y POS1/0 point2point 0 {12324}
16 Y ATM3/0.1 point2point 0 {1/49}
refcount 5
如例2-5所示,目的地址是12.12.12.12的分组在12008a上通过两条链路进行了负荷分担。负荷分担默认标准是对每一对源宿地址。也就是说对分组的目的地址和源地址进行了散列(hash)变换。结果是使用了16个桶中的一个。你也可以通过配置出接口打开每个分组的负荷分担。
2.FIB,LIB和LFIB以及它们在MPLS转发中的作用
如果想知道FIB、LIB和LFIB表之间的关系,这一节总结了它们的功能和构造过程。
FIB只对IP分组有效,因此只有进来的分组是IP分组时才查找FIB。进来的分组是IP分组,出去的分组则不一定是。如果分组的目的地址已经有了标签绑定,分组就进行MPLS转发。在12008a的CEF表中查找目的地为12.12.12.12的表项(如例2-5)告诉你出去的分组是IP分组还是MPLS分组。如果找到和CEF表项对应的入栈标签,那出去的分组就是MPLS分组。
在7200a中,目的地址12.12.12.12的出标签是12323。这样在进入下一跳路由器12008a的分组中就带有MPLS标签。此时在12008a上将会查找LFIB。例2-6表示如果收到一个带有标签12323的MPLS分组,它将会把它交换到ATM 3/0.1端口上,VPI/VCI为1/49,或者交换到POS 1/0端口上,标签为12324。
例2-6列出和12.12.12.12对应的LFIB片断。
例2-6 120008a上和12.12.12.12对应的LFIB表片断
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
12323 12324 12.12.12.12/32 575 PO1/0 point2point
1/49 12.12.12.12/32 0 AT3/0.1 point2point
现在假设MPLS分组交换到标签为12324的POS链路上。
标签从哪里来的呢?在LSR之间标签可以通过多种方式发布。如果使用LDP或者TDP协议,标签绑定将会在LSR和它们的邻居间进行。这些信息储存在LIB中。你可以使用show mpls ip bindings address命令来查看LIB的内容。在例2-7中,你可以看到LIB中保存12.12.12.12标签绑定的内容。
例2-7 查看LIB的内容
12008a#show mpls ip binding 12.12.12.12 32
12.12.12.12/32
in label: 12325
out label: 36 lsr: 4.4.4.4:0
out label: 12324 lsr: 11.11.11.11:0
out label: 37 lsr: 3.3.3.3:0
out vc label: 1/49 lsr: 11.11.11.11:2 ATM3/0.1
Active ingress 1 hop (vcd 18)
注意,在例2-7中,LIB中有几个远程绑定,但是转发表中只给出了两项。这是因为只有从当前IGP的下一跳路由器收到的绑定才有效,当时所有这些绑定都会保留在Cisco路由器中,因为它们都配置成自由保留模式(liberal retention mode,将会在“自由和保守保留模式”一节讨论)。请看例2-8,12008a中目的地址为12.12.12.12的路由表项。
例2-8 12008a中目的地址为12.12.12.12的路由表项
12008a#show ip route 12.12.12.12
Routing entry for 12.12.12.12/32
Known via "ospf 100", distance 110, metric 3, type intra area
Last update from 10.0.4.11 on ATM3/0.1, 00:41:50 ago
Routing Descriptor Blocks:
* 10.0.5.11, from 12.12.12.12, 00:41:50 ago, via POS1/0
Route metric is 3, traffic share count is 1
10.0.4.11, from 12.12.12.12, 00:41:50 ago, via ATM3/0.1
Route metric is 3, traffic share count is 1
Route metric is 3, traffic share count is 1
要了解如例2-6所示的标签12324和1/49如何成为到达12.12.12.12的出标签,请看例2-8中目标地址为12.12.12.12的下一跳信息,下一跳地址为10.0.5.11和10.0.4.11(在例2-8中已经明显标识出来)。顺便提一下,这两个下一跳正好是到12008b的两条链路,而12008b的路由器ID是11.11.11.11。利用这些信息,再参考例2-7的LIB中12008a从11.11.11.11收到的标签绑定信息,就可以分别找到在POS 1/0和ATM 3/0.1上的标签12324和1/49。
表2-3总结了输入分组和输出分组类型和转发使用的表类型。
2.2.6 标签分配的概念
前一节详细介绍了FIB表和LFIB表建立后转发的过程。这一节介绍标签绑定发布的各种方法。
标签发布时,实际发布的内容是标签、IP前缀和掩码长度。一般来说整个过程称为标签发布,而不是标签、前缀和掩码发布。
要理解LSR发布产生和标签的过程,首先要了解RFC3031中的一些术语。
1.有序方式和独立方式
就生成标签而言,无论采用什么控制方式,LSR都是独立地产生标签,而和收到的标签没有关系。如你所预料的,有一些保留的标签值用来进行控制或者有特殊的意义。
标签值0到15是保留的。所以最小的标签号可以用来映射IP前缀的值是16。因为标签空间是20位的,所以可以见到的最大的标签值是220−1,即1048575。只要标签值在16和1048575之间就是合法的。
当前RFC3032中只定义了16个保留标签中的4个,“MPLS标签栈编码”:
0——IPv4显式空标签。
1——路由器警告标签。
2——IPv6显式空标签。
3——隐式空标签。
除了MPLS边缘应用外,在路由中只为IGP学到的前缀路由(包括静态路由)生成标签。为什么不为BGP学到的路由分配标签呢?因为这是根本不需要的。对于IPv4路由(非MPLS VPN中),如果出口路由器把BGP路由的下一跳设为自己,只需要一个标签以及一条为BGP路由下一跳建立的IGP路由。例如,图2-6中7200b学到的外部路由171.68.0.0。通过把自己设为下一跳,7200b把到171.68.0.0路由的下一跳设为12.12.12.12(7200b的BGP路由ID和回环地址),然后再通过IBGP把171.68.0.0发布到7200a。因为进行了IGP路由交换和标签发布,7200a就有了到12.12.12.12的标签。如果目的网络地址是171.68.0.0的分组使用这个标签,分组最终就通过MPLS转发到达7200b。而并不需要为171.68.0.0分配标签。所有发往171.68.0.0的分组都转发到12.12.12.12,然后正常地路由IP分组。
LSR产生和IP前缀相关的标签后,有两种方式进行发布:
有序LSP控制方式(Ordered LSP control mode)——LSR收到从下游邻居发来的标签绑定后,才把自己的标签发往它的上游邻居。
独立LSP控制方式(Independent LSP control mode)——LSR可以自由地把标签绑定到上游或者下游邻居进行发布,而不需要等待接收下游邻居的标签绑定。
LDP在基于帧模式的网络中使用独立LSP控制方式,在信元模式网络中使用有序LSP控制方式,RSVP使用有序LSP控制模式。
2.下游自主和下游按需分配模式
在自主标签分配方式中,路由器把IGP所有前缀的标签发给它的邻居,而不管它们是否进行了请求。因为标签发布并不会决定路由,所以路由器把它所有前缀的标签发给邻居并没有关系,即使它的邻居不会把发布的路由作为路由的下一跳使用也没有关系。LDP不是路由协议,它是借助消除循环的路由协议来确定路由的(虽然在LDP中有循环检测和防止机制)。图2-8描述了路由器12008a和12008b查找RIB,然后为所有的IGP路由分配标签的过程。然后它们自主地把这些路由发布给它的邻居。
大多数情况下自主模式工作得很好。但是,在ATM的标签发布中,根据请求标签的邻居数量,可能会需要向同一目的IP地址/掩码发布多个标签。当ATM不支持VC聚合(VC Merge,在“VC聚合”一节中讨论)就会出现这种情况。现在,就会明白ATM LSR对同一目的地址前缀,随着邻居数量的增加,对每一个目的地址前缀都要分配新的标签,而不是同一目的地址前缀使用多个标签。如果一个ATM LSR有500条路由,12个邻居,那么它就要发布500 × 12 = 6000个标签。在信元模式下标签就是VPI/VCI,因此,有限的VPI/VCI空间很快就会消耗殆尽。所以,ATM并不处理没有被请求的标签。这种方式就是下游按需分配方式(DoD)。
在DoD方式下,由LSD决定是否需要获得某一地址前缀的标签。确定之后,LSR就会向它的下一跳(下游邻居)请求标签。即使它可能已经生成问题中前缀的标签,下游邻居直到它从自己的下游收到标签绑定之后才会把自己的标签绑定发送给上游邻居。这个过程持续到倒数第二跳LSR向LER(LSP中的出口LSR)发出标签请求。之后,标签绑定从下游向上游传送——这就是下游按需分配方式。图2-9描述了DoD模式的标签发布。
图2-9中,入口路由器7200a为地址12.12.12.12向ATM LSR ls1010a发送了标签请求。然后ls1010a向右边的出口LSR(路由器)7200b发送了标签请求。出口LSR以值为1/130的标签映射进行回应。在ls1010a收到绑定后,它也发送标签1/125(标签映射)给7200a,当IP分组进入7200a时,它被分解为VPI/VCI值为1/125的Aim信元(在MPLS控制平面进行交换的),发送到ls1010a。ls1010a进行标签交换(VPI/VCI),信元的VPI/VCI改为标签值1/130发出。
标签范围(VPI/VCI)和ATM LSR使用的VPI是可以配置的。
注意:
在ATM网络中没有所谓的“MPLS信元”。ATM LSR并不区分是MPLS产生的ATM VPI/VCI,还是其他ATM信令协议产生的VPI/VCI。对ATM的交换硬件来说,收到的信元都作为ATM信元对待。如果收到的信元具有特定的VPI/VCI值,它会被交换到另外一个具有特定VPI/VCI值的端口上。MPLS派生的ATM VPI/VCI值和ATM信令协议派生的VPI/VCI的区别是在控制平面一层处理的。
3.自由标签保留模式和保守标签保留模式
当LSR收到来自非路由下一跳的邻居的标签绑定关系时,它可以选择保留这些标签,以便将来这些邻居成为它的下一跳的邻居时使用。这种方式称为自由标签保留模式(liberal label retention mode)。如果LSR丢弃当前不使用的标签绑定关系,这被称为保守标签保留模式(conservative label retention mode)。自由标签保留模式在LIB表中占用更多的空间,但是收敛速度快。这是因为当通往下一跳邻居的链路发生失效时,不用等到路由重新收敛,就可以使用标签绑定。保守标签绑定关系正好相反,节省了LIB的空间,但是收敛慢。目前Cisco IOS路由器使用的是自由标签保留模式。
4.标签空间
LSR可以产生具有全局空间(global space,有时也称为单平台空间,per-platform space)或者接口空间(interface space)的标签。有时,单词作用域(scope)可以用空间(space)代替,所以全局标签空间和全局标签作用域是可以互换的术语。全局空间中,路由器为特定目的地地FEC产生唯一的标签,而和任何特定的入接口没有关系。LSR也可以产生对于接口或者端口唯一的标签,把相应的标签绑定发往上游节点。这种就称为局部接口标签空间(Per-interface label)。只要LSR能够区分来自不同接口的分组,局部接口空间就不会产生问题。Cisco路由器在帧模式下使用全局空间,而在信元模式中使用局部接口空间,ATM交换机使用局部接口标签空间以便保留VPI/VCI空间。
牢记这些概念和应用的环境。如果理解了下列协议,就会很容易地理解标签分配模式。表2-4做了总结。
5.信元模式特性
信元模式的MPLS有一些局限性:
ATM头没有承载TTL字段。
不支持PHP。
ATM LSR不支持路由累加。
不适用TTL,ATM在核心网使用是如何防止持久的路由循环呢?解决这个问题的两部分是:
在信元模式的MPLS网络中,LDP在LSP的LDP信令交互中使用路由跳计数TLV。因为ATM LSR不能在每一跳都减少TTL值 ,所以在信元模式的MPLS网络出口,路由器要把TTL减掉在信元网络中的跳数。
LDP的路径向量(path vector)TLV保存了在信元网络中LSP经过的所有路由跳的列表信息。路径向量用来在控制平面进行环路检测。例如,在路径向量中一个LSR出现了两次,这条LSP肯定出现了环路,而不应该再使用。
注意:
帧模式网络中不使用LDP路径向量和跳计数TLV,因为标签中的TTL在每一跳都会递减,和IP分组头一样,当TTL值为0时,分组就停止转发。
如果入口LSR确定分组无法通过核心网,那么入口LER就应该向数据分组源发送一条“ICMP不可达TTL到时”的消息。
ATM LSR不支持PHP,因为这样需要ATM LSR发送不带顶层标签的分组,也就是说发送不带VPI/VCI的信元,在ATM中这当然是不可能的。
虽然ATM LSR需要在控制平面运行路由协议,但是不用执行路由累加操作。因为如果要进行路由累加操作则需要进行IP查找。ATM LSR能够进行IP查找,但是这需要把信元重新组合成整个分组。这样ATM交换机就成了路由器,这是ATM交换机所不擅长的。
在信元模式下,ATM LSR通过建立控制VC(默认的是VCI/VPI 0/32)来交换所有的控制信息。
例2-9列出了和ATM交换机进行信元通信的路由器的输出信息。
例2-9 信元模式下路由器上的ATM VC表
gsr4#show atm vc
VCD / Peak Avg/Min Burst
Interface Name VPI VCI Type Encaps Kbps Kbps Cells Sts
5/0.1 1 0 32 PVC SNAP 622000 622000 UP
5/0.1 84 1 61 TVC MUX 622000 622000 UP
5/0.1 85 1 62 TVC MUX 622000 622000 UP
5/0.1 86 1 63 TVC MUX 622000 622000 UP
5/0.1 87 1 64 TVC MUX 622000 622000 UP
5/0.1 88 1 65 TVC MUX 622000 622000 UP
5/0.1 89 1 66 TVC MUX 622000 622000 UP
5/0.1 90 1 67 TVC MUX 622000 622000 UP
5/0.1 91 1 68 TVC MUX 622000 622000 UP
5/0.1 92 1 69 TVC MUX 622000 622000 UP
5/0.1 93 1 70 TVC MUX 622000 622000 UP
5/0.1 94 1 71 TVC MUX 622000 622000 UP
例2-9中突出显示的文本表示了在VPI/VCI 0/32上建立的MPLS控制VC。其他标为TVC的叫做标记VC(tag VC,也称为标签虚电路,Label Virtual Circuits[LVC]),它们是通过控制VC交换标签绑定而建立的。TVC用来传送组合为MPLS分组的数据信元。
例2-10来自于ATM交换机(LS1010),这个交换机和例2-9中的gsr4的ATM5/0端口相连。LS1010 ATM交换机上的输出和gsr4上的输出类似。同样,突出显示出了在VPI/VCI 0/32上建立的控制VC。
例2-10 在ATM LSR上的ATM VC表
ls1010-18#show atm vc interface a1/0/0
Interface VPI VCI Type X-Interface X-VPI X-VCI Encap Status
ATM1/0/0 0 32 PVC ATM2/0/0 0 55 SNAP UP
ATM1/0/0 1 61 TVC(I) ATM2/0/0 0 71 MUX UP
ATM1/0/0 1 62 TVC(I) ATM1/1/0 42 81 UP
ATM1/0/0 1 63 TVC(I) ATM1/1/0 42 82 UP
ATM1/0/0 1 64 TVC(I) ATM1/1/0 42 83 UP
ATM1/0/0 1 65 TVC(I) ATM1/1/0 42 84 UP
ATM1/0/0 1 66 TVC(I) ATM1/1/0 42 85 UP
ATM1/0/0 1 67 TVC(I) ATM1/1/0 42 86 UP
ATM1/0/0 1 68 TVC(I) ATM1/1/0 42 87 UP
ATM1/0/0 1 69 TVC(I) ATM1/1/0 42 88 UP
ATM1/0/0 1 70 TVC(I) ATM1/1/0 42 89 UP
ATM1/0/0 1 71 TVC(I) ATM1/1/0 42 90 UP
6.VC聚合
在图2-10中,ATM LS,ls1010a有两个上游路由器,7200a和7500a,一个下游邻居7200b。在DoD模式下,ls1010a从7200b接收地址前缀12.12.12.12的标签绑定1/130。因为ls1010a有两个上游邻居,它就为12.12.12.12生成了两个标签,1/125和1/128。Ls1010a把标签1/125送给了7200a,把标签1/128送给了7500a。当7200a和7500a把属于IP分组1和2的信元发送出去后,ls1010a通过标签交换把所有的这些信元都交换到标签为1/130的接口0上发送出去。这样路由器7200b上就会出现问题,因为收到的信元是无序的,所以无法正确的把信元组合成IP分组。7200b没有办法区分哪些信元是属于分组1的,哪些是属于分组2的。
图2-11描述了解决图2-10中问题的一种方法。Ls1010a可以向7200b请求两个标签,对每个标签进行映射然后发给上游邻居。现在,当7200b收到属于IP分组1和IP分组2的信元时,就可以毫无疑问地进行组装,因为属于IP分组1的信元使用值为1/130的标签,而属于IP分组2的信元都使用值为1/140的标签。使用这种方法带来的问题是会在ls1010a和7200b之间使用额外的VC,如果ATM LSR使用有限的VPI/VCI空间时就需要考虑此问题。
图2-12举例说明了VC聚合。在此例中,在IP分组1没有全部发送完之前,ls1010a会缓存属于IP分组2的所有信元。现在7200b可以先完成属于IP分组1的信元组装,然后再接收属于IP分组2的信元。这样就不存在无序的信元了。
注意1010a并不会对收到的信元进行IP查找。ls1010a并不关心分组的内容,它只是进行缓存,以便实现VC聚合。