Segment Routing技术⑵-IGP对SR的支持

2021-09-28 14:21:14 阅读量:



序言:
SR的转发平面有两种,一种是MPLS转发平面,一种是IPv6的转发平面。如果是MPLS的转发平面,那么首先必须分发标签。
 
因为SR是源路由技术,那么需要在源节点将数据经过的节点的标签给压上。标签可以由IGP和BGP来进行分发,这一章我们主要叙述OSPF和ISIS协议怎么给路由分发标签。
 

OSPF的扩展
 
我们知道,OSPF通过LSA来携带路由信息,因为OSPF的设计是基于字段的。那么如果要支持标签的分配和分发需要新增LSA-OpaqueLSA,称为10类LSA,OpaqueLSA中又细分了Type4和Type7以及Type8。
 
OpaqueLSA是基于TLV设计的,所以扩展性比较好。Type4是OSPF中Router Information Opaque LSA增加了TLV8(SR-Algorithm)和TLV9(SID/Label range TLV)。
 
Type7是OSPF Extended Prefix Opaque LSA里面包含OSPF Extended Prefix TLV(1)(路由)以及Prefix SID Sub-TLV(2)(标签)。Type8是OSPF Extended Link Opaque LSA包含了Extended Link TLV1和Adj-SID Sub-TLV(2)以及 LAN Adj-SID Sub-TLV(3)。
 
OSPF支持SR-MPLS
 

(1)本节重点:

①Type4 Router Information Opaque LSA
      TLV8:SR Algorithm
      TLV9:SID/Label Range TLV
②Type7 Extended Prefix Opaque LSA
      TLV1:Extended Prefix TLV
        Sub TLV2:Prefix SID Sub-TLV(2)
③Type8 Extended Link Opaque LSA       
       TLV1:Extended Link Tlv(1)
         Adj-SID Sub-TLV(2)
         LAN Adj-SID Sub-tlv(3)
④Multi-Area
不难发现LSA10中的几个种类都是基于TLV设计,更好扩展。
 
(2)Router Information LSA
该LSA是描述该路由器具备什么能力,在OpaqueLSA的Type4中包含一个或多个SID的范围,SID(标签)的长度是24位,即104万,即SRGB以及SR算法TLV。华为设备命令行查看:
 

 \
 
SR算法TLV包含使用在节点中的一系列算法标识符(8比特),如果为0表示使用标准的SPF算法。除了算法还包含SRGB,上面的SID的范围是16000-23999。建议所有设备的SRGB相同。传递SRGB的目的是为了相邻节点计算Out标签使用。
 
(3)PrefixSID

①拓扑:三台设备运行OSPF,并且在一个区域0。拓扑如图:

 \ 
 \ 
 
Segment在MPLS中就是标签,上面我们讲过标签分为全局标签和本地标签。
 
一般来说SRGB(Segment Routing Global Block)在每台设备上建议配置相同。
 

②设备命令行查看Opaque-LSA的Type7显示:

 
\ 
 
以前的控制平面,路由协议只能发布路由信息,标签的分发需要使用其它的协议,例如:LDP协议和RSVP协议来完成。现在发布路由信息和分发标签全部使用OSPF来完成。
 
Opaque LSA一共有三种:Link 和Area和Domain,每一种传递的范围不一样。

③Wireshark抓包分析显示:

 
\ 
Prefix-SID在一个SR域内正常情况下是不一样的,通过SRGB范围内的一个标签来分配。一般为Loopback地址的32/128主机路由分配标签。一般情况下PrefixSID就是NodeSID(主要看上面地址前缀中的Node是否置位)。
 
代表网络中的某个节点,类似OSPF协议的RID。便于控制数据包的走向。为什么是环回口代表一个节点,而不是物理链路代表一个节点呢?
 
因为环回口你必须到达该环回口的发布节点才能到环回口,而物理链路却不一样,可能通过多个节点都可以到达该链路。例如:
 
\ 
 
R3要到达R1的环回口必须经过R1才行,那么使用环回口就可以表示一个节点,换句话说为环回口分配标签就是为节点分配标签。但是不建议使用互联网段来表示节点, 因为通过网段来描述节点会带来描述节点的误差,而环回口却不会。
 

④Prefix-SID字段分析

OSPFv2 Extended Prefix Opaque LSA(Opaque Type 7)
1.OSPFv2 Extended Prefix TLV(1)
FLAG:A N_ _ _ _ _ _
A:Attach,由ABR为宣告进其它区域的直连前缀设置,默认是0。
N:Node,如果前缀代表的是节点,即PrefixSID为Node-SID,默认是1。
 
2.Prefix SID Sub-TLV(2)
FLAG:_NP M E V L_ _  
NP:No-PHP,如果需要倒数第二跳不弹出Prefix-SID,则置位。默认置0,置1即需要倒数第二跳弹出。
M:如果SID是映射服务器通告的那么置位,默认置0
E:Explicit-Null,如果倒数第二跳必须将PrefixSID交换为Explicit-Null标签那么置位。
V:Value,如果PrefixSID携带的是Value而不是Index则置位,对于PrefixSID默认就是0。
L:Local,如果PrefixSID是本地有意义的则置位。
例如:
 
\ 
 
在R3上发布两个环回口路由,Loopback0发布到区域0,PrefixSID为3,Loop back1发布到区域1,PrefixSID为33。在区域0中的设备通过命令查看响应的环回口分配的PrefixSID。
 

\ 

(4)Adjacency-SID

其实就是用标签描述IGP的邻居,Local-Segment,只有在本地具有意义,本地标签从动态标签池中分配,不同节点可以重叠。自动会为每个邻接分配Adj-Segment。每个邻接会分配一个受保护和一个不受保护的Adjacency-SID,保护的和TILFA相关。例如:
 
\ 
 
R2如果负载分担有3条等价路径(如图),那么通过哪条连路传递和Hash有关系,那么就存在数据传递的不确定性。如果希望走特定路径,那么可以通过PrefixSID,例如标签16002送到R2,然后R2通过Adjacency-SID40082送给R3。
 
\ 
 
上图如果R2到达R6不是负载分担,R2和R4的开销最大,直接压R6的Prefix SID16006的标签,那么会从IGP的最短路径将数据传递到R6,IGP最短路径可能产生了拥塞,那么也可以通过Adjacency-SID 40083的空闲链路送到R4。
 

①拓扑:

 \
 
 
在MA链路中,ADJ的SID描述的是邻居的信息,包括2Way状态的邻居。

②设备命令行查看Opaque-LSA的Type8显示:

 
\ 
 
在NE1上查看NE3的LSDB,发现连着1.1.1.1的LAN Adjacency的SID是48080。连着2.2.2.2设备的LAN Adjacency SID是48081,该标签只能到NE3设备上才能加载到LFIB表,也就是说本地有意义。如果该节点是DR,那么使用LAN Adjacency-SID描述邻居关系。
 
\ 
 
如果是非DR连接DR的那么使用AdjacencySID,连接的是非DR使用LAN-AdjacencySID。
 

③Wireshark抓包分析显示:

 
\ 
 
抓取NE1发出的Opaque LSA10的Type8如果连着DR那么使用Adjacency SID,如果连着非DR的话,那么使用LAN Adjacency-SID。上图中是LAN Adjacency-SID说明是连接着非DR设备。
 

④ADJ-SID字段分析

 
\ 
 
B:backup 如果Adj-SID是受保护的邻接置位,用于TILFA。
 
\ 
 
R2和R3的链路有一个受保护和一个不收保护的ADJ-SID,那么R2是有一个备份路径的,是从R4走的,如果有一种应用需要被保护,那么压得标签是48001,那么R2和R3的链路断了,那么直接走备份路径,R2-R4-R3。而不等收敛。
 
V:Value 如果Adj-SID是标签值而不是索引值,那么置位。
L:Local如果Adj-SID是本地标签则置位。
S:Set如果指的是一组邻居那么置位。
 

(5)OSPF的多区域

 \
 
我们知道OSPF是一个多区域的路由协议,刚刚我们学习的Prefix-SID是可以在区域间传播的,而Adjacency-SID是不能在区域间传播的,假如Adjacency-SID能传递过去其实也是没有意义的?Why?
 
因为Adjacency-SID是本地才能关联的标签,不同区域的设备根本无法知道它的拓扑。ABR再传递Prefix-SID的时候,那么ABR会对该PrefixSID对应的Flag发生了少许的变化。FLAG:_NP M E V L_ _
 
如果是ABR直连的PrefixSID时候,按照本设备的配置,如果NP为0那么弹出标签,E为0(因为要弹出标签所以为隐含空),如果NP必须为1,那么E也为1;如果ABR传递非本地产生的Prefix-SID时,那么不能使用倒数第二跳弹出的效果,不然可能产生路由黑洞。
 
那么这里NP(No PHP)等于1,E(Explicit Null)等于0(因为不是本地直连的前缀,所以不能使用Implicit-null或者Explicit-null)。
 
OSPFv3可以对Segment Routing的支持。我们知道OSPF通过LSA来到达对LSA的支持。这时候我们应该知道OSPFv3 LS-Type变长带来的好处,也知道U位置1带来的对未知LSA处理的优点。原理和OSPFv2类似,限于篇幅在此不对OSPFv3对SR的支持过多赘述。
 
\ 
 
ISIS支持SR-MPLS
 

(1)本节重点:

①ISIS对SR支持的基本概述
②SRGB
③Prefix-SID/Node-SID
 

(2)ISIS对SR支持的基本概述

①ISIS对SR的支持

我们知道ISIS是基于TLV的结构,那么TLV的好处就是扩展性强,ISIS为了支持SR新增加了一些TLV和Sub-TLV,有TLV242 TLV135 TLV236 TLV237 TLV149
TLV22 TLV222等。
 
ISIS和OSPF类似,属于控制平面的协议,给Loopback接口的主机前缀分配Prefix-SID,给ISIS邻居分配Adjacency-SID。ISIS因为是基于TLV的不需要和OSPF一样去增加LSP。OSPF是迫不得已,因为是基于字段设计,固定的字段让它扩展性变的不是那么好。而ISIS增加TLV即可达到对SR的支持。
 

②ISIS增加的TLV

1.TLV242-Router Capability
Router Capability TLV里面包含SRGB和SPF算法以及RID和Flags以及可选的Sub-TLVs。Flag包含 Reserved D S,D表示Level2泄露到Level1置位,用于防环。
拓扑和配置:
 
\ 
 
NE1和NE2在同一个区域,运行在ISIS区域49,配置如下:
 
\ 
 
命令行显示:
 
\ 
 
Wireshark抓包显示:
  
\ 
Flag: I位如果设置路由器所在接口支持IPv4封装,V位如果设置那么路由器接口支持IPv6。细心的你肯定发现了Route Capability TLV242携带了RID。
 
FLag:S置位表示LSP传递的范围是一个区域,D置位表示是否Level2泄露进了Level1。
 
2.TLV22-AdjacencySID
 
ISIS的拓扑通过TLV2(Cost-Type Norrow模式不支持SR)或者TLV22(wide模式)或者TLV222(多拓扑)来描述拓扑信息。那么连着邻居的Adj-SID使用Sub-TLV31(Adjacency-SID,如果是P2P的网络类型)和Sub-TLV32(LAN-Adj-Sid)进行描述。
 
\ 
Adjacency-SID的Segment是本地有意义的,因为本地有意义所有在不同的设备上标签可以相同,如果设备是Level1/2的路由器,而且同时支持IPv4/6协议栈,那么该接口对应的邻居可以分配高达8个标签。
 
如果将接口的ISIS网络类型改为P2P那么就不是LAN Adjacency-SID而是Adjacency-SID。
 
\ 
3.TLV135-PrefixSID
 
ISIS的路由信息,通过TLV135或者TLV236或者多拓扑情况下的TLV237来进行描述,那么Prefix-SID使用Sub-TLV3进行描述。
 
\ 
Anycast Prefix segment是prefix Segment中的一种,说白了就是多个节点通告相同的前缀,类似BGP的虚拟下一跳,组播的Anycast RP和IPv6的任波地址。它的作用是根据IGP访问最近的节点(Anycast prefix-SID多个发起者中的一个),而且可以做到冗余备份。

如果最近的节点失效,那么会根据IGP路由表的收敛去往其它的Anycast Prefix SID对应的节点。Anycast Prefix SID可以提高高可用性。
 
\ 
图中,A访问Z途径PE1然后到达Z,而B在访问的时候途径PE2然后访问Z。做到了流量的一个负载。当PE1出现故障后。
 
\ 
A访问Z的时候,先可以ECMP到D节点,然后通过PE2到达Z。再数据传递的过程中,A节点作为源节点所压得标签(Segment-List不需要进行修改)并没有发生任何变化。
 
LDP和SR的交互
 

(1)基本概念

SR有两个转发平面,一个是MPLS一个是IPv6。大家可以把Segment理解成一个标签。标签可以理解成NH的邻居节点,或者是某节点的标识。什么时候使用Segment-Routing的标签呢?
 
首先:IP报文的目的地址或者BGP(IPv4的BGP或者BGP L3VPN)的下一跳匹配Prefix-SID的路由;其次:下游邻居启用了SR(其实需要通过NH的SRGB来计算出标签),最后:节点配置了SR优先,默认是LDP优先;Segment-list就是标签的堆栈。
 
除了LDP能够为路由分配标签,还有RSVP-TE和ISIS/OSPF/BGP也都可以为路由分配标签,对于SR,IGP分配标签使用的是SRGB中的标签,从104万标签中挖取了一块标签作为SR使用。这样做带来的好处就是可以让一个节点对应的Prefix- SID在SR域是唯一的,便于管理和运维。
 
每个LSR必须确保它可以唯一地解读其入标签,说白了,入标签必须是唯一的。Adjacency-SID使用的标签在本节点是唯一的,PrefixSID确保在SRGB内分配是唯一的(除Anycast Prefix-SID)。除了SR使用的标签,其它协议使用的标签在除SRGB中随意选取标签,那么见到该范围标签就知道通过SR进行传递数据。
 

(2)解决SR和LDP共存

类似IP的双栈,那么设备即运行SR又运行LDP。在SR PE之间需要保持连续SR的连接,LDP PE之间保持连续LDP的连接,说白了就是要保证LSP能够无缝衔接。
 

数据平面

(1)Ingress上的操作

\
SR域的Ingress收到IP包后,查FIB表后,需要Push标签,将标签压入变为标签包,这个时候注意一点:如果同时存在LDP和SR分配的标签,那么必须有一个优先,也就是说在FIB表中只允许关联LDP或者SR的标签,不能同时关联两个,但在控制平面的LFIB表中是可以同时存在的。

LDP和SR的标签只有一个会关联FIB表(tunnel-prefer segment-routing),后续只会根据SR标签进行转发。 
\ 
控制平面主要做两件事:首先,运行路由协议,传递拓扑信息,构建路由表;其次,运行标签分发协议,分发标签,构建LFIB表。这个时候有LDP和IGP分配个路由的的标签,默认情况下使用LDP的标签,通过命令进行修改,可以把SR的标签写进FIB表。 

(2)Transit和Egress

 Transit到Egress沿路设备,收到的是标签包,查LFIB表,SR和LDP可以共存,这些条目可以按照本地标签来索引。LDP和SR分配的标签In标签必须是唯一的。本地有效,出向标签可以相同也可以不相同,仅仅对下游邻居有意义,而对本地节点没有意义。  
\
如图:因为R4为192.168.1.1/32这个FEC分片的索引是4,然后在Flag位中设置N=0,E=0,那么R3计算出来关于192.168.1.1/32的出标签就是Pop。

细心的读者会发现R2进行标签Swap动作的时候,出标签是24004,是通过R3DE SRGB的起始值加上Index计算出来的。如果在运行的网络中,既有LDP分配的标签又有Segment Routing分配的标签,共存的时候怎么操作呢?

下次为大家分解。
 
                                            未完待续