MPLS基础与工作原理
MPLS Fundamental
History of WAN Protocol
- 1970年代之前
- 第一个 WAN 用于将办公室与终端连接到大型机和小型计算机系统。
- 它是从办公室到数据中心的点对点连接。
- 随着用户采用个人计算机和客户端服务器应用程序,点对点架构继续为行业服务。
- 当时使用的X.25 协议和 T1/E1 电路速率为1.5Mbps。
- 1980 年代末和 1990 年代初
- 帧中继(X.25 的简化版本)作为一种更灵活的方式出现,可将办公室和分支机构位置连接到数据中心,通过 T1/T3 电路运行,提供高达 45Mbps 的速度。
- 企业迅速采用帧中继,随后是异步传输模式 (ATM)。
- ATM 的功能类似于帧中继,但 ATM 旨在为在同一网络上运行的语音、视频和数据提供更好的体验。 并且提供了高达 622Mbps的速率。
- 2000年代初
- MPLS 最初由服务提供商部署,这些服务提供商在从传统的基于电路的网络架构过渡时也采用了 MPLS。
- 数据包被分配标签并根据标签头做出转发决策(在早期,这样的转发数据方式是更快的)。
- 2000 年代中后期
- 互联网作为企业 WAN 连接的一种选择迅速出现。
- 互联网带宽既便宜又充足。
- 许多企业使用蜂窝服务作为 ISP 的备用连接。
- 2010年代
- SD-WAN(软件定义广域网)。
Multiprotocol Label Switching(MPLS)
MPLS 是一种数据包转发方法,它根据标签而不是数据包的第三层目的地做出转发决策。
- 对于今天的路由器,MPLS 并不比传统的 IP 路由快多少。
MPLS 旨在支持(传输)许多不同的第三层协议。
- 例如单播路由、多播路由、VPN、流量工程 (TE)、QoS 和 MPLS 上的任何传输 (AToM)
MPLS名词介绍
- LSR = 标签交换路由器(Label Switching Router)
- LIB = 标签信息库(Label Information Base)
- LFIB = 标签转发信息库(Label Forwarding Information Base)
- LDP = 标签交换协议(Label Distribution Protocol)
- LSP = 标签交换路径(Label Switched Path)
- CE = 客户边界(Customer Edge)
- PE = 运营商边界(Provider Edge)
- P = 运营商路由器(Provider Router)
- LER = 标签交换路由器(Label Edge Router)

MPLS is not VPN
- MPLS是一个基于标签的最短路径路由流量的技术。
- VPN则是一个概念——基于公有网络的专有网络连接。
这篇文章将着重讨论MPLS Layer 3 VPN——即基于MPLS + VRF的VPN( IPv4-over-MPLS )。以及其他MPLS相关技术。

LSR Control Plane & Data Plane
标签交换路由器分为控制层面和数据层面。
在传统IP路由中,路由器通过路由协议生成路由表(控制层面),再由路由表生成转发表用于硬件转发数据(例如Cisco的CEF技术)。
在运行MPLS的路由器上,LDP用于和其他运行MPLS的路由器交换标签并生成LIB(控制层面),LIB会生成基于标签进行转发的表项——LFIB(数据层面)。

LSRs in MPLS Domain
在下面这张图中,R1与R5是边界LSR(数据流量为从左向右)。边界LSR需要同时为IP与MPLS路由。
在MPLS域的边缘,为进入MPLS的数据包添加标签(称为ingress LSR)。
在MPLS域的边缘,为离开MPLS的数据包弹出标签(称为egress LSR)。
R2、R3和R4均为中间LSR(Intermediate LSR)。
- 位于MPLS域内,主要使用标签信息转发数据包。

LSP
Label-Switched Path(LSP)标签交换路径是标记数据包通过MPLS域的累计标记路径。
这是一条单向路径。因此源与目的地的来回路径可能是不一致的。
沿着该路径,每个路由器都会检查标签来做出转发决定,移除或添加标签(如果需要),然后转发数据包。
下面这张图简单的解释了MPLS是如何完成数据的转发的。

- 在192.168.0.0/24向10.0.0.0/24方向转发数据时,边界LSR首先为10.0.0.0/24分配了标签87,并将带有标签87的数据包转发至R2(此时开始使用标签进行转发)。
- 在转发数据至R2时,中间LSR将进站标签为87的标签替换为11,并继续转发至R3(此时使用的表均为LFIB)。
- 像如此转发数据至R5,R5发现出站标签为空,则将标签弹出,进入FIB进行IP路由。
Label
要深入理解MPLS的转发机制,绕不开的是MPLS中的标签(Label)如何被利用于转发,如何产生,以及如何交换这三个问题。
为了能够让MPLS工作,每一个数据包都需要插入标签(准确说,实际插入的是一个Label Stack)。标签被插入在二层帧头和三层包头之间(准确说,应该是插入在二层帧头之后,因为MPLS能够承载多种协议)。
标签大小为4个字节并包含不同字段:
- Label
- 前 20 位用于定义标签编号。
- EXP(TC)
- 接下来的 3 位(EXP)用于QoS和ECN(显式拥塞通知)。
- S
- 1 位(S)字段用于定义标签是否是堆栈中的最后一个标签。
- 普通的MPLS只有一层标签,但MPLS VPN则有两层标签,MPLS TE则有三层标签。
- TTL
- 最后 8 位(TTL)类似于IP TTL。

Label Stack
在MPLS中,一个数据包不止可以携带一个标签,而且可以携带一叠标签,如下图。
可见多个MPLS shim组成了一个MPLS label stack。

具体label stack的排序如下图。可见,在栈底的shim的S字段为 1,所以可见的是该标签为栈底标签。
Cisco定义Label stack中的label数量没有上限。

Assign Label to Network
启用了MPLS的路由器会为所有他们已知的网络分配标签(不包括BGP路由)。系统会为路由随机分配一个编号,这个编号仅具有本地意义。
例如在下图中,假设下面5个路由器运行OSPF获得了10.0.0.0/24这个网段,它们各自都给该网段分配了一个编号。

LDP
LDP(Label distribution protocol)标签分发协议。
如下图,假设R4需要将10.0.0.0/24网段的数据转发给R5。
- 那么R4必须要知道R5针对于10.0.0.0/24所分配的标签(因为R5只有自己认识收到数据包的标签才能进行下一步转发)。
- 且在转发数据包的过程中需要将R5分配给10.0.0.0/24网段的标签放入其中。
- 因此R4与R5之间需要使用LDP来交换互相的标签。
- 那么一旦在接口上启用了MPLS,LDP Hello数据包就会从接口发出,发送到多播地址224.0.0.2,使用UDP 646端口。
- Hello包中携带了LDP ID,LDP ID类似于Router ID,它唯一标识了邻居和Label Space。而Label Space分为两种。
- Per platform(平台式),在所有接口上,对于相同网络发布的标签也是相同的。
- Per interface(接口式),在不同的接口上,对于相同网络发布的标签是不同的。
- Hello包中携带了LDP ID,LDP ID类似于Router ID,它唯一标识了邻居和Label Space。而Label Space分为两种。
- 当路由器通过组播地址发现对方后,会使用TCP 646端口建立TCP链接,形成LDP TCP会话,以便交换标签信息。
- 在两台路由器建立LDP TCP会话时,必须有一方为活动路由器。
- 活动路由器负责建立TCP会话,LDP ID较大的路由器会被选择为活动路由器。

在上文中,我们可以得知,上面的R1至R5使用LDP交换了对于10.0.0.0/24这一网段的标签信息,那么此时会引申出一个问题——在一台路由器上收到了一个网络的多个标签,路由器会怎么处理呢?
下面我们来探究这个问题,在下图中,标识了各个路由器的LIB(标签信息库)。
- 各个路由器通过LDP都收到了各自邻居针对10.0.0.0/24的标签信息,并记录在了LIB中,然而LIB并不是直接用于转发数据的。需要通过LIB+RIB得出数据真正的转发路径。

路由器是如何通过LIB+RIB确定出真正的转发路径呢?具体步骤如下。
- 首先MPLS网络中需要运行路由协议来传递路由信息,从而形成RIB(路由信息库)。
- 其次运行MPLS后,LDP开始工作,当形成LIB后,通过RIB确定正确的转发路径,并载入LFIB中。使用R4和R5举例。
- 当形成LFIB时,R4通过查询RIB得知,去往10.0.0.0/24网段需要将路由转发给R5。
- 此时R5也通过LDP将自身对于10.0.0.0/24网段的标签传递到R4上。
- R4将自身针对该网段和下一跳路由器针对该网段的标签相结合写入LFIB中。
- 那么前往10.0.0.0/24的数据就能够通过LFIB进行转发。
- 至此,当R4收到标签为65的数据包时,将会弹出标签65,压入标签23,并将其转发给R5。
- MPLS域中的所有路由器重复上述的过程,就能够确立出一条正确的转发路径。
- 至此,除了Edge LSR需要进行IP路由,中间LSR可以全部通过MPLS进行数据转发。
- Edge LSR的FIB略有不同,因为运行了MPLS,FIB中并没有路由的下一跳信息,而是打上标签或移除标签。

Egress LSR Double Lookup
例如R5收到10.0.0.0/24的数据包时需要做两次查找,首先查找LFIB表,其次查找FIB表。
首先是因为它收到了一个带有Label的数据帧,它需要查找LFIB表,但由于没有Label Out,它必须弹出标签并继续查找FIB表来转发数据。
这样的效率并不高。
Penultimate Hop Popping(PHP)
Penultimate Hop Popping 倒数第二跳(又称次末跳弹出)是一种优化机制,如下图所示。
当启用PHP后,R5并不会将之前一样向R4宣告自己的标签,而是宣告了弹出(POP)这个动作。那么R4就会在转发的过程中,将剩余的标签弹出,并转发给R5。
那么当R5收到不附带标签的数据包后,就会直接查询FIB进行转发,免去了查询LFIB的动作,提高了效率。
实际上呢,R5告诉R4自己是10.0.0.0/24网络的LSP的末端,并且R4应该弹出标签,并且将无标签的数据包转发给R5。

MPLS基础与工作原理的更多相关文章
- 【k8s】基础概念 + 工作原理
工作原理: 原理图 工作原理描述: 1>用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求): 2>api server将 ...
- PhoneGap架构基础及工作原理介绍
转自:http://mobile.51cto.com/others-308545.htm 本篇文章从PhoneGap由来.功能以及工作原理,力争由浅入深介绍PhoneGap框架. 为什么需要Pho ...
- web基础-web工作原理,http协议,浏览器缓存
1,web工作原理 2,http协议 3,浏览器缓存 4,cookie和session -------------------------------------------------------- ...
- jsp之认识 servlet (基础、工作原理、容器请求处理)
Tomcat 的安装: eclipse 需要自行安装tomcat,这是web 项目运行的服务器.如果用的是MyEclipse,里面自带tomcat,方便清除部署垃圾,利于项目运行. Tomcat的安装 ...
- Servlet基础(工作原理、生命周期)
(一)Servlet开发与配置 1.1 开发步骤 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行! 配置信息: ...
- CSS 基础:CSS 工作原理(2)<思维导图>
这段时间利用一下间隙时间学习了CSS的基础知识,主要目的是加深对CSS的理解,虽然个人主要工作基本都是后台开发,但是个人觉得系统学习一下CSS的基础还是很有必要的.下面我学习CSS时做的思维导图(全屏 ...
- zabbix监控的基础概念、工作原理及架构(一)
zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...
- Hadoop基础-MapReduce的工作原理第二弹
Hadoop基础-MapReduce的工作原理第二弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Split(切片) 1>.MapReduce处理的单位(切片) 想必 ...
- Hadoop基础-MapReduce的工作原理第一弹
Hadoop基础-MapReduce的工作原理第一弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在本篇博客中,我们将深入学习Hadoop中的MapReduce工作机制,这些知识 ...
随机推荐
- ros中关于节点、话题、服务以及自定义消息等在终端中的常用命令
以下面的计算力图说明 节点相关常用命令 在终端中查看项目中有哪些节点命令:rosnode list 有了节点信息想要查看节点中到底发布订阅了哪些话题,作为服务端服务类型或者作为客户端需要的服务类型以上 ...
- 智能指针中C++重载'->'符号是怎么实现的
例如下面的代码: class StrPtr{ public: StrPtr() : _ptr(nullptr){} //拷贝构造函数等省略... std::string* operator->( ...
- 面试--html语义化的理解和作用
什么是HTML语义化 1.让开发者阅读和写出更优雅的代码2.让浏览器的爬虫和机器很好的解析 为什么要语义化 有利于seo方便其他设备监听 屏幕阅读设备 盲人阅读器方便团队协作开发 语义化元素 head ...
- 微信小程序——gulp处理文件
懒癌直接贴代码,想写在写因为最近搞了一下小程序,直接使用微信的开发者工具搞感觉有点不习惯,并且看了几篇给小程序瘦身的博客,决定给自己的项目做一套配置文件,使用gulp来支持sass scss文件编译以 ...
- react 移动端 兼容性问题和一些小细节
react 移动端 兼容性问题和一些小细节 使用 ES6 的浏览器兼容性问题 react 对低版本的安卓webview 兼容性 iOS下 fixed与软键盘的问题 onClick 阻止冒泡 meta对 ...
- js中的bool值转换及"&&" 、"||"、 "!!"详解
bool值转换 数据类型 bool值转化 undefined undefined 转化为 false Object null 转化为false,其他为 true Boolean false 转化为 f ...
- 前端面试题整理——普通函数和new函数
下列代码的输出值: function A() { console.log(1) } function fn() { A = function () { console.log(2) } return ...
- 【Android开发】LogcatView,手机中查看logcat神器
先上图 集成: 1, allprojects { repositories { ... maven { url 'https://www.jitpack.io' } } } 2, dependenci ...
- node的两种随起随用静态服务器搭建
一. anywhere Anywhere是一个随启随用的静态服务器,它可以随时随地将你的当前目录变成一个静态文件服务器的根目录. 1.确定电脑上安装了node.js 2.在当前所在项目文件夹下输入 ...
- FastAPI(七十二)实战开发《在线课程学习系统》接口开发-- 留言列表开发
之前我们分享了FastAPI(七十一)实战开发<在线课程学习系统>接口开发-- 查看留言,这次我们分享留言列表开发. 列表获取,也需要登录,根据登录用户来获取对应的留言.逻辑梳理如下. 1 ...