Segment Routing基础知识介绍
作者简介:杨涛,从事网络相关工作,个人微信公众号iKer_networker。
一、为什么发明Segment Routing
《Segment Routing详解卷一》:“SR项目的目标是简化IP网络的操作,增加其可扩展性和功能,并最终使应用能够控制网络,而不需要在整个网络基础设施上增加流状态。”—Clarence Filsfils
简单来说发明SR的目的就是想让网络更加简单和可控,从控制、转发、管理、可靠性等方面来说SR是网络技术的一次重大升级,提供了许多新技术,并且非常简单。
《Segment Routing详解卷一》中还写道:“SR项目的目标绝对不是消除LDP或RSVP-TE。意识到不需要LDP和RSVP-TE,是该分析的副产品。”
现有的实现流量工程的技术是RSVP-TE,它能够实现网络带宽管理控制,也能够实现快速重路由Fast ReRoute(FRR),部署它最主要的目的是利用它的FRR功能,但是它配置起来繁琐,管理起来复杂,需要构建N2条隧道,对等价多路径ECMP支持不好。有点像为了预防下雨,每天出门带把雨伞。
LDP协议不复杂,但还是有些多余,它需要配合路由协议,但他的功能是可以被路由协议取代的,分配MPLS私网标签BGP早就已经支持了,为什么不直接用BGP和IGP分配公网标签呢,路由协议来分配标签是SR技术的基础。
正如主要设计者所说,SR不是为了取代RSVP-TE和LDP协议而设计的,它打算发挥更大的作用。能够在多种技术的辅助下实现SR-TE,就算不想开启SR-TE,单独使用SR做底层转发仍然很合适,它既可以单独使用,也可以和LDP混合使用,还可以和EVPN、MPLS VPN组合使用,它比LDP简单,功能却更强大,事实上终结了这两个协议。
SR控制层面采用ISIS/OSPF/BGP等路由协议,转发层面采用MPLS,都是很常用的协议。举个简单的场景,先对SR转发层面有个初步的认识。
节点S为SR域的头节点,默认情况下去节点E按照红色标签路径转发,标签是报文在链路上封装的情况,16005代表节点E。管理员想采用一条经由节点B和节点C到节点E的路径,此时头节点S把节点B的标签16002封装到最外层,为了确保流量从节点B出来后去往节点C,把节点B的到节点C的链路标签80001封装到第二层,最后把16005封装到最内层。通过封装三层标签,满足了规划的路径,当然还可以封装16003和16005两层标签,也能达到同样的目的(如果节点B到节点E的生效路径就是经过节点C,那么还可以封装16002和16005,也能达到同样目的,非常的灵活),这里封装80001主要是为了演示链路标签。
图中转发会遵循倒数第二跳弹出机制,和经典MPLS一样。
SR技术可以在头端节点控制流量要转发的路径,这样就实现了基于源的路由,传统IP转发是逐跳基于目的IP进行路由。相比较策略路由等方法,SR控制流量转发的方法更加简单高效,管理成本大大降低。
SR技术可以分成两种,SR-MPLS和SRv6,控制层面实现方式类似,转发层面的思想相同,但方式不同,一个是MPLS标签转发,一个是IPv6报文转发。下文主要介绍下SR-MPLS,很多原理也适用于SRv6。
Segment就是标签,Segment列表就是标签栈,MPLS设计之初就支持多层标签,MPLS L3 VPN就是利用双层标签技术。SR为前缀和邻接分标签,分别叫前缀(Prefix) Segment和邻接(Adjacency)Segment,路由协议把这些标签通告到整个网络,网络中每个节点都知道区域中所有的Segment,这点是和LDP最大的不同,LDP的标签是本地的,只发送给自己的上游邻居。因此SR能够方便的控制数据的中间转发路径,控制从网络中的哪个节点的哪个接口转发。
路由协议为前缀Segment分配标签,叫Prefix-SID,它是与IP地址相关联的,因此它通常也是全局唯一的。有一种前缀Segment叫做节点(Node)Segment,通常是节点的环回接口的主机前缀,这个环回接口通常也作为路由器ID。还有一种前缀Segment叫任播(Anycast)Segment,和IPv6里的任播功能相同,多个成员共用一个Anycast-SID,之间可以负载均衡并互相提供故障保护。
Adjacency Segment或Adjacent-SID是与某个邻居关联的Segment,标识一条出链路,目的是引导流量从相关联的链路转发出去。SR既可以控制流量从某个指定的节点转发,也可以控制从指定邻居的哪条链路转发,控制的力度很强,当然也可以两者都不控制,直接指向最终目的地,就像传统的IP转发一样。
Adjacency-SID是通告它的节点的本地Segment,而Prefix-SID是全局的,节点会向网络中通告Adjacent-SID,但只有这个节点会把Adjacency-SID安装到转发表里,其他节点仅仅是知道这个Adjacency-SID,并不为它安装转发表。通常使用Adjacency-SID是跟在Prefix-SID之后,这个Adjacency-SID和Prefix-SID属于一个节点。
BGP协议和IGP协议稍微有些不同,他的邻居不一定是直连的,所以他有对等体节点Segment,对等体邻接Segment和对等体集合Segment等,本文不对此做介绍。
之前提到过SR的标签是全网通告的,和LDP不同,全网通告意味着全网都知道,可以全网相同,下面简单提下是如何分配标签的。
首先引入一个概念叫SR全局块(Global Block)简称SRGB,全网通告,就是告诉所有节点我的Prefix-SID的范围,CISCO的默认值是16000-23999,范围有了,在给每个Prefix通告一个SID索引(从零开始)出去,Prefix-SID就是SRGB的第一个值加上索引,这样标签值就确定了。比如一个节点为一个前缀通告了索引1并且它的SRGB是16000-23999,它为这个前缀分的标签就是16001。
SRGB是本地有效的,全局块本地有效,听起来有点矛盾,在正常部署SR的时候强烈推荐SRGB全网统一,但是有时候某个设备把这个标签块给分配出去另作他用了,比如给LDP标签或BGP标签之类的,所以有可能没法统一,因此也支持每个节点的SRGB不一样。
在SRGB全统一的时候一个前缀在全网的标签都相同,这样SR标签值就和IP地址全网一对一关联了,管理维护起来很简单,LDP每个节点为前缀独立分标签,不可能一样,也不全网通告,难以通过标签值来对报文转发的路径进行精细控制。
就算有些特殊的时候SRGB不一样,也只是给管理带来的一点难度,不影响对流量转发的控制。举个例子,如果网络只中有一个节点A的SRGB是26000-33999,这样,其它节点的SRGB全是16000-23999,节点C为自己的IP-C前缀分配索引3,并通告出去,除节点A外的节点为IP-C前缀分配的Prefix-SID均为16003(16000+3),节点A为索引为IP-C前缀分配的Prefix-SID为26003(26000+3),它的上一游邻居在把报文转给它时需要封装26003的标签值,而网络中其他节点全都采用16003这个标签值对目的是IP-C这个前缀的报文进行封装。
SRGB的确是全局有效的,所以本地有效的Adjacency-SID不在这个范围内,在节点另外的标签范围内分配,和其它节点冲突了也无所谓。
管理员可以手工配置SRGB范围。
接下来正式介绍转发流程,后面介绍控制面。Segment转发就是标签转发,几个动作压入(PUSH)、继续(CONTINUE)、下一个(NEXT)分别对应MPLS转发的压入(PUSH)、交换(SWAP)、弹出(POP),用的就是传统MPLS的报文头。头端节点判断一个IP前缀如果有SR出标签则执行压入动作,中间节点执行继续动作,也是根据标签查SR转发表,封装指定标签,多数时候出入标签值相同。
倒数第二跳也有传统MPLS转发的弹出机制,传统的MPLS通过为上游邻居分配隐式空标签来请求倒数第二跳弹出,SR没有这个机制,但是SR节点能够通过控制平面知道它自己是倒数第二跳,此时如果此前缀通告的关闭倒数第二跳弹出标志没有置位,则它弹出这个前缀的Prefix-SID,下图中的P标志位(ISIS)和NP标志位(OSPF),这些标志会附加在每个Prefix-SID进行通告。
倒数第二跳除了弹出还有两种行为,一种是正常带标签转发,也就是关闭倒数第二跳弹出位置1。另外一种情况是如果显示空标签此时也置1,则为数据包更换显示空标签,IPv4报文是0,IPv6报文是2,这么做主要是为了QOS,从MPLS的TC字段获取CoS信息,下图中的E标志位。
ISIS标志位
OSPF标志位
单纯的SR转发平面就是这样简单,还有和LDP互操作时的情况,后面再介绍,下面介绍下SR控制平面。
先介绍下ISIS对SR的支持,ISIS是基于TLV模式的协议,所以扩展性非常好,支持SR很轻松,就是增加一些TLV和子TLV,一些子TLV主要用来通告SR能力、Prefix-SID、Adjacency-SID、LAN-Adjacency-SID等,有为IPv4服务的和IPv6服务的TLV,所以对双栈支持的非常好,再扩展些TLV,就轻松支持SRv6了。具体的细节就不多说了,感兴趣的可以看相关文章或标准。
SR能力包括:
是否支持SR;
SR数据层面支持的能力,包括基于MPLS的Segment Routing(SR-MPLS)和基于IPv6的Segment Routing(SRv6),ISIS上面提到过两种都支持,OSPFv2就只能支持SR-MPLS一种数据层面转发模式了,OSPFv3也是两种都支持;
支持哪种SR算法,ISIS/OSPF协议默认是最常见的SPF算法,也可能有其他类型的算法,用于SR-TE;
通告的SRGB的范围。
再介绍下OSPF,这个需要区分OSPFv2和OSPFv3,一个服务IPv4一个服务IPv6,需要两个协议,比ISIS扩展性差点。OSPFv2引入了不透明(Opaque)LSA,不透明的意思是如果一个运行OSPF的设备不能识别的LSA,仍可以将它泛洪到它的邻居,能理解这些LSA的设备会正常使用它。
引入了三种类型的OSPFv2 LSA:9、10、11。这三种LSA功能相同,只是泛洪范围不同,OSPF是分骨干和非骨干区域的,还有外部区域,末梢区域等。9类LSA限定在本地链路范围内,不会泛洪到本地网络之外;10类LSA是比较常见的LSA,限定在本区域内(Area);11类LSA限定在本自治域内(AS)。
还有三个不透明类型:
类型4是路由器信息不透明LSA,携带SR能力,包含SR算法TLV和SRGB(SID/标签范围)TLV;
类型7是扩展前缀不透明LSA,用于分发Prefix-SID(子TLV);
类型8是扩展链路不透明LSA,用于分发Adjacency-SID(子TLV)和LAN-Adjacency-SID(子TLV)。
这几种类通常都使用10类LSA进行传播。
OSPFv3可以为SR-MPLS和SRv6服务,此处先不做介绍。
数据报文从OSPF一个区域到另一个区域以及从ISIS的一个层次到另一个层次(经过OSPF的ARB或ISIS的层一层二设备)时,需要判断自己是不是倒数第二跳,要不要执行倒数第二跳弹出标签动作,不跨越这些设备时能够正常判断,一旦跨越时就很难判断Prefix-SID的始发节点(Adjacency-SID不跨区域或层次传播)。这时控制层面会做一些标志位的设置,附加到Prefix-SID一起传播。
ISIS会置位关闭倒数第二跳弹出标志(P位置1,不进行倒数第二跳弹出),目的是不让上游邻居误以为它是最后一跳,还会为所有跨层次传播的前缀置R标志,用于表示这个前缀在层次之间向上或向下进行了传播,当前缀是直连到边界节点时,P位R位不置位。
ISIS本身把前缀从层次二传播到层次一时还会置上行/下行位,这是ISIS原本就有的功能,置次位的前缀不会再通告回层次二,避免循环传播。
OSPF也会置位关闭倒数第二跳弹出标志,NP位置1,经过ARB传播的Prefix-SID能够被识别出来,这就是OSPF有多种类型LSA的好处,所以默认情况下认为这些Prefix-SID都是来自于另一个区域的其他设备,如果前缀是直连到边界节点时,则NP位不置位,置A位(表示这些Prefix-SID直连到此ABR),有了NP位其实就足够给上游邻居做出是否弹出标签的决定了,置位的就不弹标签,不置位的就弹标签。
OSPF原本那些LSA都是按照原来的流程正常和传播的,多了类型4、7、8的10类不透明LSA,类型8是Adjacency-SID,不跨区域传播,类型4和7会被ABR跨区域传播,这样SR能力和和Prefix-SID就会被全网正确学习,为SR转发层面所用。
在两个协议之间重分发Prefix-SID,则两个协议需要使用相同的SRGB,道理也很简单,路由在协议之间重分发后,Prefix-SID应该不变,这样底层转发表实现起来简单,Prefix-SID不区分路由协议,只认准一个Prefix保持不变,传到另外一个设备的话还是可能因为SRGB不同而变化的,当然最好SRGB都相同,简单最好。
重新分发到OSPF时本来的流程是会产生一个5类LSA,还会为Prefix产生一个11类不透明LSA通告Prefix-SID,NP位也置1,关闭倒数第二跳弹出,因为它不是最后一跳,SR数据转发层面不会被此ASBR破坏,和跨区域一样,重新分发对SR技术来说也没有任何问题。
重新分发到ISIS时和ISIS跨区域时差不多,Prefix-SID 的R位和P位都置上,数据转发层面不弹标签,正常转发。
之前很少提到BGP,其实不论IBGP还是EBGP都支持SR,BGP扩展能力很强,想支持新功能非常容易。BGP可以和IGP重新通告标签路由,也可以在BGP组网环境中开启SR,实际中单独BGP组网不多,目前数据中心主要采用Spine-Leaf网络架构,这个架构非常适合运行BGP,VxLAN/EVPN功能通过BGP实现,此时开启SR能够发挥其流量工程上的作用,此处不介绍。
两种技术数据层面都采用MPLS转发,所以具有很好的互操作性,当网络中的设备同时开启SR和LDP协议时,转发表会为两者都安装出入标签转发条目,当不带标签的流量进入设备时默认情况下LDP标签优先使用,因为这个协议比较老。带SR标签进来的流量就走SR标签转发,带LDP标签进来的流量就走LDP标签转发,二者互不影响。
LDP和SR混合组网时在交界点的设备同时开启了LDP和SR。
先看报文从LDP域到SR域,当去往SR域内一个地址的IP报文进入LDP域时封装LDP标签,报文通过LDP转发交界设备上,交界设备上有LDP入标签,没有LDP出标签,有SR入标签,也有SR出标签,交界设备能够自动把SR出标签放到LDP标签表的出标签,这个是自动完成的,之后报文在SR域内走SR转发到目的设备。数据层面完美衔接,控制层面没有变化。
当报文从SR域到LDP域时控制层面需要改动一下,因为LDP域内的设备没有Prefix-SID,所以目的在LDP域内的报文经过SR域时查不到相应的SR出标签,SR标签是通过SRGB和索引计算出来的,LDP域内的设备没有这个功能,此时可以找台设备替LDP设备分配Prefix-SID,这台设备叫映射服务器Map Server(MS),向SR域内为LDP域内的前缀通告SRGB和索引,这种通告在SR域内通过路由协议正常扩散,这样SR出标签问题就解决了。
这是控制层面的一点改动,数据层面原理和LDP转SR是类似的,出标签在LDP标签映射和SR标签映射中互相拷贝,如果没有出标签的情况下。
报文源和目标都在SR域,中间经过LDP域,此时,如果不需要访问LDP域内的设备则不需要配置MS。如果报文源和目标都在LDP域,中间经过SR域,此时需要MS。简单来说只要报文需要从SR域到LDP域且终结在LDP域,则需要MS,否则包括路过LDP域的情况都不需要MS。
其他的故障链路保护机制或多或少都有限制,TI-LFA几乎是完美的:
可以覆盖100%的拓扑;
小于50毫秒的链路、节点和共享公共物理资源(SRLG)保护;
操作简单,几条命令,原理简单;
IGP协议自动计算,不依赖其他协议;
设备本地保护机制,不需要其他设备维护状态;
能保护SR、IP和LDP流量。
TI-LFA的最终目的就是计算备份路径的Segment列表,支持ECMP。没有SR之前,备份路径没法直接使用收敛后的路径,因为这条路径可能存在环路,有了SR,可以指定路径,避免路由收敛慢产生的环路问题。
收敛后的路径很容易计算,但是为了尽量少的使用标签栈,简化数据层面的复杂度,仍采用LFA的技术,计算P空间和Q空间。设备保护的链路需要是直连到自己的链路,这样才能快速感知故障,计算P空间和Q空间的输入条件都是被保护的链路,这台设备自己计算,其他设备不需要感知。
P空间的设备是计算设备能够不经过被保护链路所能到达的设备,这个就是把以自己为根计算出的全部转发路径减掉包含被保护路径的条目,是整个转发树的子集,这个转发树就IGP通过SPF算法算出来的。经过设备到达自己的P空间设备的流量不经过被保护链路,一旦被保护链路出现问题,不会影响设备发送流量到自己P空间的任意一台设备。
Q空间设备计算的输入条件除了被保护链路外,还需要目的设备,是流量最终要到达的设备,通常是SR边缘节点。应用TI-LFA的设备会为每个目的设备单独计算Q空间,单独计算备用保护路径。Q空间和P空间计算方法类似,只不过根不同,以目的设备为根,计算出的全部转发路径减掉包含被保护路径的条目,从Q空间的设备到达目的节点的流量也不受被保护链路故障的影响。
设备还会再计算一次转发树,这次计算会排除掉被保护链路,这样就可以计算出它到目的节点的备用转发路径,也就是被保护链路故障后完成收敛的路径。
沿着备用转发路径在P空间和Q空间选择设备,P空间和Q空间可能重叠,选择的设备可能是同一台设备,也可能是不同的设备,设备需要计算出最优的Segment列表(基本2个标签就够了,有可能包含Prefix-SID和Adjacency-SID),确保流量沿着备用路径走即可,当然,这个列表是备用列表,只有被保护链路检测出故障时才启用。
上述算法是个基本的算法,CISCO有专有的优化算法,设备本地行为,做了优化,没有公开。为每个目的地都计算一个Q空间其实开销也很大的,最终目的是为了计算出让流量走备用路径的标签表。还有扩展P空间这个概念,计算节点自己的P空间和它邻居的P空间设备的并集,因为邻居能到的地方自己也可以,最多加一个Adjacency-SID。
TI-LFA可以算是SR-TE的一个功能。
基础的SR知识就介绍这么多,接下来还有SR-TE和SRv6等相关技术。SR技术的广泛应用已经是大势所趋,SRv6更有可能在未来5G时代的网络中发挥关键的作用,对SR基础有了了解后,SR-TE和SRv6将更加容易学习。