详谈-MPLS的基础和工作原理

版权声明:HUGO https://blog.csdn.net/weixin_42078367/article/details/84729066

MPLS==.>(Multple Protocol Label Switching)多协议标签交换---ISP使用

以前的路由器需要1.查询路由表--要知道从哪个接口出去,

                                 2.查询 ARP表 可以知道要打上什么mac地址

                                这样来看路由器的工作效率有点低,于是就出现MPLS的初期设计          

 

        将 R1,R2,R3,R4设定在一个 MPLS 域 。A-->B,首先进入到R1,R1给路由打上标签,比如说是17吧。然后到了R2上后,R2查询本地的LFIB 表(标签转发信息数据库表)得到去B,从F0/0 出去,在换上mac地址(X:D)。再次进入到R3上同样查询 本地的LFIB表,得到去B,从F0/0出去,换上mac地址(Z:D).之后进入R4上,去掉17号标签,从F0/0C出去,换上Mac地址(Y:D)

注意:在当时年代下,这种提速是相对的,(R1 R4 的负担加重了,需要打标签,去标签),R2 R3 稍微轻松点。还有这种做法使 包的长度变长了。

 

原始数据交换方式:

以前的路由器需要1.查询路由表知道从哪个接口出去,

扫描二维码关注公众号,回复: 4991055 查看本文章

                                2.查询 ARP表 可以知道要打上什么mac地址

                               这样来看路由器的工作效率有点低,

传统数据交换方式:一次路由,多次交换---(第一次数据包查两张表,查完后,生成  cache(相当于记录),后面的包 基于查询 cache转发)

 

CEF-快速转发:无需路由,直接交换---FIB +ADJ

随着这些转发方式的提高,MPLS 没有市场前景,大部分被 out了

 

MPLS起死回生的原因:

       1.解决BGP的路由黑洞问题

       2.MPLS VPN是 最接近于专线的

        3.MPLS TE(流量工程)

 

PDU--协议数据单元

包交换:依赖报文中的IP地址进行数据转发

标签交换:基于2.5层的标签号进行数据转发;

MPLS---多协议---无论网络层运行何种协议,2.5均可运行标签交换;

 

使用MPLS的前提是设备基于CEF工作==>寓意着 MPLS也升级了,以前的MPLS 跟 CEF 是相互矛盾的

  1. 启动CEF后,表格可以被ASIC(硬件芯片)直接调用。因为CEF表格是 纯二进制 表格
  2. CEF解决了递归的问题,便于MPLS生成标签转发表格
  3. CEF工作后生成FIB表,只有FIB可以存储标签表;

 

控制层面:交互路由信息(路由协议收敛);进行标签号的分发;

数据层面:根据路由表转发用户数据报文;基于标签号进行数据转发,压入标签、弹出标签;

 

控制层面:通过IGP或EGP交互路由条目,生成路由表,然后CEF基于路由表生成FIB表;MPLS使用TDP(思科 私有)/LDP(共有)基于FIB表中的每一条信息(本地所有的路由条目)生成一个标签号,然后告知所有邻居;

该工作完成后路由器上生成:

1.路由表

2.FIB表---转发(forward)信息数据库==  CEF基于路由表生成,主要是解决递归查找

3.LIB表---标签信息数据库(本地和邻居关于所有学习到的路由条目生成的标签号)

4.LFIB表--标签转发信息数据库----将FIB表和LIB进行结合

 

老版MPLS 自己来基于路由 生成标签表

新版的MPLS 基于CEF ,自己省事多了

 

 

 

数据层面:普通的数据包将基于FIB表转发;

                   若数据包中存在标签号基于LFIB进行转发;标签的压入和弹出也是在数据层面完成的;

MPLS的数据封装于2层和3层间,故称为2.5层

MPLS的数据包格式:

前20位为标签号:存在2^20个号码,其中0-15保留;请记住一个标签号对应 <==>一个网络段

21-23位为8个优先级,用于QOS;

25-32位TTL----当标签号被压入时,将复制3层报头的TTL值,然后每经过一个路由器减1,当标签号弹出时,复制回IP报头中;(防止回路产生)

第24位为栈底位---为1标示本信息为最后一层标签信息;最多可以存在3层标签;

 

 

 

一层标签为普通MPLS,主要用于解决BGP的路由黑洞;

二层标签为MPLS VPN使用;

三层标签为MPLS TE使用;

 

使用MPLS后,二层若依然为以太网封装,那么类型号将变化:

0x8847 MPLS单播

0x8848 MPLS 多播

 

名词注解:

 

  1. MPLS domain--MPLS工作的范围
  2. LSR(P路由器):标签交换路由器  查看数据包中的标签号然后基于LFIB表进行转发
  3. Edge LSR(PE路由器):边界标签路由器;在数据层面时,MPLS 域的第一跳路由器负责标签的压入,最后一跳负载弹出;
  4. CE 客户端路由器,不工作于MPLS域,使用FIB表转发流量;

MPLS的工作过程:

数据层面:

 

 

1. MPLS协议--TDP/ LDP 先建立邻居关系-生成邻居表

2.当控制层面使用路由协议传递路由条目后,

3.路由器上使用TDP/LDP为本地FIB表中每一条存在的路由条目均分配一个标签号,

4.同时将标签号传递给给所有邻居,装载于LIB表中--记录着本地 及邻居分配的 所有号码标签

5.之后TDP/LDP 基于本地的FIB和LIB表生成LFIB---标签转发表---标签号的最佳路径对应;包含着 入标签--对应的出标签--下一跳--- 源 目mac

 

数据层面工作时,1.第一跳路由器负责标签的压入,

                                2.中间路由器基于标签号转发流量,进行标签号的替换,

                                3.最后一跳路由器负责标签的弹出;

注:入标签号为本地分配的标号,出标签为下一跳(下游)分配的标签号;

         存在上下游路由器概念,基于数据层面定义;

 

MPLS的优化: PHP次末跳 -----倒数第二跳;默认执行

 未优化的情况下:

 

    这个小问题出现在最后一条路由器上,当收到路由后,此时会把标签给弹掉,但是弹掉之后没有该干什么呢?自己本身不知道,于是又去查询路由表,得到是怎么走,然后在转发!!(这个就相当于 最后的路由器 必须查询两张表---先查标签,在查路由表)

有优化的:

 

 优化之后,就可以在倒数第二跳路由器上就把标签给弹掉了,最后一台路由器直接查询 FIB 就可以知道从哪出去!!!

 

最后一跳路由器在默认情况下:1.需要查看LFIB表

                                                        2.后再查看FIB表,然后转发数据;

PHP可以使倒数第二跳在已知出接口、下一跳等信息时便将标签号弹出,然后基于出接口转发流量;导致最后一跳路由器仅查看FIB表;

 

最后一跳路由器,将本地直连路由传递给邻居时使用标号3来告知对方为倒数第二跳;

非直连路由正常分配标签号;针对域外的非直连路由,域内的最后一跳路由器需要查询两张表;建议PE路由器直接连接用户,不再连接其他路由器;

 注:pop 标示仅弹出最上层标签---仅仅只是倒数第二跳;

        untagged 弹出所有标签---意味了离开MPLS domain;

 

配置:

 

  1. 单播路由协议  --路由表
  2. CEF          ---FIB
  3. (可选,建议配置)--修改MTU值;  链路两端一致;

普通MPLS--1504  

MPLS VPN--1508 

MPLS TE-1512

 

r1(config)#interface s1/1

r1(config-if)#mtu ?

  <64-17940>  MTU size in bytes  修改接口MTU值

 

  1. 开启MPLS ----在标签号所有需要经过的接口上配置

                r2(config)#interface s1/1

                 r2(config-if)#mpls ip  开启某个接口的MPLS协议

 

             当命令一敲完,TDP/LDP 就开始工作了

            MPLS协议在工作时,存在两种封装:

             1、TDP  cisco私有      TCP/UDP 711   hello包基于UDP传输,标签信息基于TCP传输

             2、LDP  公有          TCP/UDP 646   hello包基于UDP传输,标签信息基于TCP传输

          Cisco ios 版本12.4(3)以下设备默认使用TDP,以上使用LDP;

 

r2(config)#mpls label protocol ?  修改封装协议

 

 

协议开启后,邻居间使用hello包建立邻居关系,生成邻居表:

 

r2#show mpls ldp neighbor    存在RID,RID的选举规则同OSPF一致

注:RID同时作为了建立TCP会话的源目ip地址;若存在环回,那么默认使用环回作为RID,此时就必须将环回宣告到路由协议中--必须可达;

 

r2(config)#mpls ldp router-id serial 1/1 ?  修改RID为S1/1口的地址

 

  force  Forcibly change the LDP router id   立即生效

  <cr>                                 重启设备后生效

 

当邻居关系建立后,邻居间会将基于FIB表生成的标签号传递给邻居,保存于LIB表中:

r2#show ip cef detail  查看FIB表

r2#show mpls ldp bindings 查看LIB表

之后将LIB表和FIB表进行结合,生成LFIB表,基于该表格进行标签流量转发;

 

r2#show mpls forwarding-table

 

在R1没有基于标签转发,因此就没show 出来:

 

 

在R2上show 就可以

 

 

猜你喜欢

转载自blog.csdn.net/weixin_42078367/article/details/84729066