MPLS的产生
在计算机发展初期,对于网络中的数据转发,公司内的局域网还好说,但是在公网中,我们面临着许多IP,如果有数据需要转发,路由器设备需要在IP路由表中一个一个地查询,这时就面临着IP多,设备拉,速率就直线下降的问题
我们有两种方式去解决这个问题。
1、将硬件设备提升
2、换一种方式进行数据的转发,不再使用IP进行转发,而是使用标签进行转发,这就是MPLS的核心理念,使用标签进行数据转发
MPLS只会去查找边缘设备的IP报头,而内部就使用标签进行转发。即边IP,内标签
标签转发:原来数据的转发需要去查路由表,而在MPLS中可以直接根据标签的信息进行转发,并不会像IP那样去关心下一条
而上述的MPLS都只是为了去加快数据的转发
MPLS的没落
随着时代的进步,设备的CPU也在提高,这使得单纯地依靠CPU的算力,可以路由表的转发速度是于使用MPLS的速率是一样的
MPLS的第二春
如果用户只想单纯地访问公网,那么使用NAT技术即可做到
但若是像主公司和分公司的情况,就需要内网跨越公网去到达其它的内网,这时就需要使用VPN技术,而数据在VPN中的传输速率就需要用到MPLS VPN来进行提升的
于普通的MPLS类似,MPLS VPN 的核心理念就是标签隧道
就是在IP层上在使用标签进行封装,其实VPN的本质就是对数据的再封装,如下
正常封装 | 二层帧 | 三层包 | 四层段 | date | |
---|---|---|---|---|---|
MPLS封装 | 二层帧 | MPLS | 三层包 | 四层段 | date |
MPLS的术语
MPLS Domain:指的是运行MPLS的设备集合
LSR(标签交换设备),LSR主要分为以下三种
ingress(入节点)作用是使标签加载到设备中
transit(中间节点)作用是在设备于设备之间进行标签的交换
egress(出节点)作用是使标签从设备中出来
LSP(标签交换路径)
前面说的三个LSR中,通过出、入节点和0个或者多个中间节点组成的路径分为上下游设备
LSP就相当于一个VPN一样
FEC(转发等价类)
FEC是用来描述LSP的这条路径上有那些流量。将相同方式出的流量统一成一个集合或是说一条流、一个FEC
可以使用源IP、目的IP、源端口、目的端口、VPN...几种方式判断是否为同一条流
MPLS的体系架构
如,OSPF生成路由,在MPLS中该条路由不会根据路由表进行转发,而是根据RIB复印一份FIB表,进行转发
RIB的查看:dis ip routing
FIB的查看:dis fib
如下图,这就是FIB表的信息,Destination对应的Interface,表示接收到Destination的信息后就会从Interface中出去
TunnelID则代表是使用IP进行转发,还是使用标签进行转发
若是TunnelID为0,则说明IP转发,TunnelID为1,则说明是使用标签进行转发
而控制平面与转发平面之间的关系就相当于CPU算出了结果随后就放到的内存当中
控制平面生成了路由放到了转发平面当中
但LDP分发给FIB的并不是标签,而是生成标签的索引
MPLS标签
MPLS标签的位置:二层帧、MPLS、IP头部
MPLS标签中的内容:Label、EXP、S、TTL(32bit)
MPLS头部格式,一共为32bit长度,共有4个部分组成
①标签值域(0~20bit)②exp(21~23bit)③s bit(24bit)④TTL(25~32bit)
标签值域范围
特殊标签,0~15,指的是每个标签都有独特的功能,如3号标签就是隐式空标签。
静态标签,16~1023,通常都是管理员手工配置上去的
动态标签,1024~max,一般通过动态的方式获取标签,如LDP协议。MP-BGP协议,RSVT-TE协议和策略分配
exp bit
exp用作于流量的优先级,类似于IP报文的service type和802.1Q帧的pri
S bit
表示栈底bit位,用作判断该标签是否位最后一个标签,就紧挨着IP头部的标签,如下,MPLS2就存在着栈底标签
二层帧 | MPLS1 | MPLS2 | 三层包 | 四层段 |
---|
S=1表示位栈底标签,S=0为非栈底标签
TTL值
与IP中的TTL值类似,其目的是为了防环
配置静态标签MPLS
先将基础IP配置完成,要求是不做路由,只在R1(lo0)上做一条静态路由去往R4(lo0),最终的目的是通过标签使得R1访问R4(ping -a 1.1.1.1 4.4.4.4)
当我们直接输入mpls命令妄想开启mpls时,会提示要想开启mpls,先要配置lsr-id
但需要注意的是,这里的lsr-id并不是给mpls使用的,而是给我们后面需要的LDP所使用
而lsr-id与那些route-id不同,lsr-id需要是本设备上的一个真实IP地址,这里使用lo0口替代
并且但我们配置好lsr-id后,mpls同样也能正常使能
[R1]mpls lsr-id 1.1.1.1
[R1]mpls
Info: Mpls starting, please wait... OK!
同样地,我们给MPLS路径上的每一台设备都使能MPLS
[R2]mpls lsr-id 2.2.2.2
[R2]mpls
Info: Mpls starting, please wait... OK!
[R3]mpls lsr-id 3.3.3.3
[R3]mpls
Info: Mpls starting, please wait... OK!
[R3]mpls lsr-id 4.4.4.4
[R3]mpls
Info: Mpls starting, please wait... OK!
R1作为整个MPLS的ingress,需要为其配置去往4.4.4.4的路由分配标签
R1-R4为自定义的这条路径名,destination为目标地址,outgoing-interface为出接口,nexthop为下一跳,out-label为发出的标签
[R1]static-lsp ingress R1-R4 destination 4.4.4.4 32 outgoing-interface g0/0/0 nexthop 10.0.1.2 out-label 102
在R1上去ping 4.4.4.4,抓取其数据包并分析
很明显,这里是没有抓到标签的数据的,但?为什么呢?
因为我们整个的MPLS的路径是并不完整的,即标签路径是不完整的
其次我们通过查看fib表,也发现去玩4.4.4.4的TunnelID为0,表示IP转发,并没有采用标签转发的形式
我们之前提到过LSR,有三种设备,分别是ingress入节点、transit中间节点、egress出节点
由这三种设备组成MPLS的标签路径,需要在每一个设备上配置MPLS路径才能建立一条独属标签的转发路径
而刚刚已经展示过了ingress入节点的配置方法,接下来展示一下transit中间节点和egress出节点的配置方法
transit中间节点配置如下
R1-R4为路径名称,incoming-interface为标签的入接口,in-label为入标签,nexthop为下一跳,outgoing-interface为标签的出接口,out-label定义出标签
[R2]static-lsp transit R1-R4 incoming-interface g0/0/0 in-label 102 nexthop 10.0.2.2 outgoing-interface g0/0/1 out-label 203
[R3]static-lsp transit R1-R4 incoming-interface g0/0/0 in-label 203 nexthop 10.0.3.2 outgoing-interface g0/0/1 out-label 304
egress出节点配置如下
[R4]static-lsp egress R1-R4 incoming-interface g0/0/0 in-label 304
但现在如果贸然地去ping -a 1.1.1.1 4.4.4.4,结果还是没有在IP上面打上标签的
原因是:我们现在处于一个标签路径做好的情况下,但是并没有告诉设备我们需要去使用MPLS,即没有在接口上使能MPLS
做法:我们需要在MPLS标签路径上的每一台设备的接口,都去使能MPLS,以R1的g0/0/0接口为例子
[R1]int g0/0/0
[R1-GigabitEthernet0/0/0]mpls
这时我们再去ping -a 1.1.1.1 4.4.4.4,虽然ping不通,但是我们通过抓包分析,已经可以看到报文内部有一层MPLS的报文信息了
而ping不通的原因很显然,是因为我们有了数据包去4.4.4.4的路径了,却没有R4的4.4.4.4会1.1.1.1的路径
所以我们还要像上面那样,将路径给配置会到R1上
R4上
[R4]static-lsp ingress R4-R1 destination 1.1.1.1 32 nexthop 10.0.3.1 outgoing-interface g0/0/0 out-label 333
R3上
[R3]static-lsp transit R4-R1 incoming-interface g0/0/0 in-label 333 nexthop 10.0.2.1 outgoing-interface g0/0/1 out-label 222
R2上
static-lsp transit R4-R1 incoming-interface g0/0/1 in-label 222 nexthop 10.0.1.1 outgoing-interface g0/0/0 out-label 111
纯享版
R1上
[Huawei]sysnam
[Huawei]sysname R1
[R1]int g0/0/01
[R1-GigabitEthernet0/0/0]ip add 10.1.1.1 24
[R1-GigabitEthernet0/0/0]q
[R1]int lo0
[R1-LoopBack0]ip add 1.1.1.1 32
[R1-LoopBack0]q
[R1]mpls lsr-id 1.1.1.1
[R1]mpls
Info: Mpls starting, please wait... OK!
[R1-mpls]q
[R1]static-lsp ingress 1-4 destination 4.4.4.4 32 nexthop 10.1.1.2 outgoing-interface g0/0/0 out-label 102
[R1]ip route-static 4.4.4.4 32 10.1.1.2
[R1]int g0/0/0
[R1-GigabitEthernet0/0/0]mpls
[R1-GigabitEthernet0/0/0]q
[R1]static-lsp egress 4-1 incoming-interface g0/0/0 in-label 201
R2上
<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]sysname R2
[R2]int lo0
[R2-LoopBack0]ip add 2.2.2.2 32
[R2-LoopBack0]int g0/0/0
[R2-GigabitEthernet0/0/0]ip add 10.0.1.2 24
[R2-GigabitEthernet0/0/0]int g0/0/1
[R2-GigabitEthernet0/0/1]ip add 10.0.2.1 24
[R2-GigabitEthernet0/0/1]q
[R2]mpls lsr-id 2.2.2.2
[R2]mpls
Info: Mpls starting, please wait... OK!
[R2-mpls]q
[R2]static-lsp transit 1-4 incoming-interface g0/0/0 in-label 102 nexthop 10.1.2.2 outgoing-interface g0/0/1 out-label 203
[R2]int g0/0/0
[R2-GigabitEthernet0/0/0]mpls
[R2-GigabitEthernet0/0/0]int g0/0/1
[R2-GigabitEthernet0/0/1]mpls
[R2-GigabitEthernet0/0/1]q
[R2]static-lsp transit 4-1 incoming-interface g0/0/1 in-label 302 nexthop 10.1.1.1 outgoing-interface g0/0/0 out-label 201
R3上
<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]sysnam
[Huawei]sysname R3
[R3]int lo0
[R3-LoopBack0]ip add 3.3.3.3 32
[R3-LoopBack0]int g0/0/0
[R3-GigabitEthernet0/0/0]ip add 10.0.2.2 24
[R3-GigabitEthernet0/0/0]int g0/0/1
[R3-GigabitEthernet0/0/1]ip add 10.0.3.1 24
[R3-GigabitEthernet0/0/1]q
[R3]mpls lsr-id 3.3.3.3
[R3]mpls
Info: Mpls starting, please wait... OK!
[R3-mpls]q
[R3]static-lsp transit 1-4 incoming-interface g0/0/0 in-label 203 nexthop 10.1.3.2 outgoing-interface g0/0/1 out-label 304
[R3]int g0/0/0
[R3-GigabitEthernet0/0/0]mpls
[R3-GigabitEthernet0/0/0]int g0/0/1
[R3-GigabitEthernet0/0/1]mpls
[R3-GigabitEthernet0/0/1]q
[R3]static-lsp transit 4-1 incoming-interface g0/0/1 in-label 403 nexthop 10.1.2.1 outgoing-interface g0/0/0 out-label 302
R4上
[Huawei]sysnam
[Huawei]sysname R4
[R4]int lo0
[R4-LoopBack0]ip add 4.4.4.4 32
[R4-LoopBack0]int g0/0/0
[R4-GigabitEthernet0/0/0]ip add 10.0.3.2 24
[R4-GigabitEthernet0/0/0]q
[R4]mpls lsr-id 4.4.4.4
[R4]mpls
Info: Mpls starting, please wait... OK!
[R4-mpls]q
[R4]static-lsp egress 1-4 incoming-interface g0/0/0 in-label 304
[R4]int g0/0/0
[R4-GigabitEthernet0/0/0]mpls
[R4-GigabitEthernet0/0/0]q
[R4]static-lsp ingress 4-1 destination 1.1.1.1 32 nexthop 10.1.3.1 outgoing-interface g0/0/1 out-label 403
这样我们就等于初步创建了一个vpn隧道了
在实际的生产环境中,R2与R3就相当于在运行商那里管理的设备,而R1与R4就是需要我们自行管理的不同子公司之间的设备了
MPLS转发过程
在MPLS转发过程中,有三个重要的参数
1、TunnelID,相当于是隧道IP,在fib表项中,该信息是否要进入隧道进行转发,dis fib
2、NHLFE,下一跳标签转发条目,dis mpls nhlfe
3、ILM,入标签的映射表,dis mpls ilm
在查看NHLFE和ILM的时候,需要先使用命令diagnose开启诊断模式,在进行查看
TunnelID的作用
1、判断接收IP报文时,是否要进行隧道转发
2、判断接收IP报文时,根据入标签匹配TunnelID在匹配到出标签,即标签的转发
FEC(转发等价类)的体现
如下图
但R1去往4.4.4.4时和R1去往3.3.3.3时,这两条路径,在R1到达R2的过程中是属于同一转发等价类的,但是等到R2往后的过程中就不一样了
息是否要进入隧道进行转发,dis fib
2、NHLFE,下一跳标签转发条目,dis mpls nhlfe
3、ILM,入标签的映射表,dis mpls ilm
在查看NHLFE和ILM的时候,需要先使用命令diagnose开启诊断模式,在进行查看
TunnelID的作用
1、判断接收IP报文时,是否要进行隧道转发
2、判断接收IP报文时,根据入标签匹配TunnelID在匹配到出标签,即标签的转发
FEC(转发等价类)的体现
如下图
但R1去往4.4.4.4时和R1去往3.3.3.3时,这两条路径,在R1到达R2的过程中是属于同一转发等价类的,但是等到R2往后的过程中就不一样了
[外链图片转存中...(img-aIjDz7TS-1734930514995)]