SRv6全称为Segment Routing IPv6,是当下最为热门的Segment Routing和IPv6两种网络技术的结合体,兼有前者的灵活选路能力和后者的亲和力,以及SRv6特有的设备级可编程能力,使其成为IPv6网络时代最有前景的组网技术。
IPv6大家都很熟悉,是取代IPv4的下一代网络协议,那Segment究竟是何物?可以把SRv6网络想象成一台分布式“计算机”,Segment列表好比程序,Segment就是指令,兼有寻址和行为能力。我们可以将用户意图翻译成Segment列表,并附在数据报文中,输入SRv6网络“计算机”,然后依次在不同的节点上执行Segment指令,比如切换到下一个Segment、压入或弹出Segment列表、关联L2/L3 VPN等,从而实现基本选路、VPN、OAM、Service Chaining、APN6(App-aware IPv6 Networking)等不同层面的功能。
在SDN组网中,由控制器负责编排和下发Segment列表,实现智能选路的目的。随着SRv6技术和协议的完善,网络设备编程能力的提高,有望通过SDN+SRv6定义一切网络功能,引领我们迈入智能网络世界。
SRv6中通过SID(Segment ID)标识每个Segment,SID是一种特殊的IPv6地址,既有普通IPv6地址的路由能力,又有SRv6特有的行为能力。
每个SRv6节点都会维护一张SID表(实际上是路由表的一部分),由许多128bit的SID组成,SID标准格式为Locator+Function(Args),如下所示:
Locator,标识SRv6节点的定位器,每个节点起码有一个全局唯一的Locator值,作为本地SID的共享前缀,其他节点通过Locator路由访问本节点SID。
Function(Args),标识SRv6节点内不同的行为,比如END、END.X等,少数行为还需要传递Args参数。
SRv6节点收到IPv6报文之后,会根据IPv6 DA(Destination Adddress)查找全局路由表,如果匹配到某个SID,则交由SID定义的行为或Behavior处理,否则执行常规的路由转发动作。
SRv6 Policy是一种将用户意图(SLA、服务链)翻译成网络策略的机制,内核为Segment列表。网络节点和终端设备都可以按需发起或者由控制器下发SRv6 Policy,中间节点无需维护任何状态,因此SRv6 Policy适用于任意规模的网络互联和终端通讯场景。
SRv6 Policy由多个Candidate Path(简称CP)构成,其中有一个为Active CP,决定整个SRv6 Policy的行为和状态,基本格式如下:
Java
1 2 3 4 5 6 |
Candidate-path CP1 B-SID Preference 200 Weight W1, SID-List1 Weight W2, SID-List2 |
SRv6 Policy由
Candidate Path由
在SRv6 Policy之前,我们主要用TE Tunnel实现流量工程,那么为何SRv6中会主推SRv6 Policy呢?原因如下:
由此可见,在SRv6 Policy各方面都完胜TE Tunnel,就是一种为Segment Routing量身定制的网络技术,可以说SRv6的强大能力大部分是通过SRv6 Policy输出的。
SRH(Source Routing Head)为SID列表的载体,基于IPv6路由扩展头(协议号43),新增路由类型4,是SRv6体系中最为重要的数据封装标准,具体格式如下:
Segment[n-1]...Segment[0]组成了完整的Segment列表或路径,SL(Segment Left)指示当前活跃的Segment。头节点SL=n-1,IPv6 DA=Segment[n-1],中间节点收到IPv6报文,如果IPv6 DA为节点本地SID,则进入SRH处理流程。暂不考虑具体SID,SRH基本行为如下:
Java
1 2 3 4 5 6 7 8 9 10 |
S01. IF SL==0{ S02. 继续处理SRH指示的下一个扩展头 } S03. ELSE{ S04. IF 本地配置要求TLV处理{ S05. 处理TLV } S06. SL=SL-1,Segment[SL]复制到IPv6 DA S07. IPv6路由转发 } |
标准SRH封装中,每个SID占用16bytes,对于长Segment列表的应用,需要考虑封装开销对MTU和传输效率的影响。业界也在研究可行的SRH压缩方法,比如G-SRH(Generalized SRH)、uSID(Micro SID)等。
SRH还能携带可选的TLV参数,以扩展支持NSH/Service Chaining、OAM、VTN(Virtual Transport Network)、APN6等高级特性。
SRv6网络编程标准中,SRv6节点(Endpoint)通过本地定义的行为(Behavior)处理SRv6报文。SRv6定义了多种Endpoint Behavior,每个节点需要实例化它们和分配SID,并通过路由协议公布,以便外部了解节点所能提供的Behavior。
常用的Endpoint Behavior有END、END.X、END.DT4、END.DT6等,实现Underlay选路、Overlay业务承载等功能,具体如下:
S01. IF SL==0{ #无SRH等同于SL为0
S02. 向IPv6 SA(Source Address)发送ICMP Parameter Problem,结束
}
S03. SL=SL-1,Segment[SL]复制到IPv6 DA
S04. IF SL==0{
S05. 将前一个报文头中的NH更新为SRH中的NH,弹出SRH扩展头
}
S06. IPv6路由转发
S06. 转发给END.X指定的邻居
S01. IF SL!=0{
S02. 向IPv6 SA发送ICMP Parameter Problem,结束
}
S03. 剥离外层IPv6头以及所有扩展头
S04. 根据END.DT4 SID关联的路由表转发内层IPv4报文
S04. 根据END.DT6 SID关联的路由表转发内层IPv6报文
S01. IF SL==0{
S02. 向IPv6 SA发送ICMP Parameter Problem,结束
}
S03. SL=SL-1
S04. 添加外层IPv6报文头+SRH B,B对应SRv6 Policy的Segment List
S05. 外层IPv6 SA设置为A,IPv6 DA设置为B的第一个Segment,
S06. IPv6路由转发
S01. IF SL==0{
S02. 向IPv6 SA发送ICMP Parameter Problem,结束
}
S03. 插入SRH B,B对应SRv6 Policy的Segment List
S04. IPv6 DA更新为B的第一个Segment
S05. IPv6路由转发
每个Behavior都有对应的16bit Code Point,比如End with PSP为0x0002、End.DT4为0x0013等,路由协议会同时携带SID和Endpoint Behavior Code Point信息,这样就能判断出SID的具体含义。
前面提及END.B6.Encaps、END.B6.Insert都属于SRv6 Policy B-SID实例,其他节点通过B-SID引用,具体行为由SRv6 Policy实现,两者关系如下:
同时Headend也可以直接调用SRv6 Policy封装报文,主要Behavior有H.Encaps,H.Insert等,可用于L2/L3 VPN、FRR(Fast Reroute)、端到端IPv6通讯等场景,具体如下:
S01. 为IPv6报文P添加一个外层IPv6报文头+SRH(X,S3,S2,S1;SL=3)
S02. 外层IPv6 SA=T,IPv6 DA=S1,Next-Header=IPv6
S03. IPv6路由转发
S01. 为IPv6报文P插入SRH(B2,S3,S2,S1;SL=3)
S02. IPv6 DA设置为S1
S03. IPv6路由转发
前面介绍了SRv6的基本概念,知道了SRv6 Policy是满足用户意图的关键途径。接下来就面临一个现实问题,如何将用户意图自动转换成SRv6 Policy,并下发给SRv6节点,这需要一个完整的技术架构和配套的网络协议集,典型的SRv6组网结构如下:
基于标准的控制器、转发器两层SDN技术架构,两者之间通过南向协议交互,具体如下:
通过以上技术的整合,SRv6技术架构可以实现用户意图驱动、智能流量调度、全方位可视化等一系列功能。
ISIS属于链路状态IGP路由协议,采用TLV携带链路状态信息,可以在不动协议主体的情况下,通过增加部分TLV类型就可以支持IPv6、SRv6等新协议特性。
为了支持SRv6协议,ISIS需要增加SRv6 Capabilities、SRv6 Locator、SRv6 End SID、SRv6 Adjacency SID等不同Level的TLV,节点所有SID共享SRv6 Locator TLV中定义的前缀。
Locator前缀同时通过MT Reachable IPv6 Prefixes TLV发布,保证非SRv6节点也能计算出前缀路由,通过该路由就能满足SID转发需求。但节点在计算FRR或防微环,以及控制器编排路径时,需要计算使用END、END.X等具体SID。
BGP EVPN(Ethernet VPN)是一种MP-BGP协议实例,AFI/SAFI为25/70,支持丰富的NLRI(Network Layer Reachable Information)路由类型,比如交换MAC或IRB的Type2路由,交换Prefix网段的Type5路由,兼具L2/L3 VPN、IPv4/v6路由交换能力,能适配VxLAN SDN、骨干网SDN、分支SDWAN等不同的组网场景。
以骨干网SRv6 VPN组网为例,BGP EVPN需要携带NLRI+BGP Prefix-SID+Color等SRv6相关信息。Type5 NLRI用于交换用户L3VPN路由,取代VPNv4/v6地址簇的作用,BGP Prefix-SID通过SRv6 L3 Service TLV,携带END.DT4/6 VPN SID,Color属性用于关联EVPN路由和SRv6 Policy。
路由协议收敛时间一般为秒级,无法满足某些苛刻应用的要求。于是出现了各种IP FRR技术,基本思路都是为受保护的路由提供备用路径,在新路由生效前,通过备用路径转发流量,将中断时间降到毫秒级。IP FRR技术对于高可靠的SRv6 Policy组网尤为重要,虽然也可以依靠SRv6 Policy自身检测故障(BFD或Segment有效性)和切换CP,但扩展性和灵活性都不及IP FRR。
IP FRR技术发展经历了LFA(Loop-Free Alternate)、RLFA(Remote LFA)、TI-LFA(Topology-Independent LFA)三个时代,直到SRv6出现后,SRv6+TI-LFA才简单有效的解决了所有IP FRR问题。
LFA是最基础的IP FRR技术,目的是寻找一个直连的备用节点,该节点到目标节点不会经过故障链路或节点。比如从源节点S到目标节点D,主用下一跳为E,组网和链路COST如下:
LFA具体算法如下:
RLFA是最经典的IP FRR技术,目的是寻找一个非直连的中间备用节点,弥补LFA技术的不足,从源节点到备用节点,以及从备用节点到目标节点都不会经过故障链路或节点,组网和链路COST如下:
RLFA具体算法如下,简单起见未考虑节点故障情形:
TI-LFA在RLFA算法的基础上,增加了收敛后SPF路径的约束,并通过PQ Repair-List解决PQ无交集的问题,组网和链路COST如下:
SRv6 TI-LFA具体算法如下:
对于SRv6 Policy,IPv6 DA在不断的切换,为防止IPv6 DA对应节点的故障导致IP FRR失败,需要在IP FRR基础上加入中间和尾端节点故障处理机制,具体如下:
大意就是,SRv6 Policy中间节点故障采用Bypass跳过,极端情况下退化成SRv6 BE,尾端节点故障采用Anycast或Mirror SID规避。
IP FRR主要解决路由收敛之前转发间断问题,但各SRv6节点路由收敛速度不一会导致微环路产生,其实这是所有IP路由协议的共性问题。在SRv6防微环组网中,节点路由收敛分为两个阶段,第一阶段对于那些由于故障发生或恢复需要更新的路由表项,以严格或松散Segment列表作为临时转发表项,防止形成微环路,第二阶段保证所有节点完成路由收敛的前提下,切换到常规路由表项。
综合IP FRR、中间和尾端节点保护、防微环等技术,就能构建出真正高可靠的TI-LFA SRv6网络。
BGP-LS(BGP Link State)也是一种MP-BGP协议实例,AFI/SAFI为16388/71。BGP-LS将底层网络链路状态信息(ISIS)抽象成Node、Link、Prefix三类NLRI上报给控制器,分别描述节点能力、邻居关系、IP前缀信息,控制器据此还原网络拓扑和计算路径。同时为了支持跨域组网,BGP-LS还扩展了BGP EPE(Egress Peer Engineering)功能,将EBGP邻居关系链路状态化,从而在控制器层面打通不同AS的链路状态数据。
BGP-LS主要通过NLRI+Attribute组合携带链路状态数据,为了支持SRv6特性,需要增加Node NLRI的SRv6 Capabilities、Link NLRI的SRv6 End.X SID、Prefix NLRI的SRv6 Locator等TLV,另外还要新增SRv6 SID NLRI类型,附属SRv6 End SID、SRv6 End.X SID、SRv6 BGP Peer Node SID等TLV。
除了翻译拓扑功能,BGP-LS还可以上报SRv6 Policy状态和B-SID,以取代PCEP协议,避免控制器和转发器异构引发的兼容性问题。
在SDN组网中,控制器可以通过BGP SR Policy向转发器下发SRv6 Policy。BGP SR Policy同样基于MP-BGP协议,AFI/SAFI=2/73,SRv6 Policy的信息主要由NLRI和Tunnel_Encapsulation属性承载。
NLRI用于携带SRv6 Policy和Candidate Path信息,格式为
Tunnel_Encapsulation,用于携带Candidate Path的各种属性,比如Preference、B-SID、Segment-List等,并以层次化TLV的形式表示。
如何把BGP SRv6 Policy精准的下发给头端节点呢?跟控制器与转发器的BGP连接方式有关,具体如下:
相比于PCEP,使用BGP下发SRv6 Policy具备更好的兼容性和扩展性,理论上可以支持跨厂商的SRv6 Policy对接,和百万级SRv6 Policy的部署规模。
下面基于金融骨干网现状和业务需求,探索如何采用SRv6升级骨干网技术架构。
骨干网由三个核心节点、数十个一级节点构成,为总分行提供就近接入和高速转发服务,根据通用SRv6技术架构要求,总体组网规划如下:
采用标准的控制器+转发器两层SDN组网,控制器负责智能选路,通过南向协议下发SRv6 Policy,转发器负责执行Segment指令和报文转发。
转发器分为PE、P、RR等角色,采用ISIS作为Underlay路由协议,使能IPv4/v6多拓扑,网络拓扑和路由计算相互独立,同时启用SRv6扩展,交换SRv6 SID信息。
SRv6 SID格式为Locator+Function,Locator长度为112bit,其中前96bit为共同前缀,后16bit为节点数值,Function长度为16bit,其中静态Function为::00[01-FF],动态Function为::[0-F][1-F][00-FF]。END、END.X由节点动态生成,在ISIS中关联Locator后,ISIS会自动发布Locator和SID信息。ISIS还要启用TI-LFA和Micro Loop Avoid,以提高SRv6网络的收敛性能和健壮性。
PE采用BGP EVPN作为Overlay路由协议,基于Loopback IPv6地址建立域内BGP EVPN Peer,并选用SRv6隧道封装。用户VPN路由通过BGP EVPN Type5 NLRI+ BGP Prefix-SID发布,后者对应END.DT4/6 VPN SID。
假设PE已经从控制器收到SRv6 Policy,BGP EVPN路由会根据Color+Nexthop迭代到正确的SRv6 Policy上,数据平面调用H.Encaps Behavior封装VPN报文,SRH=SRv6 Policy Segment List+VPN SID,外层IPv6 SA=PE Loopback,IPv6 DA=Segment[n-1]。如果没有收到SRv6 Policy,则采用SRv6 BE转发,外层IPv6 SA=PE Loopback,IPv6 DA=VPN SID。无论哪种方式,目标PE收到报文后,根据IPv6 DA定位到VPN,剥离SRv6封装,查找VPN路由表转发。
控制器与转发之间用到SNMP、NETCONF、BGP-LS、BGP SR Policy等多种南向协议,这里重点介绍BGP-LS、BGP SR Policy的规划。
RR与控制器之间建立BGP-LS Peer,将ISIS的链路状态信息转换后上报控制器。RR与PE之间也要建立BGP-LS Peer,将PE传递过来的SRv6 Policy状态反射给控制器。
控制器与RR之间建立BGP SR Policy Peer,将SRv6 Policy下发给RR,RT为Headend:0。RR与PE之间也要建立BGP SR Policy Peer,将SRv6 Policy反射给PE,PE收到后根据RT导入自己始发的SRv6 Policy。
骨干网上传输的流量根据业务类别和安全等级,分为STORAGE、INTRANET、EXTRANET三类,由相应的SRv6 Policy承载。控制器定期根据网络拓扑和流量分布,计算更新SRv6 Policy路径,通过BGP SR Policy下发给PE转发器,实现智能流量调度的目的。
一开始可以采用基于SRv6 Policy维度的简单调度策略,具体如下:
PE分为AB平面,同平面PE之间两两建立STORAGE、INTRANET、EXTRANET三类Policy,每个Policy初始包含1条严格路径。
以北京节点PE-A为例,控制器初始下发的路径如上图实线所示。PE-A根据VPN路由的
转发器通过Telemetry实时上报接口流量信息,控制器会定期运行全局调优算法,综合线路利用率、SPF路径、SRv6 Policy优先级等多个因素,更新部分SRv6 Policy的Segment列表,并通过BGP SR Policy下发给PE-A,将相关SRv6 Policy上的流量迁移至其他低利用率线路上,路径如上图虚线所示。
如果某个节点或者链路故障,首先会触发SRv6 FRR,保证SRv6 Policy流量基本不中断,然后由BGP-LS上报链路状态变化,控制器收到后触发局部故障调优,为受影响的SRv6 Policy选择其他正常路径,最后等到全局调优周期,站在全网角度优化SRv6 Policy路径。
之后在控制器支持的情况下,可以升级为基于Segment List维度的复杂调度策略,具体如下:
PE分为AB平面,同平面PE之间两两建立STORAGE、INTRANET、EXTRANET三类Policy,每个Policy初始包含4条等价SL(部分SL路径可能重复)。
以北京节点PE-A的INTRANET SRv6 Policy为例,控制器初始下发的路径如上图实线所示。PE-A根据VPN路由的
全局调优和故障调优基本思路与上一种策略类似,区别在于转发器要上报Segment List颗粒度的流量信息,控制器要基于SRv6 Policy和Segment List两个维度算路,根据计算结果更新SRv6 Policy内部某些Segment List,并通过BGP SR Policy下发给PE-A,将这些Segment List上的流量迁移至其他低利用率线路上,路径如上图虚线所示。
前面采用了单域SRv6 Policy组网设计,由单个ISIS提供骨干网链路状态数据,经BGP-LS上报控制器,控制器进行域内算路并下发至转发器。单域组网对网络规模、线路类型都有一定的限制,还涉及骨干网与接入网Option A跨域互联的问题,导致大量VPN和路由策略重复配置,另外将SRv6局限于骨干网,无法发挥SRv6 Policy端到端的价值,因此有必要从单域升级为多域组网,具体规划如下:
骨干网收缩为三个核心节点,仅由P和RR角色组成,P不感知业务和VPN,仅根据IPv6 DA路由转发,RR除了承担BGP-LS、BGP SR Policy基本功能之外,还要负责骨干网P设备Underlay和接入网PE设备Overlay路由的分发和策略控制,相当于二级控制器。
接入网为总分行各自辖内通道互联网络,核心由原骨干网的2台PE组成,与骨干网RR之间建立EBGP Peer,交换EVPN、BGP-LS、BGP SR Policy等地址簇路由,并保持Nexthop不变。
骨干网和接入网之间Underlay跨域互联,通过EBGP交换Underlay IPv4/v6路由,其中包括SRv6 Locator路由。同时双方还要使能BGP EPE,将Underlay邻居连接通过BGP-LS上报给控制器。
控制器通过BGP-LS收集骨干网、接入网的链路状态数据,结合BGP EPE的邻接信息,拼接出骨干网+接入网完整的网络拓扑,其他算路和SRv6 Policy下发过程同单域组网。
目前业界和用户对于SRv6的研究和应用还处于价值探索的初始阶段,受益于国内IPv6规模部署行动的成果,用SRv6取代SR-MPLS已成为大家的共识,也是水到渠成的事情。
风物长宜放眼量,SRv6 Policy组网和智能流量调度只是SRv6的基础应用,后续我们还要将SRv6拓展到VTN切片网络、分支机构SDWAN、应用驱动APN6、Service Chaining等更多更广的领域,可谓路漫漫其修远兮,还需要大家一起求索。
参考文献:
https://tools.ietf.org/html/rfc8754
https://tools.ietf.org/html/draft-ietf-spring-srv6-network-programming-15
https://tools.ietf.org/html/draft-filsfils-spring-srv6-net-pgm-insertion-02
SRv6可靠性方案(一)
SRv6可靠性方案(二)
SRv6可靠性方案(三)
SRv6可编程技术-SRv6 Policy