MPLS基本原理

MPLS概述:

传统IP路由转发

传统的IP转发采用的是逐条转发,数据报文经过每一台路由器,都要被进行解封装查看报文网络层信息,然后根据路由最长匹配原则查找路由表指导报文转发,这些流程导致了转发的性能低

特点:

所有路由器都需要指导全网的路由

IP头部不定长,处理效率低

传统IP转发是面向无连接的,无法提供较好的端到端Qos保证

MPLS-多标签协议交换:

位于TCP/IP协议栈中的数据链路层和网络层之间,可以向所有的网络层提供服务

原理:在数据链路层和网络层之间增加额外的MPLS头部,基于MPLS头部实现数据快速转发

MPLS术语

MPLS域:由一系列运行的MPLS的网络设备构成了MPLS域

LSR:标签路由交换器,支持MPLS的路由器,位于MPLS域边缘,连接其他网络LSR称为边沿路由器

LSR分类

入站LSR:向IP报文中压入MPLS头部并生成MPLS报文的标签路由交换器

中转LSR:将报文继续在MPLS域中转发的LSR

出站LSR:将MPLS报文中MPLS头部移除,还原为IP报文

FEC:转发等价类

指一组具有某些共性的数据流的集合,这些数据流在转发过程中被网络节点以相同方式处理

在MPLS网络中,FEC可以勇敢多种方式划分,比如用IP地址,网络掩码等

Ingress LSR决定数据所属的LSP

LSP:标签交换路径

标签报文穿越MPLS网络达到目的地所走的路径

同一个FEC的报文通常采用相同的LSP穿越MPLS域,所以对同一个FEC,LSR都是采用相同的标签转发

一条LSP包含一台入站LSR、一台出站LSR以及数量可变的中转LSR,因此LSP也可以看做是这些LSR的有序集合

LSP可以通过静态和动态两种方式建立

MPLS标签

IP报文进入MPLS域之前,,会被入站LSR压入MPLS头部标签,形成一个MPLS标签报文。一个标签报文可以包含多个MPLS标签

标签(Label):用于携带标签值,长度20bit

EXP(Experimental Use):主要用于CoS(Class of Service),长度3bit

S:如果该字段为1,则表示当前标签头部为栈底;如果该字段为0,则表示当前标签头部之后依然还有其他标签头部

TTL:用于当网络出现环路时,防止标签报文被无限制转发,与IP报文头部中的TTL具有相同的意义,长度8bit

MPLS标签栈

MPLS支持一层或多层标签头部,这些标签头部的有序集合被称为标签栈

最靠近二层头部的标签是栈顶标签,其中的S字段为零

最靠近IP头部的标签是栈顶标签,标签中的S字段为1

MPLS转发

概述:

MPLS转发的本质就是将数据归到对应的FEC并按照提前建立好的LSP进行转发

对于整个MPLS域,LSP是某一给定的FEC进入域和离开域的路径,可以看成是LSR的有序集合

对于单台LSR,需要建立标签转发表,用标签来标识FEC,并绑定相应的标签处理和转发等行为

同一个FEC,若进入MPLS域的入站LSR不同,转发时的LSP也不相同

标签转发表确定转发动作,LSR的转发动作决定了LSP,建立标签转发表也可以理解为建立LSP

MPLS体系结构:

MPLS体系结构是由控制平面和转发平面组成的

控制平面:

面向无连接,负责产生和维护路由信息以及标签信息

控制平面包括IP路由协议和路由信息表(用于选择路由),标签分发的协议和标签信息表(管理标签信息)

转发平面:

也是称为数据平面,是面向连接的,负责普通IP报文的转发以及带MPLS标签报文的转发

包括转发信息表,用于从路由信息表中提取必要的路由信息生成,负责普通IP报文的转发

包括标签转发信息表,负责带MPLS标签报文的转发

LSP建立的原则

当网络层协议为IP协议时,FEC所对应的路由必须存在于LSR的IP路由表中,否则该FEC的标签转发表项不生效

LSR用标签标识指定FEC,所以该FEC的数据被发送至LSR时,必须携带正确的标签,才能被LSR正确的处理

上游的LSR的出标签应该等于下游LSR的入标签

LSP建立方式

LSP分为静态和动态两种

静态LSP

用户通过手工为各个FEC分配标签而建立的(FEC是转发等价类)

不使用LSP标签发布协议,不需要交互控制报文,因此消耗资源比较小

不能根据网络拓扑变化动态调整,需要管理员干预

应用于拓扑结构简单且稳定的小型网络

前一节点出标签的值等于下一个节点入标签的值

由于静态LSP各节点上不能相互感知到整个LSP的情况,因此静态LSP是一个本地的概念

动态LSP

通过标签发布协议动态建立

标签发布协议,MPLS的控制协议,负责FEC的分类、标签的分发、LSP的建立和维护等一系列操作

LDP:标签分发协议,是常用的标签发布协议

应用于VPN上面,具有组网、配置简单、支持基于路由动态建立LSP、支持大容量LSP,也就是大规模拓扑

MPLS标签转发

LSR处理报文时主要是根据FTN、NHLFE和ILM

Tunnel ID:

为了给使用隧道的上层应用(如VPN、路由管理)提供统一的接口,系统自动为各种隧道分配了一个ID,称为Tunnel ID,长度为32bit,仅具有本地意义,即只需要在本地设备上唯一

FIB:

在IP网络中指导IP报文转发,从RIB中优选出的路由信息生成的,包含目的网段、出接口、下一跳IP地址等等

NHLFE

NHLFE用于指导MPLS报文的转发,包含Tunnel ID、出接口、下一跳、出标签、标签操作类型等信息,能够根据出标签找到对应的出接口和下一跳,进行报文转发。FEC与NHLFE的映射称为FTN(FEC-to-NHLFE),通过查看FIB表中Token值不为0x0的表项,能够获得FTN的详细信息。FTN只在Ingress存在

ILM

ILM是入标签与NHLFE的映射,它使得本地设备的入标签和出标签、Tunnel ID建立对应的对应关系。ILM在Transit节点的作用是将标签和NHLFE绑定。通过标签索引ILM表,就相当于使用目的IP地址查询FIB,能够得到所有的标签转发信息

Ingress LSR的处理,当IP报文进入MPLS域

1,Ingress LSR查看FIB标签,检查目的IP地址对应的Tuunel ID值是否为0x0,如果是,就进入正常的IP转发流程

2,不是0x0,就根据FIB表的Tunnel ID找到对应的NHLFE表项,将FIB表项和NHLFE表项关联起来

3,查看NHLFE表项,可以得到出接口、下一跳、出标签和标签操作类型

4,在IP报文中压入出标签,同时处理TTL,然后将封装好的MPLS报文发送给下一跳

当MPLS报文在域中转发时,Transit LSR的处理

Transit LSR根据MPLS的标签值查看对应的ILM表,得到Tunnel ID

根据ILM表的Tunnel ID找到对应的NHLFE表项

查看NHLFE表项,得到出接口、下一跳、出标签和标签操作类型,标签操作类型为Swap,则交换标签

Egress LSR的处理,当报文离开MPLS域时

Egress根据ILM查询到该标签对应的操作为Pop,说明需要剥离该标签

根据当前标签头部的下一层报文头部进行下一步处理

以上均为个人笔记,总结于华为有限技术公司学习资料和网络平台资源

如有问题,谢谢指正

### MPLS 工作原理 MPLS(多协议标签交换)是一种用于高效数据传输的技术,它通过引入标签机制来优化传统 IP 路由的方式。以下是关于 MPLS 的工作原理和技术细节: #### 1. 标签的概念与作用 MPLS 使用一个小整数作为 **标签** 来标记数据包[^1]。这些标签被附加到每个数据包头部,并在网络中的设备间传递。当数据包到达一个支持 MPLS 的路由器时,该路由器会根据标签值查找内部维护的转发表并决定如何处理这个数据包。 #### 2. 标签交换路径 (LSP) MPLS 中的核心概念之一是 **标签交换路径 (Label Switched Path, LSP)**。LSP 是一条预先定义好的虚拟路径,沿着这条路径,带有特定标签的数据包会被转发至目的地。这种预设路径减少了动态路由计算的需求,从而提高了效率[^4]。 #### 3. 设备角色划分 在 MPLS 网络中有两种主要类型的节点: - **入口边缘路由器 (Ingress Router)**:负责接收普通的 IP 数据包并将它们转换成带标签的形式进入 MPLS 域。 - **出口边缘路由器 (Egress Router)**:位于 MPLS 领域末端,移除标签并将原始 IP 数据包发送给最终目标地址。 中间经过的是 **标签交换路由器 (LSR, Label Switching Routers)** 它们只依据标签进行高速转发操作而无需深入解析整个报头信息[^2]。 #### 4. 协议独立性 尽管 MPLS 最初是为了改进 IPv4 网络性能设计出来的,但它并不局限于某一种具体的网络层协议。实际上,“多协议”意味着它可以承载不同种类的服务流量,比如 IPv6、IPX 或者 CLNP 等等[^3] 。因此无论底层实际运行何种通信方式,只要能够映射到合适的帧结构之上即可正常运作。 #### 示例代码展示简单模拟过程 下面是一个简化版 Python 函数用来演示基本思想——假设我们有一个简单的列表代表不同的阶段以及对应的操作函数: ```python def mpls_simulation(packet, ingress_router_func, lsr_funcs, egress_router_func): labeled_packet = ingress_router_func(packet) # Add label at Ingress for func in lsr_funcs: labeled_packet = func(labeled_packet) # Forward based on labels final_packet = egress_router_func(labeled_packet) # Remove label and send out return final_packet # Example usage of the simulation function with dummy functions. dummy_ingress = lambda p: f"Labeled({p})" dummy_lsr = lambda lp: f"Switched-{lp}" dummy_egress = lambda lp: f"Delivered {lp}" result = mpls_simulation("DataPacket", dummy_ingress, [dummy_lsr]*3 , dummy_egress ) print(result) # Output should show transformation through each step. ``` 此脚本只是抽象表示了从加标到最后交付的过程,并未涉及真实硬件层面的具体实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值