文章目录

  • 一、传统的交换技术:
  • 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.255
LDP:工业标准,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封装头大小_路由表


MPLS的数据包格式

mpls封装头大小_R3_02


前20位为标签号:存在2^20个号码,其中0-15号保留,故分配标签从16号开始;

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

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

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

mpls封装头大小_数据_03


一层标签为普通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表

mpls封装头大小_路由表_04


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表转发数据