文章目录
- 一、传统的交换技术:
- 1,进程转发
- 2,快速转发
- 3,cef转发
- 二、MPLS简介
- 1、简介:
- 2、一些术语:
- 三、控制层面的标签交互及工作过程
- 四、数据层面的转发
- 五、MPLS的优化
- 六、MPLS解决BGP的路由黑洞
一、传统的交换技术:
1,进程转发
基于数据包的转发方式,即每一个数据包都要被路由器拆解到三层,根据其中的目的IP地址,在路由表中进行与操作和最长匹配(可能还需要递归),找到相应的出接口,这种传统的数据转发方式效率低。
2,快速转发
基于流量(缓存)的转发方式,不同的是,当一个数据流过来时,不需要对每一个数据包进行出接口的查找,当第一个数据包到路由器时,进行与操作与最长匹配找到对应的出接口进行转发,并且会根据第一个数据包的源IP地址,目的IP地址,协议号,源端口,目标端口,进行hash运算,得到一串md5,对应一个出接口,当后边的数据包过来时,只需要对其中的5个项目进行hash运算得到md5,并和路由器数据库的md5进行比对,若相等,则直接通过该md5对应的出接口进行转发。
3,cef转发
Cisco Express Forwarding–思科快速转发 CEF简化了查询的步骤,提高了单位时间的工作效率。而且从整体上来看,路由信息和转发信息是分离的,数据包的转发只根据转发信息而不用参照路由信息,可以充分利用专用硬件的功能来达到线速转发,而不受路由变化或者其他因素的干扰,保证了转发的高速高效。
CEF利用转发数据库(FIB-Forward Information dataBase)来进行基于IP目的地前缀的交换决策。FIB是根据路由表生成的,FIB条目和路由表条目之间有一一对应的关系,当网络中路由或拓扑结构发生了变化时,IP路由表就被更新,而这些变化也将反映在FIB中。
简单来说,进程转发是每一个数据包都要被路由,快速转发是每一种流量的第一个数据包需要路由一次,而cef转发是所有的数据包全都无需路由。
二、MPLS简介
1、简介:
MPLS:Multi-Protocol Label Switching,多协议标签交换
是基于2.5层的标签号进行数据转发,并且无论网络层运行何种协议,2.5均可运行标签交换;
当下的主要应用:
1)解决BGP的路由黑洞问题
2)MPLS VPN
3)MPLS TE(流量工程)
2、一些术语:
TDP
:cisco私有,hello包基于UDP传输,标签信息基于TCP传输,使用端口号711,广播发送,255.255.255.255LDP
:工业标准,hello包基于UDP传输,标签信息基于TCP传输,使用端口号646,组播发送,224.0.0.2(所有支持组播的路由器均支持 )FEC
:转发等价类,具有相同的处理方式的一类数据称为一个转发等价,比如按照一个路由条目对应一个标签。LSR
:(P路由器)标签交换路由器E-LSR
:(PE路由器)边界标签交换路由器,标签压入(impose)和弹出(pop)LSP
:标签交换路径FIB
:转发信息库,根据路由表生成LIB
:标签信息库,本地和邻居为每一条路由分发标签号LFIB
:标签转发信息库,将FIB表和LIB进行结合
三、控制层面的标签交互及工作过程
控制层面的工作过程:
1,通过IGP或EGP交互路由条目,生成路由表;
2,CEF基于路由表生成FIB表;
3,MPLS使用TDP/LDP为FIB表中的每一条信息(本地所有的路由条目)生成一个标签号,然后告知所有邻居,同时从邻居学习到为每条信息分发的标签号,生成LIB表
4,结合FIB和LIB生成LFIB表,标签号的最佳路径对应。
注意:mpls不给直连路由和bgp路由贴标签
四、数据层面的转发
普通的数据包将基于FIB表转发;若数据包中存在标签号基于LFIB进行转发;标签的压入和弹出也是在数据层面完成的;
MPLS的数据封装于2层和3层间,故称为2.5层
MPLS的数据包格式
前20位为标签号:存在2^20个号码,其中0-15号保留,故分配标签从16号开始;
21-23位为8个优先级,用于QOS;
24位为栈底位----为1标示本信息为最后一层标签信息;最多可以存在3层标签;
25-32位TTL----当标签号被压入时,将复制3层报头的TTL值,然后每经过一个路由器减1,当标签号弹出时,复制回IP报头中;
一层标签为普通MPLS,主要用于解决BGP的路由黑洞;
二层标签为MPLS VPN使用;
三层标签为MPLS TE使用;
数据层面的工作过程:
第一跳路由器负责标签的压入,中间路由器基于标签号转发流量,进行标签号的替换,最后一跳路由器负责标签的弹出;
注:入标签号为本地分配的标号,出标签为下一跳路由器分配的标签号(通过LDP/TDP协议学习);
五、MPLS的优化
次末跳弹出(PHP):
最后一跳路由器在默认情况下需要查看LFIB表后再查看FIB表,然后转发数据;最后一跳路由器,将本地**直连路由传递给邻居时使用标号3(空标签)**来告知对方为倒数第二跳;PHP可以使倒数第二跳在已知出接口、下一跳等信息时便将标签号弹出,然后基于出接口转发流量;导致最后一跳路由器仅查看FIB表;
六、MPLS解决BGP的路由黑洞
sho ip cef
//查看cef表
sho ip cef detail
//查看FIB表
sho mpls ldp bindings
//查看LIB表
sho mpls forwarding-table
//查看LFIB表
R1属于AS1,R2、R3、R4属于AS234,R5属于AS5,R2和R4运行BGP且互为邻居,R1,R5各自宣告自己的环回。
查看R1的路由表
R1#sho ip bgp
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 0.0.0.0 0 32768 i
*> 5.5.5.0/24 12.1.1.2 0 234 5 i
我们知道,在这个拓扑图中存在BGP的路由黑洞,R3没有达到R1和R5环回的路由。
下面使用MPLS来解决这个问题。
在接口上开启MPLS
R2(config)#mpls label range 200 299 //便于观察,我们定义了标签的范围
R2(config)#int s1/1
R2(config-if)#mpls ip
R3(config)#mpls label range 300 399
R3(config)#int s1/0
R3(config-if)#mpls ip
R3(config-if)#int s1/1
R3(config-if)#mpls ip
R4(config)#mpls label range 400 499
R4(config)#int s1/0
R4(config-if)#mpls ip
此时在R1时pingR5的环回
R1#ping 5.5.5.5 source 1.1.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 5.5.5.5, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 76/84/88 ms
首先,我们在R2、R3、R4的接口上开启了mpls
邻居间使用hello包建立邻居关系,生成邻居表,查看R2的mpls邻居表
R2#sho mpls ldp neighbor
Peer LDP Ident: 3.3.3.3:0; Local LDP Ident 2.2.2.2:0 //邻居rid是3.3.3.3,本地是2.2.2.2
TCP connection: 3.3.3.3.57183 - 2.2.2.2.646 //R3主动和R2建立tpc链接
State: Oper; Msgs sent/rcvd: 11/11; Downstream
Up time: 00:02:04
LDP discovery sources:
Serial1/1, Src IP addr: 23.1.1.2 //通过s1/1口,对方ip为23.1.1.2
Addresses bound to peer LDP Ident:
3.3.3.3 23.1.1.2 34.1.1.1
存在RID,并且选举规则和ospf一致,RID同时作为了建立TCP会话的源目ip地址;若存在环回,那么默认使用环回作为RID,此时就必须将环回宣告到路由协议中–必须可达;
我们来看看数据是如何转发的
1,R1数据包要去5.5.5.5时,查看bgp路由表,将数据交给R2
2,R2数据要去5.5.5.5时,查看bgp路由表下一跳为4.4.4.4,但是mpls是不给bgp路由分配标签的,而是压入到达下一跳(BGP路由的下一跳)地址的标签号,故R2给数据包压入给4.4.4.0/24分配的标签
3,数据达到R3后,R3将标签撕掉,次末跳弹出标签(因为4.4.4.4是R4的环回),直接转发给R4
4,R4查看bgp路由表将数据转发给R5
所以过程是这样的
1,R1的IP数据包要去5.5.5.5时,查看bgp路由表,将IP数据包交给R2
R1#sho ip bgp
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 0.0.0.0 0 32768 i
*> 5.5.5.0/24 12.1.1.2 0 234 5 i
2,R2的IP数据包要去5.5.5.5时,查看bgp路由表下一跳为4.4.4.4,但是mpls是不给bgp路由分配标签的,而是压入到达下一跳(BGP路由的下一跳)地址的标签号,故R2给数据包压入R3给4.4.4.0/24分配的标签301,变成mpls数据包
R2#sho ip bgp
Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.0/24 12.1.1.1 0 0 1 i
*>i5.5.5.0/24 4.4.4.4 0 100 0 5 i
R2#sho ip cef 4.4.4.0
4.4.4.0/24
nexthop 23.1.1.2 Serial1/1 label 301
R2#sho ip cef 5.5.5.0
5.5.5.0/24
nexthop 23.1.1.2 Serial1/1 label 301
3,mpls数据包达到R3后,R3将标签301撕掉,次末跳弹出标签(因为4.4.4.4是R4的环回,R4不给4.4.4.0分配标签,R3学习到4.4.4.0/24是空标签),变成IP数据包直接转发给R4
R3#sho mpls forwarding-table
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or VC or Tunnel Id Switched interface
300 Pop Label 2.2.2.0/24 10674 Se1/0 point2point
301 Pop Label 4.4.4.0/24 9401 Se1/1 point2point
4,R4查看bgp路由表将IP数据包转发给R5
R4#sho ip bgp
Network Next Hop Metric LocPrf Weight Path
*>i1.1.1.0/24 2.2.2.2 0 100 0 1 i
*> 5.5.5.0/24 45.1.1.2 0 0 5 i
这里需要注意的是:FIB表也可以存储标签。减小了PE路由器的压力(只需查看一次FIB表)
R2是直接查看FIB表,将301标签压入
R4是直接查看FIB表(次末跳弹出),将数据转发给R5
即第一跳路由器只看FIB表压入标签,中间的转发路由器要看LFIB表转发数据,最后一条路由器看FIB表转发数据