Segment Routing Overview
大家觉得有意义和帮助记得及时关注和点赞!!!
Segment Routing (SR) 是近年来网络领域的一项新技术,“segment” 在这里 指代网络隔离技术,例如 MPLS。如果快速回顾网络设计在过去几十年的 发展,我们会发现 SR 也许是正在形成的第三代网络设计思想。
第一代是以互联网为代表的无中心式设计, 所有网络节点通过分布式路由协议同步路由信息,这些路由协议包括 IGP(RIP、OSPF、IS-IS)和 EGP(BGP)。
第二代是近些年以 SDN 为代表的集中式设计,全局的控制器 了解整张网络的拓扑和状态,可以精确控制网络中每个节点的每条转发规则。代表是 Google 基于 OpenFlow 实现 B4 Network [1]。
以上两代网络的设计思想截然相反,因此必然各有优缺点。SR 此时横空出世,某种程度上 可以看作两者的折中(或优点结合):给定一个源节点和目的节点,集中式控制器(如果有) 只负责选取若干中间节点,形成一条转发路径;而这些中间节点之间还有很多其 他结点,它们之间如何转发及同步路由,都交给分布式算法。这种设计同时兼顾了集中 式控制(若干节点形成的转发路径)和分布式智能(路由同步、链路负载均衡等), 网络的控制粒度从最粗(第一代)到最细(第二代),再到 SR 的粗细适中(第三代)。
SR 实现以上目标的最重要技术之一是源路由(source routing), 每个包在离开源节点时就已经确定了(核心)转发路径,并将路径信息编码到了每个包里。
Segment Routing 一书的作者举了一个形象的例子(这也是他设计 SR 的直接灵感来源):从 Rome 开始到 Brussel [2],翻译成中文就是从上海开车去杭州:没有人会提前规划出路上的每一个转弯, 那太细了。你真正做的是,选出途经的几个重要地方,例如虹桥-松江-嘉兴-余杭- 西湖,只要确保沿着这几个地方向开,就一定能到达。至于两个地方之间,比如虹桥到松江 ,到底是走大路还是小路,要视当时的路况。假如一条路堵了,你可能会当即切换到另一条 路,但松江这个目标不变。(“规划出每一个转弯”的比喻,听上去是在揶揄 OpenFlow SDN 的那帮人。)
和术语 SDN 一样,“SR” 本身只是一个概念,并不是实现。目前 SR 的实现有两种:分别基 于 MPLS 和 IPv6,其中 MPLS SR 与现有的 MPLS 网络兼容,但大大简化了控制平面;而基 于 IPv6 的版本(称为 SRv6
)看起来前景更广阔。另外, Linux 4.10 已经初步支持了 SRv6,但性能还比较差 [3]。
- SR 是如何工作的?
- SR 举例
- SR 的好处
- Ready for SDN
- 网络无需维护任何应用状态
- 简化/简单
- 支持快速重路由(FRR)
- 适用于大规模数据中心
- 可扩展
- 双平面网络(Dual-plane networks)
- 集中式流量工程
- Egress Peering 流量工程(EPE)
Segment routing (SR) 是一种基于源路由(source routing)的网络设计。
- 包从源节点(source node)发出之前转发路径就已经确定了;
- 转发指令(forwarding instructions)以 segment list 的形式编码到每个数据包中;
- Segment list 中的每一个 segment 在路由信息库(Router Information Base,RIB)中都有记录;
- 每到达一跳(hop)后,list 最外层的 segment 用于确定下一跳。
- Segments 以栈的形式(stacked)存储在包头中。
- 如果栈顶 segment 指向的是另一个节点,当前节点就通过 ECMP 将包发送到下一跳:
- 如果栈顶 segment 指向的是本节点,就 pop out segment,执行下一个 segment 规定的任务。
SR 基于已有的一些内部网关协议(IGP,例如 IS-IS、OSFP 和 MPLS) 来实现高效和灵活的转发。
SR 是如何工作的?
在 SR 网络中,路由器有能力选择任意的转发路径,不管是显式(explicit)指定的路 径,还是 IGP 自动计算出的最短路径。
一个 segment 代表一段子路径(subpath),路由器将可以多段子路径结合起来,形成 一条到达目的节点的最终路径。每个segment 都有一个唯一的标识符(segment identifier ,SID
),通过 IGP 的扩展协议在网络中分发。IGP 扩展协议对 IPv4 和 IPv6 都适用。 和传统的 MPLS 网络不同,SR 网络中的路由器不需要 LDP 和 RSVP-TE 协议 来分配和同步 SID,以及对转发信息进行编程。
每个路由器(节点,node)和每个链路(邻接,adjacency)都有相应的 SID。
Node segment ID
是全局唯一的,表示 IGP 确定的到一个路由器的最短路径。网 络管理员从保留的一段范围内为每台路由器分配一个 node ID。
Adjacency segment ID 只在局部有效(locally significant),表示到一个 邻居路由器的具体邻接,例如一个出向接口(egress interface)。Adjacency segment ID 是由路由器自动生成的,范围不会和 node SID 重合。
在 MPLS 网络中,一个 SID 会编码成 MPLS label stack 中的一条纪录项(entry) 。SID 指示应该沿着一条特定的路径转发包。SID 分为两类:
- Prefix SID:带 IP 地址前缀的 SID,其中的 IP 地址前缀是由 IGP 计算出来的。 Prefix SID 全局(globally)唯一。Node SID 是 Prefix SID的一种特殊情况,其 prefix IP 是 node 自身的 loopbakck 地址。It is advertised as an index into the node specific SR Global Block or SRGB.
- Adjacency SID:一个 Adjacency SID 就是两个路由器之间的一条链路。Adjacency SID 是和它所属的路由器相关的,因此它只是局部唯一的
SR 举例
图 1 是一张由 5 个路由器组成的 MPLS SR 网络,控制平面基于 IS-IS。Node ID 的范围 是 100-199,Adjacency ID 的范围是 200 及以上。IS-IS 会将 segment ID(这里是 MPLS label)连同 IP Prefix 可达性信息在网络内做通告。
图 1 五个路由器组成的一张 MPLS SR 网络
在这个网络中,任何路由器想向路由器 E 发送流量,必须先将 103(路由器 E 的 node SID)push 到 segment list,以便利用 IS-IS 最短路径转发流量。中间结点的MPLS 标签 交换(label-swapping)过程会保留 103 标签,直到包到达节点 E,如图 2 所示。
图 2 MPLS 标签交换操作
以上是通过 Node SID 实现的转发路径。Adjacency segments 的行为与此不同。例如 ,如果一个包到达路由器 D,栈顶 MPLS label 是 203(D 到 E 的 adjacency SID),D 会先 pop label,然后将包转发给 E。
SIDs 可以组合成有序列表(ordered list)来实现流量工程(traffic engineering, TE)。根据需求的不同,一个 segment list 可以包含:
- 多个 adjacency segments
- 多个 node segments
- 多个 adjacency segments 和 node segments 的组合
上面例子还可以用 node segments 和 adjacency segment 的组合来实现,如图 3 所示:
- 首先,路由器 A push label stack(104,203)到每个包
- 然后,路由器 A 利用到最短路径和 ECMP 特性将包转发到路由器 D
- 最后在路由器 D 经过一个显式的接口(203)到达目的地 E
整个过程中,路由器 A 无需向网络节点声明任何路径信息(保存在每个包中)。网 络的(配置)状态不受这条路径的影响,还是保持原来的配置。也就是说,在保持网络状 态(配置)不变的情况下,A 设置的新路径生效(enforce)了。(作为对比,如果要在 SDN 中网络添加一条新的转发路径,那必然要对整个链路上的所有节点添加配置。)
图 3 组合 Node segments 和 Adjacency segment 到达 E 的路径
SR 的好处
Ready for SDN
SR 被认为是 SDN 的首选架构之一,而且它还是应用工程化路由(Application Engineered Routing,AER)的基础。它在基于网络的分布式智能 (例如链路和节点自动保护)和基于控制器的集中式智能(例如流量优化) 之间取得了很好的平衡。
SR 能够提供严格的网络性能保证、网络资源的高效利用、基于应用的交易( application-based transactions)的高可扩展性。SR 使得网络使用最少的状态信 息(minimal state information)来满足这些需求。
SR 可以很容易地集成到基于控制器的 SDN 架构,下图是一个示例,其中的控制器负责集中 式优化,包括带宽控制。
图 4 SDN 控制器
在这个方案中,SDN 控制器了解整张网络的拓扑和flow。路由器申请到目的地的一条路 径时,声明它期望的特性,例如延迟、带宽、链路多样性。控制器据此计算出一条最优路径, 返回 segment list(例如一个 MPLS label stack)。然后路由器将这个 segment list 编码到包头中,而控制器不需要对网络做任何额外的配置(signaling)。
网络无需维护任何应用状态
无需向网络添加任何应用状态(application state),segment list 就可以实现完全的网 络虚拟化。状态信息以 segment list 的形式编码在每个包中。因为网络只需维护 segment 状态 (node/adjacency segment ID,数量非常少而且变更不频繁),因此可以支持非常大 —— 而且非常高频 —— 的 transaction-based 的应用请求,而不会给网络造成任何负担。
简化/简单
- 当用于 MPLS 数据平面时,SR 可以通过隧道的方式将 MPLS 服务(VPN、VPLS、VPWS) 从一个 ingress provider edge(供应商边缘路由器)送到一个 egress provider edge,只需要 IGP(IS-IS 或 OSPF),而不需要其他协议
- 不需要额外的协议(例如 LDP 或 RSVP)来分发标签
- 可以复用已有网络基础设施,支持 ECMP(使用 node segment ID)
支持快速重路由(FRR)
对任何拓扑都支持快速重路由(Fast ReRoute)。在链路或节点挂掉的情况下,MPLS 依靠 FRR 实现收敛。有了 SR 之后,收敛时间可以做到 50ms
以下。
适用于大规模数据中心
- 用 BGP 分发 node SID,类似于 IGP 分发 node SID
- Any node within the topology allocates the same BGP segment for the same switch
- 支持 ECMP 和 FRR(BGP PIC:Prefix Independent Convergence)
- 流量工程的基石之一,SRTE
可扩展
- 避免了 LDP database 中的成千上万的标签
- 避免了网络中成千上万的 MPLS TE LSP
- 避免了成千上万的隧道配置
双平面网络(Dual-plane networks)
- 支持 Dual-plane(MPLS 和 SRv6?),支持跨 plane 的转发策略(disjointness enforcement)
- 任播(anycast)SID 支持宏策略(macro policy),类似于:“从 node A 注入的、到达 node Z 的 flow 1,必须经过 plane 1 到达”,“从 node A 注入的、目的是 node Z 的 flow 2,必须经过 plane 2 转发”
集中式流量工程
- 控制器和编排平台可以和 SR 流量工程联动,实现集中式优化,例如 WAN 优化
- 网络变动,例如拥塞,可以触发应用重新计算 SR TE tunnel 的 placement 方式
- SR tunnel 可以由编排器通过南向接口(例如 PCE)动态编程
- 敏捷网络编程,不需要对中间结点和尾节点做任何配置,也不需要对每条 flow 做配置( signaling)
Egress Peering 流量工程(EPE)
- SR 支持集中式 EPE
- 控制器指导流量从 ingress provider edge(边界路由器)和内容源(包从边界路由器开 始转发)依照指定的路径和接口到达 egress provider edge
- 用 BGP “peering” SID 表达源路由域内路径(source-routed inter-domain path)
- 控制器通过 BGP Link Status(BGP-LS) EPE 路由学习 BGP peering SID 和 egress 边界路由器外部的拓扑
- 控制器编程控制 ingress 点的期望路径
相关文章:

Segment Routing Overview
大家觉得有意义和帮助记得及时关注和点赞!!! Segment Routing (SR) 是近年来网络领域的一项新技术,“segment” 在这里 指代网络隔离技术,例如 MPLS。如果快速回顾网络设计在过去几十年的 发展,我们会发现 SR 也许是正在形成的第三代网络设计…...

【K8s】专题十五(6):Kubernetes 网络之 Pod 网络调试
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全…...

CMake 构建项目并整理头文件和库文件
本文将介绍如何使用 CMake 构建项目、编译生成库文件,并将头文件和库文件整理到统一的目录中以便在其他项目中使用。 1. 项目结构 假设我们正在构建一个名为 rttr 的开源库,初始的项目结构如下: D:\WorkCode\Demo\rttr-master\|- src\ …...

Boost之log日志使用
不讲理论,直接上在程序中可用代码: 一、引入Boost模块 开发环境:Visual Studio 2017 Boost库版本:1.68.0 安装方式:Nuget 安装命令: #只安装下面几个即可 Install-package boost -version 1.68.0 Install…...

多功能jquery图片预览放大镜插件
xZoom是一款多功能的jquery图片预览放大镜插件。它支持多种图片放大模式,可以和Fancy Box或Magnific Pop-up等插件结合使用,功能非常强大。 在线预览 下载 使用方法 在页面中引入jquery和xzoom.css以及xzoom.js文件。 <link rel"stylesheet&…...
CSS系列(39)-- Shapes详解
前端技术探索系列:CSS Shapes详解 ✨ 致读者:探索形状布局的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Shapes,这个强大的形状布局特性。 基础形状 🚀 圆形与椭圆 /* 基础圆形 */ .circle {widt…...
AI 神经网络在智能家居场景中的应用
在科技持续进步的当下,智能家居领域正经历着深刻变革,AI 神经网络技术的融入成为推动这一变革的关键力量,为家居生活带来了诸多显著变化与提升,本文将几种常见的AI算法应用做了一下总结,希望对物联网从业者有所帮助。 …...
Rocky DEM tutorial7_Conical Dryer_锥形干燥器
tutorial 7_Conical Dryer_锥形干燥器 文章目录 tutorial 7_Conical Dryer_锥形干燥器0. 目的1. 模型介绍2. 模型设置2.1设置physics2.2 导入几何2.3 设置motion2.4 Boundary边界设置2.5 设置材料2.6设置材料间相互作用2.7 创建粒子2.8 设置颗粒进口2.9 求解器设置3. 后处理Enj…...
CSS(二):美化网页元素
目录 字体样式 文本样式 列表样式 背景图片 字体样式 字体相关的 CSS 属性: font-family:设置字体font-size:设置字体大小font-weight:设置字体的粗细(如 normal, bold, lighter 等)color:…...

平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题
本MATLAB 代码实现了平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题 文章目录 运行结果代码概述代码 运行结果 三轴状态曲线对比: 三轴误差曲线对比: 误差统计特性输出(命令行截图&…...

【论文笔记】Visual Alignment Pre-training for Sign Language Translation
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Visual Alignment Pre-tra…...
NLP基础知识 - 向量化
NLP基础知识 - 向量化 目录 NLP基础知识 - 向量化 NLP基础知识 - 向量化目录什么是向量化?为什么需要向量化?常见的向量化方法1. 词袋模型(Bag of Words, BoW)2. TF-IDF(词频-逆文档频率)3. 词嵌入&#x…...
JAVA学习笔记_MySQL进阶
文章目录 存储引擎InnoDB引擎MyISAM引擎Memory存储引擎的选择 索引索引数据结构Btree(多路平衡查找树)BTreeHash索引为什么InnoDQB存储引擎采用Btree索引结构 索引分类思考题 索引语法索引性能分析慢查询日志show profiesexplain 索引的使用规则最左前缀法则索引失效SQL提示覆盖…...

ffmpeg: stream_loop报错 Error while filtering: Operation not permitted
问题描述 执行ffmpeg命令的时候,报错:Error while filtering: Operation not permitted 我得命令如下 ffmpeg -framerate 25 -y -i /data/workerspace/mtk/work_home/mtk_202406111543-l9CSU91H1f1b3/tmp/%08d.png -stream_loop -1 -i /data/workerspa…...
Vue.use()和Vue.component()
当很多页面用到同一个组件,又不想每次都在局部注册时,可以在main.js 中全局注册 Vue.component()一次只能注册一个组件 import CcInput from /components/cc-input.vue Vue.component(CcInput);Vue.use()一次可以注册多个组件 对于自定义的组件&#…...

javaweb 04 springmvc
0.1 在上一次的课程中,我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用,浏览器发起请求 /hello 后 ,给浏览器返回字符串 “Hello World ~”。 其实呢,是我们在浏览器发起请求,请求了我们…...

[Visual studio] 性能探测器
最近发现VS的profile还是很好用的, 可以找到项目代码的瓶颈,比如发现CPU的每一个函数的时间占比,分析代码耗时分布,和火焰图一样的效果 如何使用 1. 打开你的项目,调整成release状态 2. 点击调试->性能探测器 3…...
【漫话机器学习系列】017.大O算法(Big-O Notation)
大 O 表示法(Big-O Notation) 大 O 表示法是一种用于描述算法复杂性的数学符号,主要用于衡量算法的效率,特别是随着输入规模增大时算法的运行时间或占用空间的增长趋势。 基本概念 时间复杂度 描述算法所需的运行时间如何随输入数…...

IntelliJ IDEA中设置激活的profile
在IntelliJ IDEA中设置激活的profile,可以通过以下步骤进行: 通过Run/Debug Configurations设置 打开Run/Debug Configurations对话框: 在IDEA的顶部菜单栏中,选择“Run”菜单,然后点击“Edit Configurations...”或者…...
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(上)
Qt 的信号槽机制详解:之因信号槽误用引发的 Segmentation Fault 问题拆析(上) 前言一. 信号与槽的基本概念信号(Signal)槽(Slot)连接信号与槽 二. 信号槽机制的实现原理元对象系统(M…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...

【Axure高保真原型】图片列表添加和删除图片
今天和大家分享图片列表添加和删除图片的原型模板,效果包括: 点击图片列表的加号可以显示图片选择器,选择里面的图片; 选择图片后点击添加按钮,可以将该图片添加到图片列表; 鼠标移入图片列表的图片&…...