在传统的IP网络中,路由器转发数据包的方式是逐跳查找。当一个数据包到达路由器时,路由器会剥开IP包头,取出目的地址,然后去路由表中做一次最长前缀匹配。这里的核心问题是,IP地址是变长的、层次化的,路由器每转发一个包,都要执行一次相对复杂的地址查找算法。在网络规模不大、路由表条目不多的时候,这种逐跳查找的代价可以接受;但当骨干网络的路由表膨胀到几十万条甚至上百万条时,每一次查找的延迟都会叠加,转发效率就成为了瓶颈。
正是在这样的背景下,业界开始思考一个问题:能不能不查路由表就转发?标签交换的思想由此而来。它的思路非常简单——给每个数据包贴上一个短而固定长度的标签,路由器转发时不再去解析那串复杂的IP地址,而是直接查一张标签表,看到某个标签就立刻把它换成另一个标签,然后从对应的接口发出去。这就好比在物流分拣中心,工作人员不看收件人的详细地址,只看包裹上贴的分拣编号,编号对应哪条传送带就丢到哪条传送带,速度自然快得多。
MPLS的全称是Multi-Protocol Label Switching,即多协议标签交换。这里的"多协议"是它的关键定位:MPLS并不绑定某一种网络层协议,它既可以封装IPv4,也可以封装IPv6,甚至可以直接封装二层帧,因此它被称作一种承载技术或者隧道技术。它工作在传统意义上的第二层和第三层之间,所以业界常把它称作"第2.5层"协议。理解这个"2.5层"的定位,是理解MPLS一切特性的起点。
软考网络工程师的真题中,最经典的一道题就是问MPLS包头的位置应该插在哪里。这道题之所以年年出现,是因为它直接考察考生对协议栈层次关系的理解。MPLS的标签头,也就是MPLS包头,它的位置是在二层帧头和三层IP头之间。更精确地说,在一个以太网封装的数据包中,从外到内的顺序是:以太帧头、MPLS标签头、IP头、TCP或UDP头、应用数据。
这个位置安排有着精妙的设计。如果MPLS标签放在IP头前面,那么入口路由器在打标签的时候,就不需要去理解IP头内部的内容,只需要知道"这个包要往哪个方向去"即可。反过来,如果MPLS标签放在二层帧头前面,那它就和物理链路强绑定了,无法跨不同的二层技术。放在帧头和IP头之间,恰好让MPLS既能被底层各种链路技术承载,又能对上层各种网络层协议透明。
题目中给出的几个干扰选项,正好反映了考生的常见误解。选项"以太帧头的前面",本质上是把MPLS当成了二层技术的一部分;选项"IP头与TCP头之间",是把MPLS当成了网络层内部的扩展;选项"应用数据与TCP头之间"则彻底混淆了层次。正确答案永远是:以太帧头与IP头之间。这个知识点值得牢牢记住,它是MPLS这一节送分率最高的一道题。
要把MPLS学透,首先要把一组核心术语彻底搞清楚。第一个术语是FEC,即Forwarding Equivalence Class,转发等价类。它指的是一组被以完全相同方式转发的数据包。所谓"相同方式",包括相同的出口、相同的优先级、相同的下一跳。在MPLS体系中,属于同一个FEC的数据包会被贴上同一个标签。理解FEC是理解标签语义的关键:标签代表的不是某一个具体的包,而是"这一类包该如何转发"这个抽象的规则。
第二个术语是LSR,即Label Switching Router,标签交换路由器。凡是支持MPLS、能够依据标签进行转发的路由器,都叫LSR。LSR又分为两种角色:位于MPLS域边缘的称为LER,即Label Edge Router,标签边缘路由器;位于域内部的则直接称为LSR。LER的作用非常特殊,它是标签的"入口"和"出口":数据包进入MPLS域时,由入口LER负责压入标签;离开MPLS域时,由出口LER负责弹出标签。
第三个术语是LSP,即Label Switched Path,标签交换路径。它是一条从入口LER出发、经过若干中间LSR、最终到达出口LER的转发路径。需要注意的是,LSP是单向的。从A到B建立了一条LSP,并不意味着从B到A也自动有一条LSP,反向通信需要单独建立一条方向相反的LSP。LSP的这个单向性,是命题人喜欢设置陷阱的地方。
这三个术语之间的关系可以这样把握:FEC定义"什么包走什么路",LSR是"执行转发的设备",LSP是"包实际经过的路"。三者共同构成了MPLS的完整转发体系。理解了这三者的分工,后面讲标签分发、讲转发流程,都会变得顺理成章。
MPLS标签本身是一个固定32位的字段,由四个部分组成。第一部分是Label标签值,占20位,这是标签的核心,取值范围理论上从0到2的20次方减一。第二部分是EXP,占3位,用于承载流量类别信息,为QoS服务。第三部分是S,占1位,称为栈底标志位,用于标识这个标签是否是标签栈的最后一个。第四部分是TTL,占8位,即生存时间,用于防止数据包在MPLS网络中无限循环,作用与IP头中的TTL完全一致。
这里要特别讲一下标签栈的概念。MPLS允许一个数据包同时携带多个标签,这些标签像栈一样层层堆叠,形成一个标签栈。栈底的标签由S位标识,S位为1表示这是最后一个标签。标签栈的存在让MPLS具有了强大的表达能力,它是MPLS VPN能够实现多层封装的技术基础。在典型的MPLS VPN场景中,数据包往往同时携带两层标签:内层标签标识具体属于哪个VPN用户,外层标签用于在骨干网络中逐跳转发。外层标签会随着转发不断交换,内层标签则相对稳定,一直保留到出口。
标签的另一个关键特性是它的局部性。同一个标签值,在不同的LSR上代表完全不同的含义。也就是说,标签只在相邻的两个LSR之间有意义,它是局部的、临时的。这一点与IP地址的全局性截然不同。理解了标签的局部性,就能理解为什么需要标签分发协议——因为每个LSR都必须和它的邻居协商好"我用哪个标签代表哪个FEC",这个协商过程就是标签分发。
MPLS的转发过程,可以归纳为三个基本动作:Push压入、Swap交换、Pop弹出。这三个动作贯穿了一个数据包在MPLS域中的完整旅程,是软考选择题和案例分析题反复考察的核心。
当一个IP数据包到达MPLS域的入口LER时,入口LER首先根据目的地址判断它属于哪个FEC,然后执行Push动作——把对应的标签压入到数据包的标签栈中,也就是在IP头前面插入一个标签。这就是标签的诞生过程。Push动作只发生在入口LER上,中间的路由器是不会做Push的。
数据包进入域内后,被转发给第一个中间LSR。这个LSR收到带标签的包,不再查看IP地址,而是直接查自己的标签转发表。它找到这个入标签对应的表项,执行Swap动作——把入标签替换成出标签,然后从表项指定的接口转发出去。所谓"标签交换",指的就是这个Swap动作,标签在每一跳都被换掉,所以叫"交换"。中间LSR做的事情非常纯粹:查入标签、换出标签、转发。
当数据包到达MPLS域的出口LER时,出口LER执行Pop动作,把标签从数据包上剥掉,恢复成普通的IP数据包,然后交给常规的IP路由继续转发。Pop动作只发生在出口LER上。至此,一个数据包完成了它在MPLS域内的完整旅程:Push进入、Swap中转、Pop离开。
这里有一个非常值得深挖的优化机制,叫做倒数第二跳弹出,英文缩写PHP,即Penultimate Hop Popping。它的动机是:出口LER如果既要剥标签、又要查IP路由表做最终转发,就会做两次查找,成为性能瓶颈。于是MPLS规定,在距离出口LER还差一跳的那个路由器上,就可以提前把标签弹出,这样出口LER收到时已经是不带标签的纯IP包,直接查路由表转发即可,省去了一次标签查找。倒数第二跳弹出是MPLS转发机制中一个非常经典的优化设计,考生要能准确说出它的名称和动机。
前面说过,标签只在相邻LSR之间有意义,那么每个LSR如何知道自己该用哪个标签呢?答案就是标签分发协议。最常用的一种是LDP,即Label Distribution Protocol,标签分发协议。LDP的职责,就是让LSR之间相互通告"我为你这个FEC分配的标签是什么",从而在整条路径上逐步建立起标签转发表,最终形成一条端到端的LSP。
LDP的工作机制建立在TCP连接之上,它使用两个相邻LSR之间的会话来交换标签映射消息。LDP的工作流程大致是:每个LSR为自己路由表中的每一条路由前缀分配一个本地标签,然后把这个"标签到FEC的映射"通告给它的LDP邻居;邻居收到后,把它作为自己的出标签记录下来,同时再为自己的转发分配一个入标签。这样逐跳传递,标签映射就沿着路由路径传播开来,LSP便随之建立。
需要特别理解的是标签分发的方向问题。标签交换的方向是数据转发的方向,也就是从入口到出口;而标签分发的方向,通常是从下游到上游。所谓下游,是指数据流去的方向。下游路由器为某个FEC分配标签,并把这个标签通告给上游路由器,上游路由器用这个标签作为自己的出标签。这就是LDP中最常见的分发模式,称为下游自主模式,即Downstream Unsolicited,下游路由器不等上游请求就主动通告。与之相对的还有下游按需模式,即Downstream on Demand,下游路由器只有收到上游的明确请求时才通告标签。
与分发方向相关的还有两个重要概念。一个是标签保持方式:自由保持模式,即Liberal Rete
本篇完!