两层MPLS标签技术的VPN功能更加光彩夺目,内层标签用于提供VPN服务,而外层标签则为骨干网上传输提供了便捷。
为什么这么说?
MPLS的起源
90年代中期,TCP/IP技术日益成熟,推动了互联网的飞速发展。在TCP/IP协议体系中,IP报文的转发主要依靠路由器查找路由表来实现。在大型网络中,路由器中的路由表都非常庞大,并且路由表的查找算法是最长匹配算法,所以在路由表中查找到精确路由的计算量非常大。而当时由于硬件技术的限制,路由器主要通过软件方式来查找路由表,效率很低,这就导致路由器的IP转发性能低下,这也成为了当时限制互联网发展的主要瓶颈。
为了适应网络的发展,ATM(Asynchronous Transfer Mode)技术应运而生。ATM采用定长标签,并且只需要维护比路由表规模小得多的标签表,能够提供比IP路由方式高得多的转发性能。然而,ATM协议相对复杂,且ATM网络部署成本高,这使得ATM技术很难普及。
ATM技术虽然没有成功,但其中的几点心法口诀却属创新:
摒弃了繁琐的路由查找,改为简单快速的标签交换;
将具有全局意义的路由表改为只有本地意义的标签表。
MPLS的创始人“label大师”充分吸取了ATM的精华,将自己定位在第2. 5层的位置。为了不得罪其他帮派,宣称本帮是“multiprotocol”,来者不拒,也可以承载其他帮派的报文。
在经过一年多的招兵买马、上下打点之后,于1997年的武林大会上正式宣布本帮成立,并命名为MPLS(Multiprotocol Label Switching)。
MPLS武功心法——基于标签转发
MPLS阵法图
MPLS帮的弟子一直修炼一套独有阵法,所有进入该阵的报文必须领得通关令牌(标签)。该阵法分为内外两层,外层由功力较低的入门弟子担当(LER),在IP报文冲阵时负责接收IP报文,查找标签转发表后给IP报文分配令牌(打标签,PUSH),在IP报文出阵时对报文进行令牌回收(弹出标签,POP),按IP路由进行转发。
内层由功力高强的弟子组成(LSR),负责对标签报文进行快速的令牌交换操作(标签交换,SWAP)。
该阵法所使用的令牌(标签Label)是一个只具有本地意义的标识符,通过绑定过程与FEC相映射。MPLS标签的长度为4个字节,封装在链路层和网络层之间,可以支持任意的链路层协议。这里提到的FEC是在转发过程中以相同方式处理的一组数据分组,
MPLS创始人在秘笈中本来规定:可以通过地址、隧道、COS等来标识创建FEC,只可惜后辈弟子大多资质愚钝,不能理解其中的精妙之处,所以我们现在看到的MPLS中只是一条路由对应一个FEC。
通常在一台设备上,对一个FEC分配相同的标签。举个例子,匹配3.3.3.9/32路由的报文,MPLS会为其分配一个标签。所有使用该路由进行转发的报文,都将被封装同一个标签值,然后进入MPLS网络进行转发。
需要明确的是,在MPLS阵法中,数据流所走的路径就是标签交换通道LSP(Label Switched Path)。
报文结构
MPLS标签共有4个字段:
Label:20bit,标签值域。
Exp:3bit,用于扩展。现在通常用做CoS(Class of Service),当设备阻塞时,优先发送优先级高的报文。
S:1bit,栈底标识。MPLS支持多层标签,即标签嵌套。S值为1时表明为最底层标签。
TTL:8bit,和IP报文中的TTL意义相同。
标签栈(Label Stack)是指标签的排序集合。如下图所示,靠近二层首部的标签称为栈顶MPLS标签或外层MPLS标签(Outer MPLS label);靠近IP首部的标签称为栈底MPLS标签或内层MPLS标签(Inner MPLS label)。理论上,MPLS标签可以无限嵌套,从而提供无限的业务支持能力。这是MPLS技术最大的魅力所在。
标签产生
有了标签,转发是很简单的事,但是如何生成标签,却是MPLS中最难修练的部分。在MPLS中,有一个叫LDP(Label Distribution Protocol)的秘笈,是一个动态的生成标签的协议。下面我们来介绍一下LDP如何生成标签。
上图是比较常见的一种标签分配方式。标签由数据流经的LSP上的下游LSR分配,按从下游到上游的方向分发。如上图,Egress告诉Transit说:如果你要转发到3.3.3.9/32的数据给我,你就为报文加上标签X。接着Transit又向Ingress说:如果你要转发到3.3.3.9/32的数据给我,你就为报文加上标签Z。
LSR(Transit)设备上的标签转发信息:
这里的IN和OUT,是相对于标签转发设备而言,不是相对于标签分配设备,总结一个心法口诀就是:
入标签是我分给上游设备的,出标签是下游设备分给我的。
我分配的标签是给上游设备用的,由上游设备添加到报文中。
MPLS报文转发过程
在MPLS标签分配完毕之后,一条转发报文的LSP就建立完成了。LSP上的每个设备在收到报文之后根据标签进行转发。还是用上面这个例子,Ingress节点收到目的地址为3.3.3.9的IP报文,压入标签Z并转发。Transit节点收到带标签Z的报文,进行标签交换,替换为标签X并转发报文。Egress节点收到该报文后弹出标签,变为IP报文,而后将其转发给目的地3.3.3.9/32。
MPLS高阶心法——PHP倒数第二跳弹出
MPLS帮派中有个弟子PHP,他天资聪颖且富有创新精神,他经过对MPLS阵法的深入研究,发现本帮的这门绝学虽然暗合天数、精妙无比,但并非没有可改进之处。
在阵法的出口处,Egress LSR本应变MPLS转发为IP路由查找,但是他收到的仍旧是含有标签的MPLS报文,按照常规,这个报文应该送交MPLS模块处理,而此时MPLS模块不需要标签转发,能做的只是去掉标签,然后送交IP层。所以对于Egress LSR来说,处理MPLS报文是没有意义的,最好能够保证他直接收到的就是IP报文。这就需要在Egress LSR的上游(倒数第二跳)就把标签给弹出来。
但关键问题是:上游设备如何知道自己是倒数第二跳呢?其实很简单,在倒数第一跳为其分配标签时做一下特殊说明即可(分配一个特殊的标签值3)。
经过几次实战检验,效果很好,遂正式以自己的名字命名为:PHP(Penultimate Hop Popping),倒数第二跳弹出。
上一篇:什么是SD-Branch安全性?
下一篇:软件定义网络(SDN)的多种含义