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.查询路由表知道从哪个接口出去,
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 是相互矛盾的
控制层面:交互路由信息(路由协议收敛);进行标签号的分发;
数据层面:根据路由表转发用户数据报文;基于标签号进行数据转发,压入标签、弹出标签;
控制层面:通过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 多播
名词注解:
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;
配置:
普通MPLS--1504
MPLS VPN--1508
MPLS TE-1512
r1(config)#interface s1/1
r1(config-if)#mtu ?
<64-17940> MTU size in bytes 修改接口MTU值
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 立即生效
当邻居关系建立后,邻居间会将基于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 就可以