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...
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:
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中
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
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