zoukankan      html  css  js  c++  java
  • MPLS(多协议卷标交换)

    MPLS(多协议卷标交换)

     

    一、传统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

    no mpls ldp advertise-labels

    mpls ldp advertise-labels for 11

  • 相关阅读:
    5000 端口 转发
    程序的运行环境=内存+运行库+系统调用
    日志异步落库
    malloc分配的空间是连续的吗?
    PE/ELF文件里面存的是什么呢?
    [Python]编码声明:是coding:utf-8还是coding=utf-8呢
    基于可执行代码的缓冲区溢出检测模型
    SU Demos-06Selecting Traces
    SU Demos-05Sorting Traces-03susorty
    SU Demos-05Sorting Traces-02Demos
  • 原文地址:https://www.cnblogs.com/xiaomai-rhce/p/10610043.html
Copyright © 2011-2022 走看看