• mpls 笔记 part 1


    MPLS 骨干网络视频课程
    mpls,优势于传统路由,在于,如果有两个目的地,使用了同样的网段,传统路由无法区分,而mpls可以使用标签轻松转发,而相互不受影响,

    只在入口,进行fec的查找和匹配,进入mpls域后,只进行标签查找替换等操作,所以,在入口处就可以确定到出口的整条转发路径,

    TDP,tag distribution protocol
    LDP,label distribution protocol
    RSVP,resource reservation protocol
    LFIB,label forwarding information base

    TDP(Cisco tag switching,后被公有化)是LDP的前身,
    mpls的下层分发标签的协议就是,LDP,
    TDP、LDP都是用来分标签的,
    但是除了它俩,还有可以用来分标签的是,MPBGP
    一个路由可以放到BGP里进行传输,MPBGP就将标签放到路由后面一起传输过去,
    让后第四个可以分发标签的是:BGP IPv4,
    当使用BGP IPv4进行标签传递的时候,就可以不使用LDP了,尤其是在两个AS之间进行标签的传递,用BGP IPv4更好用
    第五个可以传递标签的是:RSVP,
    区分服务模型,在每一台路由器上进行配置,优先转发yellow,如果拥塞就丢弃green
    集成服务模型,通过信令向沿途请求带宽,从而保证服务质量,因带宽都留够了,所以能保障重要的语音数据不会被丢失,
    当今,将信令预留的语音保证技术,应用在数据传输上,使用的就是RSVP技术,从源到目的地的整条路径带宽都提前预留出来,同时针对的是每一个流,每一个数据流,但在Internet上是不可能让沿途每个路由器都预留资源的,因此RSVP没能在Internet上兴起,反而是区分服务模型大行其道,

    分标签的协议有很多,但其中,LDP、TDP是专用的,
    TDP、LDP、MPBGP、BGP IPv4、RSVP

    我给别人分标签,这样别人用这个标签送来的数据,我才认识
    这就是标签的分发,label distribution,
    从别人处收来的标签,是remote label,
    自己给别人分配的标签是生成于本地的,因此叫,local label
    在LFIB中,别人送来的标签 remote label,叫in

    若将目的地设为下游,则数据包的流向是顺流而行。
    数据包的传递,是顺流而下的,从上游到下游,
    而标签的分配过程,是逆流而上的,是从下游到上游的,

    下游 沿途 上游
    17 4 入口
    入口,即上游路由器,收到数据包后,先查找FIB,会关联到标签4,然后用标签打包ipPackage,把标签包送给下游,下游路由器收到的是标签包,所以不会去查找FIB,而是直接查询LFIB, 把标签换成17,继续送往下游路由器,下游出口路由器,收到标签包,弹出标签,剩下ip包,查询FIB转发出去,

    control plane:
    1、ospf
    2、LDP

    data plane:
    1、LFIB
    2、FIBS

    区分是标签包还是ip包,使用垫片,即处于帧头和ip头之间的2.5层位置的label

    由frame header,帧头来说明上层具体是标签包还是ip包,帧头中的type是0800就是ip包,路由器首先查看帧头中的type就知道是标签包还是ip包,

    标签 label 20bit
    足够为每个数据流分配一个标签了, 2^20=1,048,576,一百万个,一百万条路由的体量,

    端到端的qos,是沿途每个路由器都能进行qos的保障,
    交换机识别cos,路由器识别tos,mpls内识别的是exp(experimental field),3bit
    experimental 实验性的东西

    ttl,time-to-live,对路由协议的防环机制进行保底,即使路由协议出现了环路,但最终ttl从255减少到0后,将被丢弃
    而不会一直在环中一直转发。

    标签的嵌套中,每个标签都是完整的,而不是某个标签里还有其他的标签

    label 1 s=0,label 2 s=0,label 3 s=1,这是一个典型的三层嵌套,最后一个标签中的第23比特为1,说明它是最内层的标签

    mpls通过tcp建立LDP的邻居关系,进行标签的分发,

    标签信息库,LIB,label information base,
    local 16,remote 20

    1.1.1.1/32 R1 local 16,R2 local 20 remote 16 remote 30,R3 local 30 remote20,
    LFIB,里放的是从邻居送来的路由条目,自己本地始发的路由也会在LFIB中出现,但其out为untag
    R1:LFIB
    1.1.1.1/32 - in 16 out untag (untag是弹出所有标签,pop是只弹出外层标签)
    R2:LFIB
    1.1.1.1/32 - in 20 out 16
    R3:LFIB
    1.1.1.1/32 - in 30 out 20

    FIB中的路由条目一定要关联标签,而且它关联的标签是,out方向的标签,也就是remote标签
    R3:FIB
    1.1.1.1/32 - label 20
    只在入口路由器上进行FIB的查找,所以本例中,从R3去往R1的ip数据包,只在R3上查FIB,而不用在R2和R1上查FIB
    老师总结:
    是什么包就查什么表(FIB是ip包的表,LFIB是标签包的表)
    从R3右侧到来的是ip包,所以,R3会首先查询自己的FIB,

    untag是弹出所有标签,因为它的下一跳没有给它任何标签,所以它只能给下一跳一个纯ip包,所以需要弹出所有标签

    边界路由器负担比较重,先要查FIB(需要压标签)或者查LFIB(弹标签),并且弹出所有标签后可能还要再去查询FIB,

    implicit
    英 [ɪmˈplɪsɪt]
    美 [ɪmˈplɪsɪt]
    adj. 含蓄的,隐式的,

    为了减轻出口路由器的负担,采用pop方式,让倒数第二跳的路由器去弹出标签,
    出口路由器会给倒数第二跳的路由器一个特殊的标签,implicit null(隐式空),其固定值是 3
    所以倒数第二跳的路由器,其LFIB表中,关联的标签是 out pop,
    PHP((Penultimate Hop Popping,倒数第二跳弹出)) router:LFIB
    1.1.1.1/32 in 20 out pop
    penultimate
    英 [penˈʌltɪmət]
    美 [penˈʌltɪmət]
    adj. 倒数第二的
    ultimate
    英 [ˈʌltɪmət]
    美 [ˈʌltɪmət]
    adj. 最后的;

    出口路由器,local :implicit-null 、3
    penultimate router,in local label,out pop

    CEF(Cisco Express Forwarding,Cisco特快交换)技术是思科公司推出的一种全新的路由交换方案

    adjacency
    [ә’dʒeisәnsi]
    n. 接(邻)近;毗邻;相邻性;邻接(物)

    CEF定义了两个主要部件:转发信息库(Forwarding Information base)和邻接表(Adjacency Table)

    FIB的条目与IP路由表条目之间有一一对应的关系,即FIB是IP路由表中包含的路由信息的一个镜像
    当网络拓扑或路由发生变化时,IP路由表被更新,FIB的内容随之发生变化

    若相邻节点间能通过数据链路层实现相互转发,则这些节点被列入邻接表中。

    CEF有两种模式:集中式和分布式。

    集中式允许一个路由处理模块运行特快交换,即FIB和邻接表驻留在路由处理模块中,

    分布式(一般记作dCEF)

    LSR:
    control plane:
    ospf
    RT
    LIB:存储自己生成的本地标签,和别人分配给己方的远程标签,只有TDP和LDP的标签,其他的(MPBGP)在别处保存

    data plane:
    				FIB
    				LFIB:存储了所有的标签,包括TDP、LDP、BGP...
    
    • 1
    • 2
    • 3

    RT有了,就会有FIB,
    cef就是对路由表的一个拷贝,

    当LFIB为空时,收到了带标签的数据包,直接丢弃,ip包则正常查找FIB进行转发,

    -1、OSPF:10.0.0.0/8 -> 1.2.3.4
    0、RT:10.0.0.0/8 -> 1.2.3.4
    1、LDP:10.0.0.0/8,L=3
    2、LIB:10.0.0.0/8 -> Next-hop L=3,Local L=5

    LIB,只会关联下游送来的标签,因为,下游路由器,是目的网段的下一跳,想要到达目的网段,必须把标签包送给下一跳才行,所以只能关联下一跳路由器,即下游路由器

    3、FIB:10.0.0.0/8 -> 1.2.3.4,L=3
    4、LFIB:L=5 -> L=3

    下游送来的标签(即remote label from downstream),被关联进FIB,
    FIB:10.0.0.0/8 -> 1.2.3.4,L=3

    接着LFIB也形成了,
    LFIB:L=5(local) -> L=3(remote {from downstream})

    	LSR:
    						CONTROL PLANE:
    
    • 1
    • 2

    EXCHANGE OF ROUTING INFORMATION <-> ROUTING PROTOCOL:
    IP ROUTING TABLE:
    EXCHANGE OF LABELS <-> LDP:
    DATA PLANE:
    INCOMING IP PACKETS --> IP FORWARDING TABLE: --> OUTGOING IP PACKETS/OUTGOING LABELED PACKETS
    INCOMING LABELED PACKETS --> LABEL FORWARDING TABLE: --> OUTGOING LABELED PACKETS

    NO IP DOMAIN LOOKUP

    ROUTER OSPF 1
    NETWORK 1.1.1.0 0.0.0.255 A 0

    在接口上配置了mpls,默认就启动了LDP协议,也可以更改成其他的标签分发协议,

    LDP,会建立邻居,使用TCP 646,也会使用 UDP 发送hello包,来维持邻居的关系

    但是,在Cisco上,标签分配是从16开始的,可能会出现,多个路由器上都使用了16作为标签的情况出现,在实验中不利于观察,所以需要手工指定每台路由器的标签范围,但必须在启用mpls之前修改标签范围,因为,一旦启用了mpls,标签就自动生成了,

    MPLS LABEL RANGE 16 100
    minimum label value maximum label value
    这条命令是对本路由器上所有的标签协议的标签范围做了更改,也就是,LDP、MPBGP都会受此影响

    启用mpls,到接口下使用命令
    INTERFACE S1/0
    MPLS IP
    ldp neighbor 2.2.2.2:0 is up

    SHOW MPLS LDP NEIGHBOR
    peer ldp ident:1.1.1.1:0;local ldp ident 2.2.2.2:0
    tcp connection:1.1.1.1.646 - 2.2.2.2.26267
    ldp discovery sources:
    serial 0/0,src ip addr:12.1.1.1
    peer ldp ident:3.3.3.3:0;local ldp ident 2.2.2.2:0
    tcp connection:3.3.3.3.28923 - 2.2.2.2.646
    ldp discovery sources:
    serial 0/1,src ip addr:23.1.1.2

    show ip cef detail //就是查看FIB表
    epoch 时期;新纪元;新时代;阶段
    1.1.1.1/32
    tag information set
    local tag:implicit-null

    show mpls forwarding-table
    local-tag outgoing-tag prefix outgoing-interface next-hop
    101 pop tag 1.1.1.1/32 se0/0 point2point
    102 pop tag 3.3.3.3/32 se0/1 point2point

    C:
    show mpls ldp bindings
    tib entry:1.1.1.1/32,rev 2
    local binding: tag:201
    remote binding: tsr:2.2.2.2:0,tag:101
    tib entry:2.2.2.2/32,rev 4
    local binding: tag:202
    remote binding:tsr:2.2.2.2:0,tag:imp-null
    tib entry:3.3.3.3/32,rev 6
    local binding: tag:imp-null
    remote binding: tsr:2.2.2.2:0,tag:102
    tib entry:12.1.1.0/24,rev 10
    local binding: tag:203
    remote binding: tsr:2.2.2.2:0,tag:imp-null
    tib entry:23.1.1.0/24 rev 8
    local binding: tag:imp-null
    remote binding: tsr:2.2.2.2:0,tag:imp-null

    show mpls forwarding-table //查看LFIB
    local-tag outgoing-tag prefix outgoing-interface next-hop
    201 101 1.1.1.1/32 se1/0 point2point
    202 pop tag 2.2.2.2/32 se1/0 point2point
    203 pop tag 12.1.1.0/24 se1/0 point2point

    tib entry:3.3.3.3/32,rev 6
    	local binding: tag:imp-null
    	remote binding: tsr:2.2.2.2:0,tag:102		//因为3.3.3.3直连在C上,所以2.2.2.2,不是去往3.3.3.3的C的下一跳,就不会出现在C的LFIB中
    
    • 1
    • 2
    • 3

    remote binding: tsr:2.2.2.2:0,tag:102 ,这个标签是2.2.2.2给1.1.1.1分配的,但因为ldp标签分配是无序的,所以直连着3.3.3.3的C也收到了

    B:
    show mpls ldp binding
    tib entry:1.1.1.1/32,rev 2
    local binding: tag:101
    remote binding: tsr:1.1.1.1:0,tag:imp-null
    remote binding: tsr:3.3.3.3:0,tag:201
    tib entry:2.2.2.2/32,rev 4
    local binding: tag:imp-null
    remote binding:tsr:1.1.1.1:0,tag:16
    remote binding: tsr:3.3.3.3:0,tag:202
    tib entry:3.3.3.3/32,rev 6
    local binding: tag:102
    remote binding: tsr:1.1.1.1,tag:17
    remote binding: tsr:3.3.3.3:0,tag:imp-null
    tib entry:12.1.1.0/24,rev 10
    local binding: tag:imp-null
    remote binding: tsr:1.1.1.1:0,tag:imp-null
    remote binding: tsr:3.3.3.3:0,tag:203
    tib entry:23.1.1.0/24 rev 8
    local binding: tag:imp-null
    remote binding: tsr:1.1.1.1:0,tag:18
    remote binding: tsr:3.3.3.3,tag:imp-null

    show ip cef detail //就是查看FIB表

    RouterB
    tib entry:3.3.3.0/24,rev 16
    remote binding: tsr:3.3.3.3:0,tag:imp-null //B没有/24的路由,但收到了C送来的/24的标签
    tib entry:3.3.3.3/32,rev 6
    local binding: tag:104
    remote binding: tsr:1.1.1.1,tag:22 //B有/32的路由,但没有收到C送来的关于/32的标签

    ospf在宣告环回接口的时候,都使用的是/32的掩码,所以B关于3.3.3.3,有/32的路由,但没有/24的路由
    所以,3.3.3.0/24就进不了FIB,也就关联不到标签,所以B就认为,C上关于3.3.3.3/32 提供的路由和标签不同步
    B有3.3.3.3/32的路由,所以在本地给/32分配了一个标签,但没收到C送来的/32的标签,所以就只能untag,

    routerB:
    show mpls forwarding-table
    local-tag outgoing-tag prefix outgoing-interface next-hop
    103 untagged 1.1.1.1/32 se0/0 point2point
    104 untagged 3.3.3.3/32 se0/1 point2point

    B给/24分配了标签207,送给C,但C不会理会,因为C没有/24的路由,C只有汇总的/16的路由,
    B给/16分配了imp-null,送给C,C先查FIB,一看,B说了不要标签,所以,C给B的时候,不会压标签,只送纯ip包给B
    B再给A的时候,查到了明细路由/24,一看,A说了不要标签,所以,不会压标签,而是送去纯ip包给A

    tib entry:1.1.1.0/24,rev 17
    	local binding: tag:101
    	remote binding: tsr:1.1.1.1:0,tag:imp-null
    
    • 1
    • 2
    • 3

    B去查FIB,找到路由条目1.1.1.0/24,想压标签,但下一跳A(1.1.1.1)不要标签,所以又没压成功,只能送去纯ip包

    距离矢量路由协议,都是在接口下做路由汇总,

    assign 指定;分配

    LIB,就是记录标签用的,local label 在LIB里储存着,通过LDP、TDP送来的其他邻居给的标签,也保存在LIB中

    LIB on B: local label is stored in LIB
    network LSR label
    X local 25

    routing table of B: //router B assigns label 25 to destination X
    network next-hop
    X C

    LFIB on B: //outgoing action is untagged,as B has received no label for X from C
    label action next-hop
    25 untagged C

    LFIB,关联出口标签,

    label distribution,is advertised to all neighbor,regardless neighbor are upstream/downstream

    LIB on A:
    network LSR label
    X B 25
    X local 2022
    FIB on A:
    network next-hop label
    X B 25

    interim 暂时的;过渡的
    propagation 传播
    perform 执行

    ip lookup,perform in FIB
    packet is labeled

    label lookup,perform in LFIB
    label is removed

    further 进一步
    eventually 最后

    router C assigns label 47 to destination X:
    LIB on C:
    network LSR label
    X B 25
    X local 47
    //没有这一条X D implicit-null,这是因为C和D之间压根就没有mpls,所以C的LFIB的动作是untagged,而不是pop tag
    LFIB on C:
    label action next-hop
    47 untagged D

    B receiving label 47 from C:
    LIB on B:
    network LSR label
    X local 25
    X C 47

    E receiving label 47 from C:
    LIB on E:
    network LSR label
    X B 25
    X C 47

    FIB on B:
    network next-hop label
    X C 47

    FIB on E:
    network next-hop label
    X C 47

    LFIB on B:
    label action next-hop
    25 47 C
    1、router B has already assigned a label to X ,
    and created an entry in the LFIB
    2、the outgoing label is inserted in LFIB,
    after the label is received from the next-hop router C(LSR),

    LIB on B:
    network LSR label
    X local 25
    X C 47
    FIB on B:
    network next-hop label
    X C 47
    LFIB on B:
    label action next-hop
    25 47 C

    1、packet is labeled(ip packet ,lookup FIB)
    2、label is switched (label packet,lookup LFIB)
    3、label is removed (label packet,lookup LFIB)

    announce 宣布

    unsolicited 自发的,网络-主动的

    the label for a prefix,
    is allocated and advertised to all neighbor,
    regardless neighbor are upstream/downstream for the destination

    mpls label protocol tdp
    tdp neighbor 1.1.1.1:0(1)is up

    show mpls ldp binding

    使用mpls可以传递bgp路由,中间没有中转,

    ip头内有option字段,可以记录路由器的接口地址,路由器再转发ip包的时候,会把自己的入接口ip地址记录到ip头中的option中,但来回都记的话,记录不了几跳,
    所以,traceroute,就没有使用ip头中option来记录/回显路由器ip地址的这件工作,

    R1 eth1–eth0 R2 eth1–eth0 R3 eth1–eth0 R4

    1、R1发送一个ttl=1的包给R2,
    R2看到包不是给自己的,是给R4的,所以尝试转发,但ttl-1后变0了,所以丢弃数据包,并给R1回送一个ttl-expired,的ICMP包(Internet control message protocol)
    R2使用eth0作为源地址,所以R1就知道了R2的ip地址,
    2、同理,R1发送一个ttl=2的包给R2,R2把ttl-1=1,正常转发给R3,R3把ttl-1=0,遇到了和R2同样的情况,先丢弃ttl=0的包,然后,给源R1送ttl-expired的icmp,
    R3使用eth0作为源地址,目的地址是R1,所以R1也就知道了R3的ip地址,
    3、R1给R4一个ip包,UDP协议的user datagram protocol,目标端口值,destination port value grater than 32000,于是R4去查上层应用谁在使用32000端口,一般情况下没有应用程序会使用这么大的端口号,所以udp就会调用下层的icmp报错,目标端口不可达,destination port unreachable 给R1,所以R1也就知道了R4的ip地址,这个过程和前两步不同,前两步是通过控制ttl值,让R1收到ttl-expired的icmp报错,

    mpls traceroute
    在mpls里,lsr只看标签,所以它不知道标签里的ip源是谁,它只知道这个标签包是去往目的网段的,按常规操作应该压入去往目的网段的来自下游路由器送来的标签给下一跳路由器,但这个标签包因为ttl=0了,已经被丢弃了,所以ttl-expired的icmp报错包不知道该送给谁,因为它只认识标签而看不到标签包里的源ip地址是啥(能看到标签包里的ip源是ler的工作,lsr只看标签而不会打开标签包看里面的ip源,这是mpls的工作机制),于是机灵的小路想到既然这个包是有目的地的,那干脆把ttl-expired的icmp报错包就送到目的地,因为目的地是ler,是能看到标签包里ip源的,所以,小路就按常规操作把标签包压入去往目的网段的来自下游路由器送来的标签给下一跳路由器,

    mpls传递bgp路由,
    30W的bgp路由条目,只使用一个标签交换路径LSP,就可以到目的地,因为,源和目的不需要为每一条bgp路由分配标签,而只需要使用到目的地的那个标签就行,通常是目的地的loopback
    尤其是,在源和目的之间存在多个pe的时候,每个pe路由器都只需要维护一组标签就能传递海量路由了,
    可以把bgp路由当成客户的路由,通过mpls传递bgp路由,就相当于,运营商的pe中不用知道用户的路由一样,当运营商的用户越来越多,用户的总路由就会越来越大,而运营商使用mpls传递bgp的时候,就不需要沿途的每个pe都知道用户的路由,也就是中间路由器不用承载客户路由,

    不用为客户路由分标签,使用客户路由的下一跳loopback的标签,就能传递客户路由,压下一跳标签

    关闭mpls
    no mpls ip
    开启mpls
    mpls ip
    就会出现下面的问题和情况,所有的outgoing标签都为untagged,
    show mpls forwarding
    local outgoing prefix
    102 untagged 1.1.1.1/32
    当看到untagged的标签时,往往说明ldp邻居都没有建立起来,
    show mpls ldp neighbor
    null

    使用环回口1.1.1.1 先建立了邻居,然后再起新环回口11.11.11.11 ,但之前的邻居关系已经把环回口已经选好了是1.1.1.1,
    而现在,关闭mpls ,再开启mpls,就会重新选环回口,规则是选最大的环回口去建立邻居,but,现在用11.11.11.11去和2.2.2.2建邻居是建立不起来的,因为,2.2.2.2根本就没有11.11.11.11的路由,11.11.11.11是bgp宣告的,不像1.1.1.1是ospf宣告给同区的2.2.2.2那样,

    解决办法 一 ,强制指出ldp的router-id
    mpls ld router-id loop 0
    loopback 0 1.1.1.1
    loopback 1 11.11.11.11
    但是不会生效,如想立即生效,需要在命令尾部加 force
    mpls ldp router-id loopback 0 force
    force forcibly change the ldp router id
    default-ip-routing-table:tdp id removed
    ldp neighbor 2.2.2.2:0 is up

    解决办法 二,不改变ldp router id,而是指明ldp的直连接口
    int s1/0
    mpls ldp discovery transport-address interface

    方法二比较好,因为通常情况下,router-id是不能随便更换的,

    控制数据的流动,使用acl,控制发哪些数据,不发哪些数据
    控制路由,在每一个路由协议下面使用 分发列表 distribute-list,例如在rip里不去发送1.1.1.1的更新路由,在每一个路由协议下面去调用专用的分发列表,
    控制标签的分发,之前是把标签分别送给上游和下游的路由器,现在想做到,只给上游,不给下游,允许向谁发送,

    控制标签映射的分发:
    tag-switching advertise-tag [for access-list-for-definition-prefixes][to access-list-for-tdp/ldp-peers]
    for 哪个路由,to 哪个邻居
    definition 定义
    tag-switching是老命令了,现在可以使用新命令,如下:
    mpls ldp advertise-labels [for access-list-for-definition-prefixes][to access-list-for-tdp/ldp-peers]

    mpls ldp advertise-labels for 1 to 2
    access-list 1 permit host 2.2.2.2
    access-list 2 permit host 11.11.11.11 (实验证明使用接口地址12.1.1.1是不行的,不会发送标签出去,而且是下游也不给标签,因为acl2的缘故没匹配到3.3.3.3所以deny了,只给1.1.1.1发标签,但是却使用的是接口地址,所以给上游的1.1.1.1发标签也失败了)
    虽然的确是是使用的直连接口12.1.1.1去建立的ldpneighbor,但是,在控制标签的分发的时候,还是要使用router-id 11.11.11.11来指明ldp-peers

    R1:
    show mpls forwarding-table
    local-tag outgoing-tag prefix
    20 untagged 2.2.2.2/32

    R3:
    show mpls forwarding-table
    local-tag outgoing-tag prefix
    19 pop tag 2.2.2.2/32

    pop tag 是弹出 ldp peer 给分配的 implicit-null 这个表示空的标签
    untagged 是压根 就没收到此路由的标签,

    June the 23th 2022

  • 相关阅读:
    搭建MyCat2一主一从的MySQL读写分离
    python单元测试
    RESTful 分享
    打开文件 和 文件系统的文件产生关联
    【动态规划刷题 17】回文子串&& 最长回文子串
    Python批量获取高校基本信息
    RPA主要有那些特征,多久可以学会?
    小型洗衣机什么牌子好又便宜?内衣洗衣机推荐
    d3dcompiler43.dll是什么?d3dcompiler43.dll缺失怎么解决?
    Asp-Net-Core开发笔记:快速在已有项目中引入EFCore
  • 原文地址:https://blog.csdn.net/m0_47505062/article/details/125427817