MPLS
诞生
随着早期互联网的快速发展,人们担心简单的IP协议无法承载
进而开始了更复杂的网络层协议的研究,其中一个协议是ATM协议,但由于过于复杂,这个协议没有大范围取代IP
虽然ATM寄了,但它的几点思想启发了后来的MPLS:
摈弃了繁琐的路由查找,改为了简单快速的标签交换
将具有全局意义的路由表改为只有本地意义的标签表
这些都可以大大提高一台录取的转发功能
包头结构
相关概念
标签通过绑定过程和FEC相映射
FEC是转发等价类,是在转发过程中以等价方式处理的一组数据分组。就是不同的报文对于沿途的路由器都采用相同的动作,比如从A中同样的接口进来,再到B上同样的接口出去……就视为一组转发等价类
通常在一台设备上,对于一个FEC分配相同的标签
对于这个包走过的通道叫LSP,也叫标签交换通道
LSR,标签交换路由器,运行MPLS协议进行标签分发和交换的路由器
LER,MPLS网络的边界路由器,自身运行MPLS,有邻居不运行MPLS,因此会进行一些去标签和加标签的操作
MPLS转发依赖于IP转发
标签转发和IP转发的对比
IP转发时,每一条都要进行最长匹配原则的查找,为确定最长,要查路由表多次
先与mask进行与运算,再比较,并且要多次比较
标签转发只需要一次比较,没有与运算并且只查一次
评价FEC
不同目的地址却属于相同网段的报文在入口Ingress处被划分为同一个FEC,如果路由器启动了cache功能,那么标签可以做到少数几个标签匹配大量的报文,但IP地址却只能匹配主机路由
缺陷对于一个FEC,要求沿途所有设备都有完全相同的路由才能建成同一个LSP,换句话说,对于要使用标签转发的路由是不能做路由聚合的
比如一个FEC是从A的1口进,2口出,到B的3口进,4口出;另一个是从A的1口进,2口出,到B的3口进,1口出,那么在A上就必须有两个不同的标签对应相同的策略
让链路层知道自己是MPLS报文
以太网中使用0x8847和0x8848表示自己是MPLS报文
PPP中,增加了一种NCP,即MLPSCP来表示上层是MPLS
LDP标签分发协议
LDP的消息种类有四种
发现,通告和维护LSP
会话,建立维护和结束LDP对等体的会话连接
通告,创建改变和删除邻居关系
通知,提供消息通告和差错通知
LDP会话建立和维护
邻居发现:互发hello,UDP,port 646,目的IP地址224.0.0.2
建立TCP连接,通过hello里的IP地址,由地址较大的一方(Master)发起
由Master发送初始化消息,携带协商参数
slave检查参数能否接受,能则发送初始化消息并带协商参数,随后发送keepalive消息
master检查参数是否能接受,能则发送keepalive
互相收到keepalive,建立会话
期间接收到任何差错,关闭会话,断开TCP
状态转移图
标签的分发和管理
在一条LSP上,沿着数据包传送的方向,相邻的LSR分别叫做上游,下游
发路由信息则从下游到上游
一般LDP标签分配方式采用DU方式,即下游主动向上游发出标记映射信息
下游C发现自己的直连路由,主动分配一个标签,然后发给上游B;上游B收到之后,再随机生成一个,再给再上游A
A有到C的报文,会赋值B给定的标签,然后发给B,B接到相应标签的报文,赋值C给定的标签,给了C
该转发有水平分割,即“你告诉我的事情,我会告诉所有人,但不会再告诉你,因为这是你说的,你肯定比我更清楚”
保守方式和自由方式的区别:自由方式来着不拒,对于路由通知都收下;保守方式只保留路由下一跳邻居的标签(近的),丢弃非下一跳邻居发来的标签
谁是路由下一跳?近的是
标签向邻居的发送方式:有序和独立
有序指的是我只发自己家的直连路由,只有接收到别人的标签时,我才发自己学到的
独立指的是我连自己学到的也发出去
如果对于某条报文,没有它对应的标签,此时会按IP转发
入标签自己分给别人,出标签别人分给自己,同一台设备分的标签一定不同,不同设备分的标签可能相同
PHP倒数第二跳弹出
Egress LSR收到MPLS报文之后,会送给MPLS模块处理,但由于它是出口,实际上就不需要MPLS模块处理了
所以把取出IP报文的工作交给倒数第二跳
因此倒数第一跳会分给倒数第二条特殊的标记,3
路由环路预防
LSP建立依赖IP路由,因此不建立路由环路机制,交给IP来做
MPLS也有TTL,还是会减一
IP头的TTL就不会减一了
VPN
虚拟专用网络(VPN)的功能是:在公用网络上建立专用网络,进行加密通讯。在企业网络中有广泛应用。
专用网络是指遵守RFC 1918和RFC 4193规范,使用私有IP地址空间的网络。私有IP无法直接连接互联网,需要公网IP转发。实现专用网络要铺设专线,就是专门修线连接想要连接的两个节点。类似于专门给你修一条马路,只准你家的车开。
专线太贵了,用不起,用加密过后的数据在公网上来回发,别人不知道是啥,也能达到虚拟的专用网络的效果。
这就是VPN技术,VPN协议有第二层隧道协议(L2TP、L2F、PPTP等),和第三层隧道协议(IPsec、GRE等)
所谓隧道,就是把一种报文打包,整个装到另一种报文里,是网络中常用的技术
常说的VPN是指把设备和专门的VPN服务器建立安全连接(利用的是VPN技术),之后上网时吧加密的数据发送到VPN服务器,VPN服务器
Overlay和Peer-to-peer两种VPN
CE、PE和P的定义
Overlay
1.在CE之间建立隧道,并直接传递路由信息,协议有GRE,IPSec
保密性、安全性很好,不同VPN用户可以使用相同的地址空间
但是需要客户自己创建并维护VPN,成本高
2.在CE和PE之间创建隧道,VPN的创建和维护完全交给运营商
安全性交给运营商,不同用户不能使用冲突的地址空间
无论哪种,Overlay VPN本质都是一种静态VPN,需要手动配置,并且无法反映网络的实时变化
Peer-to-Peer
指的是CE-to-PE,要在CE和PE之间交换私网路由信息。PE直接把私网路由传播
私网路由要泄露到公网上,出口端要做好过滤,通过路由控制确保同一个VPN的CE上只有本VPN的路由
1.共享PE方式
许多CE连接到相同PE,PE和不同的CE之间运行不同的路由协议,或者是相同协议的不同进程
防止同一PE连的CE互通,要配大量ACL,同样有地址冲突的问题
2.专用PE
可以用BGP,这样可以用BGP的community标记,方便过滤(发布时,community设为特定值,进入时,丢弃非该值的)
顾名思义,缺点是贵
Peer-to-Peer,本为了解决静态的问题,但问题是没有隧道技术,私网泄露,导致安全性差
同时,屏蔽了公网的访问,就上不了Internet
而且设备无法共享相同的地址空间
MPLS/BGP VPN
隧道技术有静态性,动态性的又没有隧道
需要动态建立的隧道技术,解决VPN共享相同地址空间的问题
MPLS就是动态建立的隧道技术
解决地址冲突需要BGP,基于TLV的设计的报文有良好的拓展性
解决方法:
1.不同接口创建不同路由表
2.在路由传递过程中加一个标识,区别不同的VPN
3.始发VPN在IP头之外打上标记,PE接收后根据这个标记转发
VRF——VPN路由转发实例
每个VRF可以看作虚拟的路由器,包括:
独立的路由表
一组属于这个VRF的接口集合
一组只用于本VRF的路由协议
扩展的community叫RT,表示自己的路由取舍和喜好的方式
发布RT是用来解决本地冲突的,他表示IP的归属,通过声明自己接受哪些RT,发布哪些RT来确定互访规则
RD来解决网络传输中的冲突,其实是BGP发相同地址的路由撤销报文才有用,用于区分不同的路由。在IP地址前加RD,变成VPN-IPv4地址族,用于区分相同的地址来自哪个VPN
以上解决了控制平面路由学习的问题,数据层面路由转发时也有冲突。同一台PE接收到远端PE发给本地的同一地址的不同VRF怎么办?再加一个由MP-BGP分配的标签,发送时带上,根据这个来区分
具体实现
1.PE维护多个路由表,一张公网的,若干张私网的即VRF的
PE和CE之间通过EBGP、OSPF、RIP或静态路由交换路由信息
静态路由和RIP需要每个VRF运行一套
EBGP也是普通的EBGP,只交换PE过滤后的本VPN路由
OSPF做了很多修改,可以将本site中的LSA放在bgp的扩展community属性中携带,与远端VPN中的ospf之间交换LSA。每个site中的ospf都可以存在area 0,骨干网可以看作super area 0
2.PE需要对一条路由进行如下操作:
加上RD,变为一条VPN-IPV4路由
更改下一跳属性为自己
加上私网标签
加上RT,export属性
发给所有的PE邻居
3.远端PE接收倒路由
还原为IP路由,根据本地VRF的import RT属性,加入到相应的VRF中
私网标签保留,留作转发时使用
再由本VRF的路由协议引入并转发给相应的CE
4.公网标签分发
只需要为BGP路由下一跳分标签