SR:Segment Routing,源路由技术,在路径的源头插入一组列表(Segment list),引导数据按照特定的路径通过网络,除源节点外,其他节点只需要执行承载数据报文里的Segment(甚至是不支持SR),无需维护和计算状态信息。
SRTE对现有的TE提升巨大,现有的RSVPTE尽管被提出多年,但部署的复杂性一直较为诟病:所有的流量都要承载在隧道;隧道的数量过于庞大,如果需要支持ECMP更是数量倍的增长;在出现故障后收敛速度太慢;
相对而言SR采用集中-分布的部署模式:
控制端(可以是SDN控制器):获取整网的拓扑信息,组合Segment并维护源节点的状态;
分布式端:由各个网路节点提供支持ECMP的最短Prefix Segment,保证segment IGP的收敛和FRR;
尤其在ODL以及SDN的支持,各大厂商和ISP的认同,相信在未来尤其IPv6普及的时候会大放异彩。
我们先了解一下SR术语概念:
Segment:节点收到数据需要执行的指令,他可以是常规的让数据包基于IGP/BGP以最短的路径转发数据包,也可以是基于特定的端口转发,设置可以将数据包发送至特定的应用;
Segment Identifier:SID用于标识Segment比如在MPLS用标签,IPv6的地址等;
Segment List:多个Segment的有序列表,引导数据通过特定的网络,类似MPLS的标签,有三个基本操作:PUSH、CONTINUE、NEXT。
全局Segment:所有启用SR的几点均支持的Segment指令,比如:16010,表示沿着去往节点16010的最短路径转发;
本地Segment:节点本地支持的Segment指令,尽管其他节点也可能支持该指令,但一般的操作是先通过全局Segment引导至相应的节点,再执行本地Segment,比如:从接口1转发(16010),再此Segment之前一般会有{16010,port1};
不同于LDP为MPLS分发标签,SR可以支持IGP/BGP设置静态配置Segment,通过IGP和BGP分发的Segment分别称为:IGP Segment
和BGP Segment;
IGP Segment分为2种类型,用过一下2种Segment类型,可以勾勒出整个网络拓扑信息:
IGP Prefix Segment(Prefix Segment/Prefix SID):数据按照最短的ECMP的路径前往该Segment关联的Prefix;Prefix SID支持多跳和ECMP的全局Segment;
Node-SID:特殊的Prefix Segment,一般是路由器ID,不同的是Node-SID被通告时对应一N-flag的置位;
IGP Adjacency Segment:数据按照特定的邻接链路转发出去,无关ECMP和shortest path, 会以倒数第二跳pop的方式存在;Adj-SID会从SRGB之外自动分配,为了防止链路动荡带来的Adj-SID的变化,一般会设置30分钟的保护机制,超过30分钟再回收。
ISIS使用扩展TLV 其中SR开启使用TLV2 、Prefix-SID 3 、Adj-SID 31 、SID/Lable 149
router isis 1
address-family ipv4 unicast
metric-style wide
segment forwarding mpls //启用mpls转发
segment-routing mpls//启用SR的控制层面和Mpls的数据层面
TLV定义了 路由器ID、泛洪范围和可选TLV等
我们主要来研究OSPFv2下的SR
OSPFv2
最初OSPFv2使用固定长度的LSA用于基本协议,后来引入了不透明LSA opaque LSA,不支持的OSPF路由器只会转发,但不处理,目前主要用在TE工程,通过扩展的不透明LSA以及全局路由表中的环回口地址配置Prefix-SID,为邻接分配Adj-SID,并通过MPLS作为数据层面进行转发;
可以根据IGP的区域概念划分不同的扩散范围,其中Type 9:Link-Local;Type 10:area-local;Type 11: AS-wide。具体的报文和说明如下图:
我们通过配置来具体研究:
svr1:
interface loopback 0
ipv4 adress 1.1.1.1 255.255.255.255
interface gi 0/0/0/0
ipv4 address 12.1.1.1 255.255.255.0
no shut
interface gi 0/0/0/1
ipv4 address 13.1.1.1 255.255.255.0
no shut
router ospf 1
router-id 1.1.1.1
//使用默认SRGB标签范围16000-23999
segment-routing forwarding mpls
segment-routing mpls
area 0
interface loopback 0
prefix-sid absolute 16001 explicit-null //指定Node-SID 16001,并设置倒数第二跳为显式空标签,默认为POP
prefix-sid index 1 explicit-null //和上一行命令效果一样
interface gi 0/0/0/0
interface gi 0/0/0/1
commit
其他Router配置类似,不做演示
上图显示的loopback0,也就是Node-SID的前缀不透明LSA,我们可以看到,通过该LSA的前缀1.1.1.1/32routerLSA关联,Type10表示在本area内传播,7.0.0.1表示不透明类型7,并且该路由的其中一个非透明前缀。
Extender Prefix TLV:的flag 0x40表示N置位,这里是Node-SID的意思,AF 0表示ipv4单播;
SID sub-TLV:指定与前缀1.1.1.1/32 关联,flag 0x50表示倒数第二跳显式空标签,默认为0x0执行pop,Algo表示是否采用标准SPF算法,Index表示在SRGB中的索引位置;
我们研究一下xrx4的mpls 转发表项:
如果采用默认配置,16004的 outgoing会表现为POP;如果需要做anycast prefix-sid需要将将n-flag-clear;
再来研究一下MPLS的所有转发表:
16002采用默认的倒数第二跳方式pop,16003,16004分别配置了倒数第二跳显示空标签。24001-24005分别为XRV1的邻接口,标签为值是从SRGB之外自动分配获取,倒数第二跳一律采用POP。svr2-4的相关配置如下:
可以看出与传统MPLS的控制层面LDP不同,SR可以基于IGP自身下发,避免了LDP下发标签的消耗,避免了LDP与IGP的同步问题,并且SDN控制可以基于IGP的链路状态推到拓扑并制定相应的SegmentList;SR对承载流量的协议并无要求,对现有的环境几乎无需变动,
后面我们继续讨论BGP-Prefix,以及SRv6
以下简单回顾MPLS的转发过程:
IP转发原理:网络节点会基于路由协议计算生成RIB(路由表),并更新至线卡和FIB(转发表)。在CPU性能没有那么优秀的时候,数据在转发时,CPU计算RIB并基于最长匹配,时间在ms级甚至更高,这时候MPLS、ATM、FR提出了各自的解决方案,我们仅讨论MPLS,如下图是MPLS的分析:
在运行MPLS域内的每台交换机我们称为:LSR(Lable Switching Router),在数据进入边缘LSR(LER)的时候,路由器将具有相同特征(源目ip,源目端口,Cos等)归纳为一个等价类FEC(forwarding equivalence class),并通过LDP打上对应的标签。Lable会插入到链路层和IP层之间,所以下次再收到FEC时,会直接基于LFIB标签转发,而节约了cpu的计算时间。不过在今天CPU性能足够优秀,制约传递效率的点在CPU传递至线程生成FIB并转发的过程,如果站在转发效率的角度,MPLS已经失去最初的意义。但是目前的MP-BGP的VPN技术极大的依赖MPLS,这些我们不做讨论。