MPLS

MPLS(多协议卷标交换)

原文链接;https://www.cnblogs.com/xiaomai-rhce/p/10610043.html 

一、传统IP路由转发的特点及缺点

  1. 使用动态路由协议传递路由条目
  2. 传统IP路由只能基于数据报中的目的IP转发数据报
  3. 每台路由器都要去查找路由表然后逐跳转发

 

二、MPLS基本工作原理

MPLS:用标签转发,而不是进行IP路由表的查找

MPLS边界路由器:连接了MPLS域和一个纯IP网络

只有边界路由器才会进行路由表查找(针对纯IP包)

LSP:卷标转发路径

LSR:标签转发路由器(MPLS域中的路由器)

MPLS数据报转发过程的基础理论:

边界路由器为纯IP包查路由表,并给数据报压上一个标签(IP数据报前面加上一个标签5发送出去)。第二台的下游路由器不会再去查路由表,只看卷标(因为是卷标包),只需要做标签的替换5——3(标签3是下游路由器给它的,下游路由器只认识标签3)。第三台路由器弹出标签,变成纯IP包,并做路由表查找,最后转发给身后的IP网络。

三、MPLS的优势

1.转发速度——不是主要因素

2.VPN服务:

MPLS把IP的路由和转发给分离了:在入口的地方就可以决定数据报将要走的整条路径(传统的IP路由转发不行,因为每一跳都要去查找),它可以为不同入口的IP数据报压不同的标签出去——MPLS VPN

两个不同的VPN客户使用相同的私网地址段,MPLS VPN可以区分这两个不同客户的数据报走向。根据收到的接口不同,压不同的标签转发出去(传统IP只能匹配这一条路由条目,故只能按照一种方式做错误的转发)

 

 

传统IP路由转发:根据数据报要去往的目的IP地址,匹配中同一条路由条目,只能做一种转发方式

MPLS根据标签转发,提供了另外一种转发方式

3.MPLS-TE(流量工程)

 

传统的IP转发,例如运行的是ospf,只会选择走cost值小(带宽大)的路径,当这条链路带宽超载时会发生丢包,但是流量仍然不会走下面

MPLS却可以在入口处强行指定路径以实现非等价负载均衡

传统IP网络并不是只能基于目的地址转发——使用PBR(策略路由)

但PBR不适合在互联网上大规模应用,因为每台路由器上都要去做控制,而不是在入口处控制。使用MPLS可以只在入口处就完成控制。

四、MPLS包头封装位置和包头格式

4.1 MPLS包头封装位置

MPLS包头放在二层的帧头和三层的IP头之间的位置,所以MPLS也叫做2.5层的协议

MPLS标签放在MPLS包头中

 

二层的帧头中的“类型字段”会指明上层是IP协议(0X0800)还是MPLS协议,路由器查看二层的帧头就知道应该使用哪张表来查表转发——FIB、LFIB

所以中间的MPLS路由器不会去看IP包头转发,只看MPLS包头转发

4.2 MPLS包头格式

 

 

1.标签:20位(100多万个),为每一条路由分配一个标签,足够用了

2.EXP做QOS用的,3位

QOS区分服务模型:分类、标记(着色)——字段(值)

三层的IP包中的字段:TOS(早期)——DSCP(后来)

二层:802.1q的trunk中的cos字段

端到端的QOS

 

二层交换机的trunk(二层帧中的字段-COS5)复制到IP路由器(TOS5),进MPLS域时复制到路由器MPLS包头中(EXP5)

3.S占比位,1位,多层标签嵌套(实际上是有多个MPLS的包头),标识我是不是最内层的标签

 

0:外层标签

1:内层标签

MPLS VPN:2层标签

CSC:3层标签

4.TTL(生存时间): 8位(最大值为255,看从哪个操作系统发出来的初始值不一样),每经过一个路由器减1,防环。把IP包头里的TTL值复制到MPLS包头的TTL字段里

五、MPLS架构及实现细节

5.1 控制层面

如何生成转发层面所需要使用的表

传统IP路由是通过动态路由协议的学习最后生成路由表

1.各种动态路由协议

任何IGP、BGP协议——目的是传递路由

2.分发和传递标签的协议

1)专门的卷标分发协议:LDPTDP 

TDP:cisco的卷标交换技术,tag switching所使用的标签分发协议。它是LDP的前身

LDP:被IETF共有化后演变了成现在的MPLS所使用的标签分发协议

2)其他可以传递卷标的协议:

1.MPBGP(多协议BGP):把标签放在BGP路由后面一起传递

2.ipv4-BGP:不同的AS之间传递卷标,用LDP传递卷标不好

3.RSVP(资源预留协议):出现在QOS的集成服务模型里的,用于数据网络,去请求保留带宽,然后可以沿着路径分卷标——用于MPLS-TE

QOS的两种模型:

1.区分服务模型:用的最多

对数据报在入口处进行分类(根据重要性),然后打标记(着色,在字段中设置一个值),继续传递,其他路由器只看标记根据QOS的队列机制让重要的数据报每次都是优先转发。

但是每台路由器都要去实施。

2.集成服务模型:类似于传统的电话网络,中间是二层的电话交换机——用于语音网络

打电话时交换机会发送信令去请求下一台交换机的带宽(需要的带宽),整条链路先预留带宽,保证语音的质量。预留不出来则通话不能建立,保证了服务质量。

但是是针对每一个流,也不能在互联网上大规模实施

3.通过无序分发标签,形成每台路由器的LIB表(标签信息库):

LIB中只会存储LDP/TDP分的标签

路由条目    自己本地分配的标签(local)    所有别人给我的标签(remote)

5.1.1 LDPTDP的联系

可以全局或接口下修改使用的卷标分发协议:默认是LDP,两端必须一致

int s0/0

mpls label protocal tdp

其实两者可以互相兼容——MPLS分发标签使用LDP或TDP都可以

5.1.2 mpls ip命令在接口上运行之后,LDP的工作过程

1.选举LDP router-id(同ospf,选举好后即是一个稳定状态)

2.使用LDP router-id的地址建立直连路由器之间的LDP邻居关系(要注意路由的可达性)

3.通过路由协议学习到路由条目后,每台路由器针对这条路由条目本地分配一个标签(local)

4.通过LDP协议无序分发卷标(LDP/TDP的卷标分发是无序的,分发给所有LDP/TDP邻居而不区分上下游),从而形成LIB表(local  remote)

5.1.3 LDP邻居的建立过程

1.LDP使用UDP源目埠号都为646发送hello包(并通过UDP协议维持LDP的邻居关系)

LDP的hello消息目的IP地址发往224.0.0.2

sh ip int s0/0  //查看mpls接口加组信息(224.0.0.2)

2.协商相关参数,如LDP router-id的大小

3.使用TCP 源埠随机,目的埠为646建立LDP邻居关系(LDP ID大的主动去发送TCP连接小的)

目的IP为对方的LDP ID

sh mpls ldp nei  //查看LDP邻居关系

access-list 100 permit udp any eq 646 host 224.0.0.2 eq 646

access-list 100 permit ospf any any  //建立ospf邻居,放行LDP ID的路由条目

access-list 100 permit tcp any host 1.1.1.1 eq 646  // LDP ID大者向小的一方发起TCP连接

access-list 100 deny  ip any any

TDP依靠TCP 711埠建立邻居关系,用UDP发送hello包(维持TDP的邻居关系)

5.1.4 相关命令

LDP ID:类似于OSPF的router ID,选举规则也一样;使用mpls ldp router-id interface force可改变LDP ID


在LDP邻居发现时,邻居之间的LDP ID必须IGP可达,否则在sh mpls ldp discovery的最后一行会出现no route,即邻居发现没有建立成功

 

全局下的MPLS命令:

mpls ldp命令(新命令)等同于tag-switching tdp(老命令)——因为LDP等同于TDP

控制层面小结:

  1. 每台路由器通过一种动态路由协议学习到路由条目
  2. 每台路由器先本地为这条路由条目分配一个标签
  3. 无序分发标签,形成每台路由器的LIB表

5.2 数据层面

如何去查那张表

传统IP路由是拿目的地址去查路由表(FIB表)

1.FIB表(转发信息库,CEF表——相当于路由表)

FIB表是对路由表的复制,做了一些优化,解决了递归查找问题

为什么要使用FIB表:因为只有FIB表才能关联标签,路由表是无法关联标签的

必须打开CEF才会有FIB

边界路由器要查CEF表:三层的表,IP是三层的包

路由条目    出接口    下一跳路由器给的标签(out)

2.LFIB表(卷标转发信息库)

LIB生成

中间的路由器只根据LFIB表做标签的替换:针对的是标签包

路由条目    出接口    本地分配的标签(in)    下一跳路由器给的标签(out) 

LFIBoutuntagged的情况:——弹出所有标签

如果下一跳没有给我标签(没有运行MPLS的纯IP网络,我只能给它转发一个纯IP包的情况),则out是untag

LFIBoutpop的情况:——只弹出一层外层标签

每台路由器对于本地直连的路由条目本地分配的是一个“隐式空”的空标签(local值为3),倒数第二跳路由器收到这个分发的空标签,它的LFIB表中out为POP。然后转发纯IP包给末端路由器,末端路由器一般情况下只需要查IP路由表(FIB表)转发,所以末端路由器对于直连路由LFIB表中是没有这条路由条目的

数据层面小结:

是什么包就查什么表

5.3 MPLS架构小结

路由的传递是从下游往上游传

标签的分发是无序的,但只有关联下一跳给的标签才有意义

数据报的转发是从上游往下游走

5.4 数据报转发时的几种可能性

收到的是IP包,只查FIB

1.压out的标签出去(MPLS边界路由器)

2.不压标签,正常的IP包出去(末端路由器的直连路由)

收到的是标签包:只查LFIB

1.更换一个标签出去(中间的路由器)

2.弹出标签,变成纯IP包出去(倒数第二跳路由器)

六、基础实验

 

R3:ping 1.1.1.1

6.1 MPLS基本配置及验证命令

1.应首先保证MPLS域中的所有路由器CEF开启(默认开启)

2.运行一种路由协议,宣告物理及环回界面

因为LDP也会建立邻居关系(默认使用环回口建立邻居,因此必须要环回口路由可达)

sh mpls ldp discovery

3.指定卷标分配的范围——针对所有可以分卷标的协议的卷标分配范围

运行MPLS,同时就默认启动了LDP对每条路由条目本地分配一个标签(local)

LDP分配标签从16开始,本地有效。应该强制每台路由器对路由分配不同的标签范围(在启用MPLS之前就做,因为启用了MPLS就启用了LDP,已经开始分配标签了)

全局配置模式下:

mpls label range 16 100

4.MPLS域中的所有接口下启用MPLS——默认就启用了LDP并建立LDP的邻居关系

int s0/0

mpls ip


sh mpls int  //查看所有启用了LDP的接口

sh mpls ldp nei  //LDP的邻居:LDP的TCP连接发起方——根据源埠号(随机)和目的埠号(646)判断

R3:trace 1.1.1.1  //压标签达到目的地址

查看控制层面的表(LIB)

sh mpls ldp bindings  //LIB表:路由条目、卷标local、卷标remote

对于直连路由,本地分空标签

对于非直连路由,本地正常分标签

查看数据层面的表:

show ip cef detail  //FIB表:路由条目、出接口、下游路由器给我的标签(out)

show mpls forwarding-table  //LFIB表:路由条目、出接口、本地分配的标签(in)、下游路由器给我的标签(out)

6.2 扩展内容

1.关闭CEFno ip cef

 

1)如果边界路由器关闭CEF

FIB空了——必须打开CEF才会有FIB

 

2)如果中间路由器关闭CEF

LIB中本地不分标签了

FIB表空了

LFIB表也空了

 

此时则完全按照路由表查找转发,脱离了LSP,此环境没有任何影响,可以通,但是MPLS-VPN网络中就不通了

路由器要基于FIB表本地分配标签和形成LFIB表,所以必须在MPLS域中所有路由器上都打开CEF:ip cef

2.如果将R1环回口改为24位:

需要在R1上重启mpls ip命令

R1通过ospf通告给R2的仍是32位路由

R2的LFIB中out全变成untag了,对于MPLS VPN就不正常了

问题原因:

1.R1上本地会为24位的这条直连路由分空标签,也会把这个空标签传递给R2,但R2上并没有24位的这条路由,因此这条路由不会显示进LFIB表中

2.R2收到的路由是32位的,但是却收不到关于这条32位路由下一跳给它的标签,因为R1上是直连的是24位的路由

3.R2上只有32位的路由加入到LFIB表中,因为没有收到标签,所以out是untag

解决方法:

使分标签的路由和传递的路由屏蔽一致

1.将所有路由器环回口屏蔽都设置为32位——推荐

2.环回口网络类型改为点到点,这样宣告给邻居的也是24位掩码

3.如果MPLS域中存在路由汇总——eigrp

汇总路由在R2上产生:1.1.1.1/32-1.1.0.0/16,R2会为1.1.0.0/16这条路由本地分一个空标签,R3压着空标签转发到R2(R3到R2的包是纯IP包)

而R2本身有明细路由,R1本地分配的空标签分发过来,R2又压着空标签转发到R1(等于还是一个纯IP包转发给R1)。因为R2上同时有汇总路由和明细路由,所以这种情况下不会有问题——eigrp、ospf

如果R1和R2之间还有一台路由器,则会重新压一次标签过去

关键是看底层使用的是哪种动态路由协议,做汇总时本地会不会自动生成那条汇总路由

eigrp和ospf手动汇总后本地都会自动产生一条指向空接口的汇总路由,所以MPLS-VPN没有问题

rip本地不会自动产生汇总路由,所以MPLS-VPN有问题

另:ospf的汇总只能在ABR或ASBR上做

eigrip汇总:——pop

R2:连R3的界面

int s0/1

ip sum eigrp 100 1.1.0.0 255.255.0.0

rip汇总:接口下(同eigrp,DV型)——untag,MPLS-VPN有问题

int s0/1

ip sum rip 1.1.0.0 255.255.0.0

所以MPLS域中的底层路由协议最好不要使用rip

七、帧模式(IP)和信元模式(ATM)的区别

7.1 标签的发配

帧模式:只要自己有路由就本地分配标签

信元模式:下游给我标签以后,我本地再开始自己分配标签

7.2 标签的分发

帧模式:分发是主动、无序的,不管对方要不要

信元模式:按需分发(上游向下游请求)

7.3 标签的保留

帧模式:LDP邻居传递给我的标签一直保存在我的LIB中,不管是不是下一跳或下一跳是否已经down掉(对方起来后,不需要重新分发标签进行三层的收敛,速度快)

7.4 LFIB表中是否关联数据报的入向接口

 

 

帧模式:不关联数据报的入向界面

优点:表小,卷标交换速度快

缺点:不安全

信元模式:关联数据报的入向界面

八、MPLS的现实好处(BGP传递路由)

8.1 MPLS中的trace相关命令

no mpls ip propagate-ttl  //TTL值在MPLS入口处变成255,并且不递减

此时traceroute不生效

8.2 通过BGP传递路由

 

R1和R3通过IBGP传一条32位的环回口路由

纯IP网络中,不能通(中间路由器没有运行IBGP,没有这条路由),但MPLS中可以通

R1:sh mpls ldp bindings

本地不会为33.33.33.33这条路由分标签(学到的是B表项),MPLS只会为IGP的路由分标签,不会为BGP路由分标签。但转发数据报时会压这条BGP路由的下一跳路由的标签(通过3.3.3.3学来的)——sh ip cef detail

sh ip bgp  //去往33.33.33.33下一跳是3.3.3.3

R2没有运行BGP,也没有11和33的路由

好处:运营商中间的所有P路由器都不用承载BGP的路由(客户的路由),只需要维护一个标签即可实现客户路由的端到端通信

8.3 扩展内容

R1重启mpls ip后,LFIB中的out都是untag(没有收到邻居的标签),LDP邻居建立不起来了

因为LDP也有RID,通过RID建立邻居,并且RID选举好后是非抢占的,除非重启mpls ip才重新选举(选举RID的方式同ospf)

R1上重新选举RID为11.11.11.11,因为R2上没有11.11.11.11的路由,所以R1的11.11.11.11和R2的2.2.2.2不能建立LDP邻居

解决方法:

1.全局配置模式下:强制指定LDP的RID为1.1

mpls ldp router-id lo0  //只能跟界面,还是要等到mpls下一次重启

mpls ldp router-id lo0 force  //让其立刻生效

2.RID不变,让LDP通过直连接口建立邻居,而不是使用RID建立邻居(如果不能修改LDP的RID的话,使用这种方法比较好)

int s0/0  接口下的命令

mpls ldp discovery transport-add interface  //本路由器通过本地这个物理接口地址和对方建立LDP邻居

九、控制标签的分发

控制路由的传递——发布列表

控制数据报的传递——ACL

控制标签的分发: 

让R2针对环回口路由2.2.2.2本地分配的标签只传递给R1,而不给R3(R3上看到2.2.2.2变成untag)

全局配置模式下:

老命令:tag-switching advertise-tag for ACL1(匹配路由) to ACL2(允许向谁发送)

新命令:mpls ldp advertise-labels for ACL1(匹配路由) to ACL2(允许向谁发送)

mpls ldp advertise-labels for 1 to 2

ac 1 per host 2.2.2.2  //匹配32位的路由

ac 2 per host 1.1.1.1  //只给1.1.1.1的LDP邻居分发标签(只能匹配对方LDP的RID,匹配对方的直连界面IP是不行的)

结果:R1的LFIB中out是POP,R3的LFIB中out是untag

原文地址:https://www.cnblogs.com/manmanchanglu/p/12303789.html