文章目录

  • 原始包交换
  • 标签交换
  • 包交换的优化
  • MPLS
  • 简介
  • 标签报文格式
  • 名词解释
  • LDP:标签分发协议
  • LDP会话
  • 本地LDP会话建立
  • 标签分发方式
  • 标签传递方式
  • MPLS工作过程
  • 控制层面
  • 数据层面
  • 次末跳(PHP)
  • LDP动态搭建LSP
  • MPLS解决BGP的路由黑洞
  • 静态手工搭建LSP


原始包交换

  • 包交换实际指定的是路由传递的过程,包指的是三层PDU:数据包。在路由传递的过程中,由于MAC地址只能在一个网段内表示某一主机,所以在传递过程中,源目MAC是不断变换的,而数据包的内容是一般不会被修改的,如下图中所描述的包交换的过程。
  • 在包交换中当流量来到路由器上,需要查看两张表,路由表和ARP表,在过去,计算机硬件性能很差的时候,查看两张表就是非常浪费时间的事,而且路由表遵循递归查找的原则,一条路由可能需要反复递归查找多次才能找到出接口,所以为了提高转发效率,有人就提出了标签交换。

标签交换

  • 本地为路由条目添加一个数字标签,并创建一张表,记录标签所对应的出接口及二层封装,在传递路由时,在二层和三层之间打入这个数字标签,携带标签的数据的来到设备上,将先看到的是二层与三层之间的标签,然后依据本地记录标签的表进行转发。
  • MPLS为什么叠加标签 mpls标签0_网络

  • 因为标签本身短小且定长,所以在转发的效率高于原始包交换,但由与在标签交换的开头需要压入标签,末尾需要弹出标签,整体对包交换效率的提升并不明显,所以随着包交换的优化,标签交换更多的是用于其他方面,解决一些包交换无法解决的问题。

包交换的优化

  • 原始包交换:每个数据包来到设备都需要去基于目标IP查看路由表及ARP缓存表来进行转发。
  • 快速交换:也叫基于数据流的交换。在通信时,由于MTU的限制,一个数据包最大只有1500字节,所以在一次通信中,必定有很多个数据包,这些数据包称为数据流。而快速交换的原理就是转发在数据流的第一个数据包时查看路由表和ARP表,然后会将查看的结果缓存下来,后续的数据包就可依据缓存直接转发,就不需查看路由表和ARP表,一次路由,多次交换
  • 特快交换:最早是由思科提出的CEF技术,其他各个厂家也依据CEF的原理开发出了自己的技术。原理是将路由表中的递归结果和ARP表合成一张表:FIB表,里面记录着某条路由的出接口、下一跳及二层封装。并且FIB表是二进制储存,硬件可直接读取,大大提高了交换的速度,由于特快交换不需要查看路由表,也被称为无需路由,直接交换

MPLS

简介

MPLS(Multi-Protocol Label Switching),多协议标签交换,可以基于多种不同的3层协议来生成2.5层的标签信息。数据包在进入到的MPLS的域内后,将在第2层和3层中间压入标签号;使得域内的路由器在转发该数据包时,基于2.5层的标签号仅需要查询本地的标签转发信息数据库,最初在包交换仅支持原始交换时,标签的意义在于更快的查询;但随着包交换的加速,使用标签交换失去了快速查表的优势,所以如今的MPLS更多的是应用于:1.解决BGP的路由黑洞;2.MPLS VPN;3.MPLS TE(流量工程)。

标签报文格式

MPLS为什么叠加标签 mpls标签0_网络_02

标签主要字段:
LABEL:20位,取值范围为0 - 2的20次方。我们把标签的取值范围称为标签空间,每台设备的标签空间是独立的。在标签空间中,0 - 15为特殊标签值,我们在分配时一般不用这些标签,因为他们具有特殊含义;16 - 1023一般用于静态LSP搭建使用;023 - 2的20次方为LDP等可以动态分配标签的协议使用的标签号的范围
EXP:占3位,主要做策略用的。一般情况下为 000 ,可以理解为优先级,数值越大,优先级越高,可以优先转发。
S:占1位,事实上,我们不止能压入一个标签,该位用来标识该标签为是否是最后一个标签,该位为1则代表是最后一个标签,为0,则代表还有后续标签需要处理。
TTL:在压入标签的时候,会将IP报文中的TTL值复制到标签中,没经过一台路由其转发就将其减1,最后弹出的时候在将标签的TTL值替换掉IP报文的TTL值,这样在无需三层报文依然可以起到防环的作用。

名词解释

MPLS为什么叠加标签 mpls标签0_MPLS为什么叠加标签_03

  • MPLS域:所有运行MPLS设备组成的网络,我们可以称为是一个MPLS域
  • LSR:域中所有运行MPLS的设备都可以被称为LSR(标签交换路由器)。
  • FEC:等价转发类,简单理解就是目标网段相同的数据报文,一个FEC分配一个标签。
  • LIB表:标签信息表,每台路由器基于自己路由表中的路由条目生成标签存放在LIB表中,每个设备生成的标签是独立的。
  • LFIB表:标签信息转发表,是LIB表和FIB表结合的产物,随着包交换的加速,使得今天的MPLS技术也开始基于FIB表工作;来提高MPLS的工作效率,该表主要记录的就是标签编号和出接口及下一跳的对应关系。
  • LSP:标签交换路径,如上图中1.1.1.0/24网络访问2.2.2.0/24网段,R1-R2-R3-R4就是一个LSP,LSP是分方向的,如果需要实现数据的双向互通,则必须搭建两个方向的LSP才行。
  • Ingress LSR:入站LSR,上图中R1为进入MPLS域中的数据压入标签,所以,R1被我们称为入站LSR。
  • egress LSR:出站LSR,上图中R4为MPLS的边界,在数据离开MPLS域将标签弹出数据,所以,R2被称为出站LSR。
  • transit LSR:中转LSR,除了入站和出站LSR,其他LSR都是中转LSR。
  • PE:边界LSR,工作mpls域的边缘,连接域外设备,上图中的R1和R4。
  • P:标签交换路由器,在MPLS域内工作的LSR,上图中的R2和R3。

LDP:标签分发协议

  • MPLS中我们可以手工添加标签配置静态LSP,但由于静态LSP配置量大且当拓扑结构发生变化时,网络管理员需要手工修改,所以一般不适用静态配置,更多的时侯使用的是动态标签分发协议。
  • 动态标签分发协议主要有TDP和LDP,但由于TDP是思科私有协议,而LDP是公有协议,所以华为设备使用的是LDP。
  • LDP用于MPLS的控制层面,有分配标签传递标签的功能,LDP在生成标签和传递标签之前,需要先与邻居建立LDP会话。成功建立会话后,将该标签传递给邻居,本地会将自己生成的标签和邻居生成的标签都存放在LIB表中,再依据FIB表的最佳路径将自己生成的标签和有效的标签存放到LFIB表里。

LDP会话

  • LSR间交换标签的前提是LSR必须是LDP对等体关系,而建立对等体关系的前提是R3和R4之间必须建立LDP会话。LDP会话分两种:本地LDP会话、远程LDP会话。
  • 由于LDP会话是基于TCP建立的,可以通过手工指定的方式去远程建立LDP会话,非直连建邻。
  • LDP在进行本地LDP会话建立时,不需要手工指定,本地会周期性的发送组播hello包进行发现邻居。
本地LDP会话建立
  • 在接口激活LDP协议后,LSR的接口将开始周期发送hello报来发现LDP邻居。

Hello包采用UDP的646号端口进行通讯。源和目标都是646。Hello包中将携带自己的LDP ID传输地址等。
传输地址:默认使用的是–我们配置的LSR-ID。这个传输地址在后续将作为TCP会话建立的通讯地址,所以,在配置LSR-ID时,一定要保证该地址可用,且IGP要保证彼此地址间可达。
LDP ID:要求,所有激活LDP协议的设备都需要具有一个LDP ID。由48位二进制构成。一般构成方式LSR-ID:0,前32位为LSR ID,后16位位标签空间。

MPLS为什么叠加标签 mpls标签0_包交换_04

  • 双方收到彼此交互的hello包之后,获取到对方的传输地址,之后,基于传输地址,去建立TCP会话。为了避免重复建立TCP会话,LDP会选择传输地址大的一方作为主动方,主动发起TCP会话连接请求。
  • 完成TCP会话建立之后,传输地址更大的一方将优先发送初始化报文,中将携带LDP相关的参数,对端收到后,将对这些参数进行检查,如果认可,则将发送自己的初始话报文,同时还会发送一个keeplive报文,代表确认收到的参数。对端收到初始化报文后,如果认可其中的参数,则也将反馈一个keeplive报文作为确认。双方都收到对端的keeplive报文后,则将代表LDP会话建立完成。

标签分发方式

  • 有序方式:只有自己是某个FEC的出站LSR时才会主动为该路由条目分配标签,为其他FEC分配标签时需先收到邻居通告的与该FEC对应的标签,然后检查自己路由表中是否存在到达这个FEC的路由,以及下一跳和通告者是否相同,检查通过后才会为这个FEC分配标签。华为设备默认采用的是有序分配方式。
  • 独立方式:设备可以自己自主对FEC分配标签而不需要等待其他设备的通告。

标签传递方式

  • 依据数据层面的流量方向,如下图,R1是R2的上游,R3是R2的下游。
  • DU模式:下游自主模式,下游设备主动向其他设备发送标签,华为设备默认使用DU模式。
  • DoD模式:下游按需模式,下游设备只有在收到上游设备发送的请求报文之后,才会发送标签。

MPLS工作过程

控制层面

  • 在没有MPLS时控制层面仅生成RIB(路由表)和FIB(转发信息数据库);FIB是基于RIB生成;
  • MPLS协议会启动TDP(cisco私有)或LDP(公有),直连设备间将建立对等体关系;
  • MPLS在建立邻居关系后,生成邻居表;LDP协议再基于本地FIB表中学习到的路由条目生成标签号;cisco设备默认基于FIB表中所有学习到的路由条目生成标签号华为设备默认仅基于FIB表中32位掩码的主机路由生成标签号

华为设备默认仅基于FIB表中32位掩码的主机路由生成标签号的原因在于正常32位主机路由为ospf学习的环回接口,正常工程中只有BGP和MPLS VPN才会基于环回通讯,使用标签转发;其他普通流量还是基于特快包交换来进行;反观cisco在启动mpls以后,所有流量将基于标签转发,降低了转发效率(前提为默认)

  • 标签号生成后,将存储于本地的LIB表(标签信息数据库);LIB表将在邻居间共享;LIB表中装载本地及邻居为每条路由分发的标签号;
  • 运行MPLS协议的设备,将LIB和FIB进行结合,将标签号和最佳路径的关系映射生成LFIB表(标签转发信息数据库)。

数据层面

  • 当流量进入到第一台pe设备时, 在没有特快交换之前,路由器基于目标IP地址查询本地的RIB;之后还要在LIB表中对应才能确定流量是否应该压入标签,需要两张表的查询;
  • 在存在特快交换时,流量进入第一pe时,直接查询FIB表,表中关联标签号,将直接确定是否压入标签;
  • 流量再到P路由器,接收到流量中若存在标签基于LFIB表转发,若没有标签基于FIB表即可;
  • 流量从最后一台边界离开MPLS 域时将弹出标签;

次末跳(PHP)

  • 边界LSR将本地的直连网段传递给MPLS域内邻居后,LDP分配特殊标签号为3,告知倒数第二跳设备该网段是我的直连网段;
  • 倒数第二跳设备在查询LFIB表时,发现该FEC的标签号为3,于是倒数第二条设备会提前弹出标签,使得最后一跳路由器均只需要查询FIB表; 否则最后一跳路由器在查询LFIB表后,弹出标签还需要查询FIB;

LDP动态搭建LSP

[r1]mpls lsr-id 1.1.1.1 # 必须先定义mpls的router-id,要为本地设备的真实ip地址,且邻居可达
[r1]mpls # 全局激活mpls
[r1-mpls]q
[r1]mpls ldp # 全局激活ldp协议
[r1-mpls-ldp]q
[r1]inter g 0/0/0 # 在所有标签需要经过的接口开启MPLS
[r1-GigabitEthernet0/0/0]mpls # 先开启mpls
[r1-GigabitEthernet0/0/0]mpls ldp # 在激活ldp协议
  • 完成上述配置后,邻居间使用UDP报文组播收发hello包;之后基于hello包中的router-id地址进行TCP会话的建立;
[r1]display tcp status # 查看本设备所有的TCP连接信息
TCPCB    Tid/Soid Local Add:port        Foreign Add:port      VPNID  State
b4b2ec00 167/6    1.1.1.1:646           2.2.2.2:51148         0      Established
  • 当tcp会话建立后,邻居间基于TCP会话会互发初始报文和keeplive包建立邻居关系,生成邻居表:
[r1]display mpls ldp peer # 查看LDP邻居表
 
 LDP Peer Information in Public network
 A '*' before a peer means the peer is being deleted.
 ------------------------------------------------------------------------------
 PeerID                 TransportAddress   DiscoverySource
 ------------------------------------------------------------------------------
 2.2.2.2:0              2.2.2.2            GigabitEthernet0/0/0
 ------------------------------------------------------------------------------
 TOTAL: 1 Peer(s) Found.
  • 建立邻居后基于本地的FIB表生成标签号(默认华为仅针对32位的主机路由生成标签号),将生成的存储于LIB表中,之后邻居间共享LIB表;
[r1]display fib # 查看FIB表
Route Flags: G - Gateway Route, H - Host Route,    U - Up Route
             S - Static Route,  D - Dynamic Route, B - Black Hole Route
             L - Vlink Route
--------------------------------------------------------------------------------
 FIB Table:
 Total number of Routes : 11 
 
Destination/Mask   Nexthop         Flag  TimeStamp     Interface      TunnelID
12.1.1.255/32      127.0.0.1       HU    t[350]        InLoop0        0x0
12.1.1.1/32        127.0.0.1       HU    t[350]        InLoop0        0x0
1.1.1.255/32       127.0.0.1       HU    t[39]         InLoop0        0x0
1.1.1.1/32         127.0.0.1       HU    t[39]         InLoop0        0x0
255.255.255.255/32 127.0.0.1       HU    t[4]          InLoop0        0x0
127.255.255.255/32 127.0.0.1       HU    t[4]          InLoop0        0x0
127.0.0.1/32       127.0.0.1       HU    t[4]          InLoop0        0x0
127.0.0.0/8        127.0.0.1       U     t[4]          InLoop0        0x0
1.1.1.0/24         1.1.1.1         U     t[39]         Loop0          0x0
12.1.1.0/24        12.1.1.1        U     t[350]        GE0/0/0        0x0
2.2.2.0/24         12.1.1.2        GSU   t[476]        GE0/0/0        0x0
  • 查看LIB表,装载本地和邻居为各条路由分配的标签号,华为默认仅针对32位主机路由分配标签。
[r1]display mpls ldp lsp
 
 LDP LSP Information
 -------------------------------------------------------------------------------
 DestAddress/Mask   In/OutLabel    UpstreamPeer    NextHop         OutInterface
 -------------------------------------------------------------------------------

 1.1.1.1/32         3/NULL         2.2.2.2         127.0.0.1       InLoop0
*2.2.2.2/32         Liberal/3                      DS/2.2.2.2
 -------------------------------------------------------------------------------
 TOTAL: 1 Normal LSP(s) Found.
 TOTAL: 1 Liberal LSP(s) Found.
 TOTAL: 0 Frr LSP(s) Found.
 A '*' before an LSP means the LSP is not established
 A '*' before a Label means the USCB or DSCB is stale
 A '*' before a UpstreamPeer means the session is stale
 A '*' before a DS means the session is stale
 A '*' before a NextHop means the LSP is FRR LSP
  • 为了防止路由条目过多时导致LSP数量太大,造成设备负担,华为默认只给32位主机路由分配标签。
[r1]mpls 
[r1-mpls]lsp-trigger all # 执行该命令后,会给路由表中所有的路由条目分配标签

MPLS解决BGP的路由黑洞

  • 下图中虽然所有运行BGP的设备具有了所有AS的路由信息,但当访问AS外的流量来到没运行BGP的设备上时,由于没运行BGP的设备不具备AS外的路由信息导致丢弃流量,造成了路由黑洞。
  • MPLS为什么叠加标签 mpls标签0_包交换_05

  • 解决办法,在AS34567运行MPLS,当R7想访问R1时,它需要将流量交由R3转发,所以R7会在该流量打上一个标签,R4收到该流量会依据标签将流量转发到R3上,在这个过程中,R4不会看到流量的三层封装,只需根据标签转发就行。
  • MPLS协议并不会为通过BGP协议学习的路由条目分配标签号;而是在访问这些BGP路由目标网段时,在流量中压入到达这些网段的BGP下一跳设备地址的标签号;来穿越中间没有运行BGP协议的设备;实现打破路由黑洞;华为设备默认不为BGP协议执行下一跳标签机制,cisco默认执行。
[r1]route recursive-lookup tunnel # 在递归查找时,如果有隧道则递归到隧道中

静态手工搭建LSP

  • 这里我用如下的拓扑演示如何静态手工搭建LSP,使1.1.1.1可访问2.2.2.2。
  • 由于不同LSR的作用略由不同,所以不同LSR的静态配置也有不同。在入站LSR需要压入标签,所以配置该LSP的目标网段、需要压入的标签号及下一跳。
# 定义设备的LSR-ID
[r1]mpls lsr-id 1.1.1.1
# 激活MPLS
[r1]mpls # 首先在全局激活mpls
[r1]inter g 0/0/0  # 然后再接口激活,所有属于MPLS域的接口都需要激活
[r1-GigabitEthernet0/0/0]mpls
# 入站LSR配置
[r1]static-lsp ingress 1to3 destination 3.3.3.0 24 nexthop 12.1.1.2 out-label 100
# static-lsp 角色 lsp的名字 destination 目标网段 nexthop 下一跳IP out-label 出接口携带的标签
# 查看生成的LSP
[r1]display mpls static-lsp
TOTAL          :	1       STATIC LSP(S)
UP             :	0       STATIC LSP(S)
DOWN           :	1       STATIC LSP(S)                        
Name                FEC                I/O Label    I/O If               Status
1to3                3.3.3.0/24         NULL/100     -/GE0/0/0            Down 
#LSP的名字           转发等价类         出入携带标签   出入接口            该LSP是否在使用

注意:LSR-ID类似于RID,也是由32位二进制构成,按照IP地址的格式进行配置,但是,只能手动配置。一般我们习惯使用设备的环回接口的IP地址作为LSR-ID
手工配置LSP时,下一跳必须和路由表中到达目标网段的下一跳相同,如果不同或路由表中没有到达目标网段的条目则无法使用该LSP,如我上面查看的LSPstatus为Down,所以我们还需要生成路由,这里我使用静态路由。

[r1]ip route-static 3.3.3.0 24 12.1.1.2
[r1]display mpls static-lsp
TOTAL          :	1       STATIC LSP(S)
UP             :	1       STATIC LSP(S)
DOWN           :	0       STATIC LSP(S)
Name                FEC                I/O Label    I/O If                Status
1to3                3.3.3.0/24         NULL/100     -/GE0/0/0             Up
  • 中转LSR只需要依据标签进行转发,当中转LSR收到携带相应标签的数据包,它会依据这个标签进行重写标签然后转发。
# 激活MPLS
[r2]mpls lsr-id 2.2.2.2
[r2]mpls
Info: Mpls starting, please wait... OK!
[r2-mpls]inter g 0/0/0
[r2-GigabitEthernet0/0/0]mpls
[r2-GigabitEthernet0/0/0]inter g 0/0/1
[r2-GigabitEthernet0/0/1]mpls
[r2-GigabitEthernet0/0/1]q
# 入站LSR配置
[r2]static-lsp transit 1to3 incoming-interface GigabitEthernet 0/0/0 in-label 100 nexthop 23.1.1.2 outgoing-interface g 0/0/1 out-label 200
# static-lsp 角色 LSP名 incoming-interface 入接口 in-label 入标签 nexthop 下一跳 outgoing-interface 出接口 out-label 出标签
# 查看生成的LSP
[r2]display mpls static-lsp
TOTAL          :	1       STATIC LSP(S)
UP             :	1       STATIC LSP(S)
DOWN           :	0       STATIC LSP(S)
Name                FEC                I/O Label    I/O If                Status
1to3                -/-                100/200      GE0/0/0/GE0/0/1       Up

注意:数据进入时识别的标签,需要和前面的出站标签一致,中转LSR的下一跳不需要再路由表中存在。

  • 入站LSR收到带相应标签的数据,只需将标签弹出,然后将数据交给相应的直连网段就行。
# 开启MPLS
[r3]mpls lsr-id 3.3.3.3
[r3]mpls
Info: Mpls starting, please wait... OK!
[r3-mpls]inter g 0/0/0
[r3-GigabitEthernet0/0/0]mpls
[r3-GigabitEthernet0/0/0]q
# 出站LSR配置
[r3]static-lsp egress 1to3 incoming-interface GigabitEthernet 0/0/0 in-label 200
# 查看生成的LSP
[r3]display mpls static-lsp
TOTAL          :	1       STATIC LSP(S)
UP             :	1       STATIC LSP(S)
DOWN           :	0       STATIC LSP(S)
Name                FEC                I/O Label    I/O If                Status
1to3                -/-                200/NULL     GE0/0/0/-             Up
  • 做完如上配置后,R1上访问3.3.3.0/24网段的流量就可以转发至R3上,虽然我只在R1上写了一条静态路由,但通信是双向的,由于一条LSP的方向和起始是固定的,虽然数据可以来到R3上,但R3不知到如何到达R1,所以还需配置一条R3到达1.1.1.0/24网段的LSP。
  • 静态搭建需要网络管理员在沿途所有LSR上进行配置,任何环节出错,都可能导致流量转发中断。而且静态LSP无法基于拓扑变化而自动收敛,当拓扑结构发生变化时,网络管理员需要手工修改。因此,静态LSP仅适用于规模较小,并且拓扑稳定的网络。在工程中,静态搭建LSP极少使用,更多的是使用动态协议搭建LSP。