MPLS virtual private network报文转发过程

2024-04-27 15:32

本文主要是介绍MPLS virtual private network报文转发过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述:

首先数据流由CE 到PE使用的是IP转发,这个很容易理解。而数据流要经过骨干网,因为骨干网内部Р路由器没有私网路由,也就是没办法使用P转发,这时就应该想到用MPLS标签转发技术。在IP报文进入到MPLS骨干网的PE后封装上一个公网标签,该标签对应着穿越整个公网的LSP,数据包通过LSP隧道转发到出站的 PE,中间的P路由器只使用标签交换转发方式,而不需要IP转发,数据包的入站PE和出站PE同时使用了IP转发和标签转发。

那公网中的LSP是如何建立的?它是由LDP协议通过为公网中的IGP路由映射标签,然后进行分发标签等过程后来建立的。

当数据包到达出站PE时,因为是从公网的接口接收到的数据包,所以还必须使用一个VPN标签(私网标签)用于判断数据包通过哪个VPN实例进行转发。私网标签在前文中有提到过,它是由MP-BGP 协议生成的,每条VPN路由都会有一个私网标签,出站的PE可以借私网标签知道该向哪个VPN转发数据。

所以,在 VPN的业务数据通过MPLS 骨干网时会带上两层标签(公网标签和私网标签),公网标签位于外层,用于使数据包穿越整个公网发送到出站的 PE;私网标签位于内层,用于判断该数据包属于哪个VPN实例。下面从三个阶段具体分析整个数据转发的过程:

  1. 数据从CE到入站PE。
  2. 数据从入站PE到出站PE。
  3. 数据从出站PE到远端的CE。

阶段一:数据从CE到入站PE

如图所示,Site2去往Site1的业务数据由CE2转发到PE2(普通IP转发〉后,PE2根据数据包进入的接口,查找相应的VPN实例转发表,找到该路由在公网的下一跳(对端PE的 Loopback接口)和私网标签。封装完私网标签(MP-BGP分配)后,再通过公网的标签(MPLS分配)转发表,查找到去往公网中下一跳地址的标签,该标签作为公网标签封装进数据包,封装完两层标签后,数据包被转发进 MPLS 网络。
在这里插入图片描述

阶段二:数据从入站PE到出站PE

在这里插入图片描述
如图所示,在前文有说到,当IP报文由入站PE进入MPLS网络后会通过LSP转发,并且通过中间的P设备查找标签转发表进行标签交换,最终通过公网LSP转发到出站的PE。

注意:数据包实际转发时不会携带3号标签,这里出现3号标签是为了方便表述原理。

阶段三:数据从出站PE到远端的CE

当数据包由MPLS骨干网转发到达出站PE时,只剩下一层私网标签,这是因为PHP(倒数第二跳弹出)的原因,公网标签已经在倒数第二跳的Р设备剥离掉了。出站PE利用该私网标签判断出该数据包去往的VPN实例,在查找到相应的VPN实例转发表后,移除该私网标签,将报文还原为IP报文后再转发给CE,如图所示:
在这里插入图片描述
至此,客户通过MPLS VPN完成了私网站点之间的流量转发,可以发现VPN业务的数据流是经过骨干网的LSP隧道方式进行转发的从而保证了客户数据的安全性。

这里需要强调的是,传递VPN业务数据流时需要使用到两层标签(私网标签+公网标签),公网标签用于帮助VPN业务数据流穿越公网中的LSP,而私网标签用于LSP的出站PE进行判断该向哪个VPN实例进行转发,那么这两个标签是如何产生的?这里我们再了解一下公网标签和私网标签的详细分配过程。

公网标签分配过程:

因为 MPLS VPN骨干网中的Р路由器并没有私网路由,所以骨干网不能使用IP转发的方式来转发VPN业务数据流,而是使用MPLS标签转发的方式,这就需要骨干网的PE之间为每个VPN客户建立一条或多条公网LSP,VPN业务流通过入站PE进入骨干网后,通过相应LSP转发到出站PE。公网标签是由骨干网内部的LDP 协议根据IGP路由或静态路由而产生的标签,那么下面就来具体分析一下通过LDP协议产生公网标签并建立公网LSP的过程。

前文中有提到,VPNv4路由通过MP-iBGP在PE之间交换,两个PE 需要使用Loopback 接口来建立MP-iBGP 邻居,所以在 MPLS骨干网内部需要使用IS-IS、OSPF等IGP协议来打通PE和Р路由器之间的路由连通性。当所有Р和PE路由器都有了公网的路由后,通过LDP协议互相通告标签映射,从而建立公网路由的标签转发表。下面以图下的案例为例来介绍一下公网LSP的建立过程。
在这里插入图片描述
如图所示,PE1和 PE2之间通过Loopback0接口建立.MP-iBGP 邻居,Site1和Site2已经完成了VPNv4路由的交换。现以Sitel访问Site2方向的数据流为例,对LSP的入站PE1来说,到达Site2的下一跳为10.1.4.4,那么需要有到该下一跳的LSP。由于LDP协议依据IGP的路由前缀(FEC)来建立LSP。LSP的出站 PE2会通过LDP协议将自己的Loopback0 (10.1.4.4/32)对应的标签映射发布给Р路由器,Р路由器在收到出站PE 的标签时也会生成自己的标签,然后发布给其上游LDP邻居。这样,在入站PE1处会收到来自Р路由器的关于出站PE2的 Loopback0路由的标签,也就是在入站PE1处会拥有去往下一跳(出站PE2的Loopback0)的标签,这样建立了公网的LSP。下面的输出显示了PE1上关于到下一跳10.1.4.4的 LSP转发信息,其中,标签1025( out-label )就是由LDP邻居分配的,如下输出所示:
在这里插入图片描述
我们再来观察一下P2上有关10.1.4.4的LSP 转发信息,如下输出所示:
在这里插入图片描述
可以发现,公网标签实际上在数据流到达出站PE2之前就已经被弹出了,这是由于启用了PHP机制的原因。

私网标签分配过程:

在这里插入图片描述
现以vpna的 Site1 中1.1.5.0/24访问Site2中的1.1.6.0/24为例。

第1步:CE1使用IP转发的方式将数据流量转发至PE1。
第2步:PE1接收到来自CE1的数据流量时,查找VPN实例(vpna)的FIB表,根据FIB表中的转发信息压入对应的标签,然后转至下一跳P1。这里我们来看一下PE1的VPN实例(vpna)的FIB表关于目标路由前缀1.1.6.0/24的详细信息,如下输出所示:
在这里插入图片描述
由上面的输出信息可以发现,此时PE1会在报文中压入私网标签(InLabel) 1029,同时,这条目标路由前缀是由BGP 邻居 PE2(地址是10.1.4.4)通告过来的,所以报文需要送达到PE2,而要送达到这个地址,必须有到达这个地址的LSP,这时再查看一下PE1公网LSP转发表,如下输出所示:
在这里插入图片描述
由上面的输出信息可知,PE1要将数据转发给10.1.4.4,需要再压入公网标签1025,然后通过公网的LSP将数据流转发到PE2。也就是说,当数据流进入PE1时,分别压入了一个私网标签1029和一个公网标签1025,然后转发给P1路由器。

第3步:当P1路由器接收到该数据流后,根据数据包的公网标签信息进行转发,直接根据标签转发表进行转发,由下面的输出可以知道P1路由器接收到带有标签值为1025的报文时,直接将标签交换成出标签1025,然后从GEO/0/1转发给下一跳P2路由器,如下输出所示:
在这里插入图片描述
第4步:数据流到达P2路由器,这时P2和P1的处理方式相同,根据P2的标签转发表(如下表所示)的信息,此时P2将数据包携带公网标签1025进行弹出后再转发至PE2,也就是数据包到达PE2时只剩下一层私网标签,如下输出所示:
在这里插入图片描述
第5步:只带有私网标签信息的数据包到达PE2。PE2标签转发表(如下表所示)显示该FEC的出标签为空,所以在完成标签移除操作后,再以P转发的方式将P数据包转发至CE2,如下输出所示:

在这里插入图片描述
以上就是通过MPLS VPN传递用户业务数据流的整个过程,可以发现,对于入站PE1来说,在接收到用户的IP业务流量时,需要完成压入双层标签的操作;对于出站PE2来说,需要将标签从数据包中移除,然后以IP转发的方式将流量转发给用户的CE2设备;而对于骨干网中的P路由器来说,只需要进行标签的交换就可以完成数据包的转发。

整理资料来源:HCIE路由交换学习指南

这篇关于MPLS virtual private network报文转发过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940872

相关文章

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Nginx如何进行流量按比例转发

《Nginx如何进行流量按比例转发》Nginx可以借助split_clients指令或通过weight参数以及Lua脚本实现流量按比例转发,下面小编就为大家介绍一下两种方式具体的操作步骤吧... 目录方式一:借助split_clients指令1. 配置split_clients2. 配置后端服务器组3. 配

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us