一、传统IP路由转发的特点及缺点
使用动态路由协议传递路由条目
传统IP路由只能基于数据报中的目的IP转发数据报
每台路由器都要去查找路由表然后逐跳转发
二、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包头格式
![在这里插入图片描述](https://img-/120027368.png)
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)专门的卷标分发协议:LDP、TDP
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 LDP和TDP的联系
可以全局或接口下修改使用的卷标分发协议:默认是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
控制层面小结:
每台路由器通过一种动态路由协议学习到路由条目
每台路由器先本地为这条路由条目分配一个标签
无序分发标签,形成每台路由器的LIB表
5.2 数据层面
如何去查那张表
传统IP路由是拿目的地址去查路由表(FIB表)
1.FIB表(转发信息库,CEF表——相当于路由表)
FIB表是对路由表的复制,做了一些优化,解决了递归查找问题
为什么要使用FIB表:因为只有FIB表才能关联标签,路由表是无法关联标签的
必须打开CEF才会有FIB
边界路由器要查CEF表:三层的表,IP是三层的包
路由条目 出接口 下一跳路由器给的标签(out)
2.LFIB表(卷标转发信息库)
由LIB生成
中间的路由器只根据LFIB表做标签的替换:针对的是标签包
路由条目 出接口 本地分配的标签(in) 下一跳路由器给的标签(out)
LFIB中out是untagged的情况:——弹出所有标签
如果下一跳没有给我标签(没有运行MPLS的纯IP网络,我只能给它转发一个纯IP包的情况),则out是untag
LFIB中out是pop的情况:——只弹出一层外层标签
每台路由器对于本地直连的路由条目本地分配的是一个“隐式空”的空标签(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.关闭CEF:no 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