这几年,在云计算和SDN技术的推动下,很多网络新技术,新名词涌现出来,让人眼花缭乱,有些是包装概念,有些是技术创新。其中,Segment Routing可以堪称是在核心路由领域的黑科技。
在这篇文章里,我们不讲协议字段解释,不讲配置步骤,只谈谈Segment Routing 的工作原理,让我们一起看看Segment Routing为什么与众不同。
1 Segment Routing(SR)概念
1.1 什么是Segment和Segment 路径
在谈SR之前,我们先要搞清楚一个最基本的概念,什么是Segment。 如图1所示,这是一个由支持SR 的路由器组成的网络,为了和其他网络区分开,我们叫它SR 域。在SR 域里,连接任意两个SR 节点的一段网络就叫Segment。Segment 由一个Segment ID (SID) 标识。SR支持MPLS和IPv6两种数据转发平面。在MPLS中, SID是一个MPLS标签,在IPv6网络中,SID是一个IPv6地址。
图1:Segment基本概念示意图
我们分别看看图1所示Segment A, B, C, D, E 的特点。
Segment A: 连接R1到R4, 跨两跳网络R1 -> R2 -> R4 。
Segment B: 连接R4 到R6, 跨一跳网络R4 -> R6。
Segment C: 连接R6到R8, 跨一跳网络R6->R8。
Segment D: 连接R1 到R6, 三跳网络,两条转发路径: R1->R2->R4->R6, R1->R3->R5->R6,
Segment E: 连接R1到R8, 跨四跳网络,有三条转发路径。
连接SR域的入节点(R1)和出节点(R8)的段的列表,我们就叫它Segment 路径 。在图1中,从R1 到R8, 我们有多条Segment路径: Segment A + B +C ,Segment D + C, Segment E。思考一下,Segment路径 A+B+C和D+C有什么不同 ?
1.2 SR的路由架构
了解什么是Segment 和Segment 路径后,我们再介绍一下SR的路由架构。SR路由分为两个步骤:
第一步:计算Segment 路径。
数据报文进入SR域时,入节点需要为这个数据报文选择一个Segment路径,并把这个路径包含的Segment 列表写入报文头,其他网络节点根据报文头中的Segment 列表转发报文,直到出SR域。
那么谁来计算Segment 路径?
Segment路径可以是在入节点上静态配置,也可以是动态计算。Segment路径动态计算通常由单独的设备完成。这就是为什么人们说SR是一种SDN技术。需要注意是,Segment路径信息只需要下载到入节点,然后入节点把SR路径包含的段列表写入报文头中,其余网络设备上并不需要保存Segment路径信息,只是按照报文头中的Segment列表转发报文,这样有利于大规模的网络部署。
第二步:Segment 内部和Segment之间的路由和转发。
在前文的例子里, 假如R1计算的Segment路径是Segment D+C, 我们期望的是网络先把报文从R1转发到R6 (Segment D), 然后再由R6 转发到R8(Segment C)。那么下一个问题是,其他网络设备如何按照报文头中的Segment列表转发报文 ?我们将在下一章节里,详细介绍SR在MPLS网络里怎么转发。
读到这里,您可能已经意识到:SR路由第一步其实就是决定Overlay路由,第二步是Underlay路由。所以首先SR是一种Overlay 技术,如MPLS, VxLAN, GRE 一样。不同的是,其他的Overlay技术,只能指定Overlay的起点和终点,然后交由Underlay把报文从起点转发到终点。Overlay 和 Underlay完全是分开的。
然而,SR可以指定Overlay途中经过的多点,比如前文的例子,从R1到R8, 我们可以指定走 R1 -> R6 -> R8, 或者 R1 -> R4 -> R8等,可以用来规划网络流量。所以SR 更是一种流量工程技术。
1.3 Segment 转发平面
在这篇文章里,我们不讨论SDN控制器部分,我们主要讨论上文提到的路由的第二步,如何在Segment内部和Segment之间路由和转发。
SR主要支持两种数据平面,MPLS 和IPv6。
1.3.1 MPLS 转发平面
在MPLS转发平面,一个Segment SID对应于一个MPLS标签,一个Segment 路径对应于MPLS 标签栈。
SR中定义了很多种Segment, 我们只要先了解节点Segment, 节点Segment代表一个路由器节点。这个Segment 往往就是配置在路由器的loopback 0 接口上,配置如下:
这段配置的意思是,101标签用来标识这个路由器节点,网络中任何其他设备,在处理MPLS标签的时候,如果发现报文是发往101的,就需要转发给这个路由器。
这个标签是静态配置的,全局唯一。SR扩展了IGP,如图2所示,每个路由器通过IGP通告各自的节点SID 标签。各个路由器可以通过IGP独立计算去其他各个节点SID标签的最短路径。
图2: 通过IGP通告节点SID
接下来,我们看看转发平面,如图3所示,如果R1到R8 的SR路径是R1->R4->R8,
图3: SR-MPLS 报文转发
- R4的SID 是104,R8的SID是108。R1 把相应的标签栈104/108写入报文头,然后查询去104的最短路径,下一跳是R2, R1把报文发给R2。
- R2收到报文后,查看栈顶标签104,查询去104的最短路径,发现104是直连下一跳,R2触发PHP,弹出标签104,把报文发送到R4。
- R4 查询栈顶标签108,查询去108的最短的路径,发送给R6。
- R6 查询标签108,触发PHP,弹出108,发送给R8。
- R8收到报文。
可见,SR-MPLS可以非常方便的在入节点上规划网络路径,网路中其他节点上只需要维护跟拓扑相关的信息,不需要知道每个流的路径,也不需要LDP来交换标签,这个方案非常简单有效。
1.3.2 SRGB
我们提到每个节点SID需要静态配置,而且要全局唯一。传统MPLS网络标签由路由器动态分配,事实上,我们很难知道全网范围内,还有哪些标签可以用来配置SR-MPLS。
解决的方法是引入SRGB (Segment Routing Global Block)
我们需要在每台设备上配置SRGB, 默认是16000 ~ 23999,这些标签预留给Segment Routing。如果哪台设备上,已有业务已经使用到了16000~23999中的某些标签,我们可以在这台设备上配置不一样的SRGB范围。
另外,设备的SID只配置相当于SRGB 起始标签的索引,下面的配置表明,loopback0的SID 的索引是1,那么在这台设备上对应的标签是16001。每个SID的索引要在全网范围里唯一。
配置好SRGB后,各个路由器需要通告各自的SRGB,以及各自节点的SID。如图4所示,每个节点都通告各自的SRGB Base和节点SID Index。节点SID Index 全网唯一,每个节点的SRGB范围可以各自配置,在这个例子里,大部分路由器SRGB 都从100开发,R2, R4, R6 两个节点例外,R6从200开始,R4从300开始,R2从400开始。
图4: IGP通告SRGB 和 Node SID Index
引入SRGB后,我们再看看SR MPLS 转发平面如何工作,如图5所示,假设R1到R8的SR 路径是R1->R4->R8, 那么:
图5: 引入SRGB后,SR-MPLS 的数据转发
- R4的Index是4,R8的Index是8。所以逻辑上标签栈应该是index 4/index 8。Index 8最先要经由R4转发,R4的SRGB Base 是300,所以index 8对应的标签是308。发往标签index 4 的最短路径是通过R2, R2的SRGB Base 是400,所以index 4对应的标签应该是404。R1 把两层标签404/308 写入报文头,然后把报文发往R2。
- R2 收到报文,检查栈顶标签404,因为R2 的SRGB Base是400,所以R2知道404是发往index 4 的SID,R2 查询index 4 SID的转发路径, 发现index 4是直连邻居,然后触发PHP, 弹出标签404,然后把报文发送到R4。
- R4 检查栈顶标签308,因为其自身SRGB是300, R4知道报文是发往index 为8的Segment。 R4查询转发表,发现需要转发给R6, 并且R6 的SRGB 是200,所以R4 把栈顶标签从308交换成208,发往R6。
- R6 检查栈顶标签208,因为其SRGB是200,知道是发往index 为8的Segment。 R4查询转发表,触发PHP,弹出标签208, 把报文发往R8。
- R8 收到报文。
可见SRGB解决了全局静态分配标签可能存在冲突的问题,用户只需要为每个Segment配置一个全局唯一的index。设备发送报文的时候,会根据邻居SRGB Base 把index映射成一个真正的标签,在收报文的时候,再根据自身的SRGB Base,把标签再映射回index。
在实际应用中,最佳实践是在每个设备上配置同样的SRGB,这样可以根据标签识别整条路径,利于故障诊断。
1.3.3 IPv6 (SRv6)转发平面
下面我们看看SRv6的工作机制,首先,每个路由器通过IGP发布一个IPv6地址作为Node SID。
图6:SRv6路由转发
在数据转发平面,假设SR路径是R1->R4->R8:
- R1 把 SR 扩展头写入报文,这里包含两个Segment。 Segment 0是R8的SID IP8, Segment 1 是R4的SID IP4。SL (Segment Left) 表示当前在哪个段,这里是1。外层IPv6 源地址是IP1, 目的地址是当前段的地址IP4。然后R1依据IGP 最短路径把报文发送给R2。
- R2收到报文,目的地址是IP4, R2只需要做正常的IP路由,把报文发给R4,R2并不参与SR 路由。
- R4 收到报文,发现目的地址是其自己,检查SRH,发现SL不等于0,把SL减一,把外层目的地址改成新的段地址,这里SL是0,就把外层地址改成Seg0的地址IP8,然后发往下一跳。这种操作在SRv6上叫End 操作。
- R6收到报文,做IP路由。
- R8 收到报文,发现目的地址是其自己,检查SRH, 发现SL 等于0,去掉IPv6 和SR外层封装,把payload 转发出SR域。这种操作在SRv6上叫End.DX4。
SRv6 可以在现有IPv6 网路中无缝部署,Linux 已经从4.10版本支持SRv6,SRv6有很多应用场景。
2 SR应用场景
2.1 简化的MPLS
SR是MPLS网络的优化和升级,可以无缝的提供MPLS网络的功能,因此在运营商网络里有大量的部署。如图7所示,客户路由器CE连接到运营商路由器PE,运营商在PE之间建立MP-BGP用来交换从CE路由器学到的VPNv4或者EVPN路由,为企业客户提供二层或者三层VPN功能。
如果运营商把网络从MPLS升级到SR,企业网络是感知不到变化的,运营商依然在PE之间运行MP-BGP交换从CE学到的IP或者MAC路由,然后把用户的流量封装在MPLS 报文里在PE 之间转发。
不同的是,MPLS报文怎么从一个PE转发到另一个PE。如图8所示,MPLS网络需要有三种协议,最底层是IGP协议实现所有路由器之间的IGP可达,在此基础上,MPLS 需要在所有PE路由和P路由器之间运行标签分发协议(LDP),用来建立PE之间的标签交换路径(LSP)。最后MPLS需要在PE之间运行MP-BGP交换用户侧的路由条目,实现用户网段在各个PE之间路由。
SR的改进在于,SR去掉了LDP协议。SR首先需要IGP 组建Underlay网络,也通过IGP 分发每个IP Prefix(FEC) 对应的标签, 同时PE也通过IGP 学到去任何其他PE Segment 的最短路径。
那么你可能要问个问题,去掉LDP有什么好处 ?
MPLS 的设计思想是每台路由器为同一个Prefix/FEC 动态的,逐跳独立的分配标签。好处在于标签都是自动分配的,用户不需要配置标签。但也会造成全网标签数量庞大等问题。
SR的设计思想是静态分配标签,SR需要用户手工为全SR域直连的每个网段静态配置一个标签(SRGB + Index)。所以,SR网络需要的标签数量是有限的。这种静态的标签分配方法相对来说更简单,更稳定。
但是,LDP不是网络致命的问题,去掉LDP也不能算是巨大的改进,但因为SR支持静态分配标签的机制,使得SR 能够使用这些静态标签来指定网络传输的路径,这就是SR支持另一个更重要的场景:流量工程。
2.2 流量工程SR-TE
流量工程要在分组交换网络里实现类似于电路交换的功能,让数据报文按照固定的路径逐跳转发。那么问题来了,逐跳的路径信息存放在哪里?主要有两种思路:
- 逐跳的路径信息存入网络设备中
如果要为某个IP流建立一个转发路径,就需要在沿路的每一跳设备上增加一个路由条目。如果要修改路径,就需要修改沿路的每台设备。实现和维护的难度是显而易见的。之前主流的流量工程技术 RSVP-TE就是采用了这种方法。
2. 逐跳的路径信息存入数据报文头中。
这是另一个极端,用户流量需要经过的每跳路由器信息都保存在报文头里,中间网络设备不保存用户流量的路由状态,只需要解析报文头,把报文转发到下一个节点。这种技术也没有得到广泛的应用。
SR-TE采用了混合模式,SR把关键节点的信息(Segment列表)写入报文头,让网络设备依据IGP把报文在Segment内部转发。跟RSVP-TE相比,SR-TE有很多优势。
限于篇幅,我们不展开讨论SR-TE的技术细节。我们在这里简要的讨论一下SR-TE的框架。如图9所示,SR-TE主要有这些功能模块:
- 网络性能度量和数据收集,控制器通过BGP-LS协议收集网络拓扑和性能度量数据。
- 路径计算,控制器通过PECP协议与设备交互,响应设备计算路径的请求,计算符合SLA要求的路径。路径计算算法也是SR研究的热点。
- 定义Policy, 为用户不同业务(目的IP网段,或者更细粒度)定义不同的SLA要求,低延时,高带宽等等。这叫SR-Policy。相对于RSVP-TE ,这个配置模式有很大的改进。对于每条policy, 可以有多条SR 路径,可以是静态路径,或者动态由控制器计算。
- 引流,当入口路由器收到报文时,怎么自动的匹配SR-Policy, 然后转发到SR-Policy 对应的路径。 SR-Policy的引流机制也很是自动的,不需要额外的配置策略路由等等,非常简便。
3 后记
SR的想法源自于对Openflow 等SDN技术的思考,Openflow 高举重新定义网络的大旗,希望使用软件全面控制报文转发,把转发智能从设备中完全剥离出来,Openflow从被发明之初,就得到的业界的充分响应,很多公司投入Openflow硬件和软件的研发,然而,人们也不得不思考,把大量的Openflow流转发表逐跳的写入每台设备中,这样的设计可行吗 ? 事实也证明,Openflow并没有得到广泛的应用。
另一方面,VxLAN Overlay技术近年来被广泛的应用,尤其在数据中心Fabric网络里,起初不同的厂商试图推广不同的Tunnel技术, 最终VxLAN慢慢胜出,一统江湖。然而Overlay技术对Underlay网络完全没有感知和控制,当我们需要在Underlay网络上选路时,VxLAN就束手无策了。
在这样的背景下,思科的专家提出了SR技术,很优雅的解决了大规模部署流量工程的问题,也为Overlay 和Underlay的整合提供了一个新的方向。SR已经得到业界普遍的认可,并有广泛的应用,是成功的创新技术。
这篇文章我们只简介了SR的技术原理,希望能帮您建立一个关于SR的知识框架。关于SR还有很多话题可以详谈,什么是SR-Policy,SR和另一个路由黑科技SDWAN之间的关系,如何相互集成等等。有机会我们再单独详细介绍。
下面是一些不错的参考资料和网站:
- Segment Routing 官网https://www.segment-routing.net
- 思科SR技术中文网站 https://www.cisco.com/c/zh_cn/solutions/service-provider/segment_routing.html
- SR RFC 8432 https://tools.ietf.org/html/rfc8402
- SR-Policy RFC Draft https://tools.ietf.org/html/draft-ietf-spring-segment-routing-policy-04)