SR技术概述与基本概念(SR-BE&SR-TE)

目录

一、SR背景

二、SR概述:

SR具有如下特点:

SR优势:

三、一些名词的基本概念

基本概念:Segment

基本概念:Segment ID——简称SID,用于标识segment 一般就是MPLS标签

基本概念:源路由

基本概念:Segment 分类

Prefix Segment(前缀段)

SRGB

基本概念:Adjacency Segment(邻接段)

AS内Node SID及Adjacency SID的泛洪

基本概念:SR Policy 段策略

基本概念:SR-MPLS 与SRv6

标签栈 & 粘连标签 与 粘连节点

SID的使用:(Segment ID——简称SID,用于标识segment)其实就是标签

四、关于SR应用方式的三种场景

场景一:基于Prefix Segment的转发路径 (全局有效)

场景二:基于Adjacency Segment的转发路径 (本地有效)

场景三:基于Adjacency Segment + Node Segment的转发路径 (常用)

五、SR-BE与 SR-TE

SR-MPLS BE (Best Effort)

SR-MPLS TE (Traffic Engine)流量工程


一、SR背景

段路由SR(Segment Routing)是基于源路由理念而设计的在网络上转发数据包的一种技术架构。

  • SR-MPLS可以通过多个MPLS形成路径(基于标签转发)
  • SRv6可以通过多个IPv6的拓展头部来实现

传统的专线业务使用的是MPLS LDP与 RSVP-TE(资源预留协议)

针对以上,Segment Routing给出的解决方案:

、简化协议,基于现有协议进行拓展:

  • 拓展后的IGP/BGP具有标签分发能力,因此网络中无需LDP,实现协议简化。
  • 引入了源路由机制:通过在头端节点实例化转发策略为标签列表,控制业务流量的转发路径。

、由业务来定义网络:

  • 由应用提出需求(时延、带宽、丢包率等),控制器收集网络拓扑、带宽利用率、时延等信息,根据业务需求计算显式路径。

二、SR概述:

  • SR(Segment Routing,段路由)是基于源路由理念而设计的在网络上转发数据包的一种架构,而不是一个单独的技术。
  • SR将网络路径分成一个个段(Segment),并且为这些段和网络中的转发节点分配段标识ID(即SID)。通过对段和网络节点进行有序排列(Segment List),就可以得到一条转发路径。
  • SR将代表转发路径的段序列编码在数据包头部,随数据包传输。接收端收到数据包后,对段序列进行解析,如果段序列的顶部段标识是本节点时,则弹出该标识,然后进行下一步处理;如果不是本节点,则使用ECMP(Equal Cost Multiple Path,等价负载分担)方式将数据包转发到下一节点。

SR具有如下特点:

  • 通过对现有协议(例如IGP)进行扩展,能使现有网络更好的平滑演进。
  • 同时支持控制器的集中控制模式和转发器的分布控制模式,提供集中控制和分布控制之间的平衡。
  • 采用源路由技术,提供网络和上层应用快速交互能力。

SR优势:

  • 有控制器的叫TE
  • 靠IGP集中算路的叫BE

  • Tl-LFA(确保无环)
  • SR技术的标签数量是:全网节点数+本地邻接数
  • SR仅需在头节点对报文的标签进行操作即可任意控制业务路径,中间节点不需要维护路径信息。

三、一些名词的基本概念

基本概念:Segment

Segment是节点针对所收到的数据包要执行的指令,该指令包含在数据包头部中

基本概念:Segment ID——简称SID,用于标识segment 一般就是MPLS标签

segment list是一个或多个SID构成的有序列表(MPLS 标签列表)

基本概念:源路由

源路由(Source Routing):源节点选择一条路径并在报文中压入一个有序的Segment List,网络中的其他节点按照报文封装的Segment List进行转发。

基本概念:Segment 分类

  • Prefix Segment (前缀段),用于标识某个目的地址前缀手工生成,通过IGP协议扩散到其他网元,全局可见,全局有效。——通常用环回口地址
  • Adjacency Segment(邻接段),标识网络中某个邻接源节点通过协议动态分配,通过IGP协议扩散到其他网元,全局可见,本地有效。也可以手工强制分,本地有效

Prefix Segment(前缀段)

  • Prefix Segment通过Prefix SID(Segment ID)标识。
  • Prefix SID是发布端通过的SRGB(Segment Routing Global Block)范围内的偏移值,接收端会根据自己的SRGB计算实际标签值用于生成MPLS的转发表项
  • Node Segment是特殊的Prefix Segment,用于标识特定的节点Node。
  • 在节点的Loopback接口下配置IP地址作为前缀,这个节点的Prefix SID实际就是Node SID。

SRGB

  • SRGB(Segment Routing Global Block):用户指定的为Segment Routing MPLS预留的全局标签集合。
  • 每台设备通过扩展的路由协议通告自己的SRGB。
  • 节点通过扩展的路由协议通告前缀SID索引(Index)后【或者可以叫为偏移量】,各台设备分别根据SRGB计算入站及出站SID。
  • 在实际部署中,建议设备采用统一的SRGB。

为什么需要SRGB:

  • SR要求前缀SID全局有效
  • 在MPLS中,设备的一部分标签空间可能被其他协议,例如LDP占用,因此需指定明确的空间用于SR全局标签。

基本概念:Adjacency Segment(邻接段)

AS内Node SID及Adjacency SID的泛洪

SR-MPLS使用IGP协议进行拓扑信息、前缀信息、SRGB和标签信息的通告。IGP协议为了完成上述功能,对于协议报文的TLV进行了一些扩展。(例如如下OSPF for SR-MPLS) 使能Segemnet mpls

基本概念:SR Policy 段策略

  • RFC 8402中定义SR Policy是一段有序的段列表(an ordered list of segments)。更完整的说法是SR Policy最终呈现为一段有序的段列表(Segment list),还包含了计算、生成和维护这个段列表及引入流量等SR技术的一种框架。SR Policy是当前最主流的实现SR的方式
  • 一个SR Policy由头端节点引导流量进入这个段策略中。它的段列表被精确的分配为标签栈指导流量转发。这个段列表由一系列的优化目标和限制(例如时延、亲和性和SRLG等)综合计算得到。这个计算可由本地或者控制器完成,然后应用到网络中。

SR Policy 段策略(根本就是一个标签堆栈)可以由CLI、NETCONF、PCEP、BGP SR Policy等多种方式生成。包含Segment List,完整的指导流量引入和转发。

基本概念:SR-MPLS 与SRv6

  • 如果数据转发平面:基于MLS,就是SR-MPLS,如果是基于IPv6的就是SRV6。

标签栈 & 粘连标签 与 粘连节点

  • 标签栈是标签的排序集合,可以标识一条完整的LSP
  • 标签栈中每一个邻接标签标识一条具体的邻接,整个标签栈标识了整条转发路径LSP的所有邻接。
  • 在报文转发过程中,通过标签栈中的每个邻接标签查找对应的邻接,并将标签弹出后转发,将标签栈中所有邻接标签弹出后,报文就走完了整条LSP,到达隧道的目的地。

SID的使用:(Segment ID——简称SID,用于标识segment)其实就是标签

  • 通过按序组合前缀(节点) SID邻接SID,可以构建出网络内的任何路径。
  • 在路径中的每一跳,使用栈顶段信息区分下一跳。
  • 段信息按照顺序堆叠在数据头的顶部。
  • 当栈顶段信息包含另一个节点的标识时接收节点使用ECMP的方式将数据包转发到下一跳
  • 当栈顶段信息是本节点的标识时,接收节点弹出顶部段并执行下一个段所需的任务。
  • 实际应用中Prefix Segment Adjacency Segment可以单独使用,也可以结合使用。

四、关于SR应用方式的三种场景

场景一:基于Prefix Segment的转发路径 (全局有效)

基于Prefix Segment的转发路径IGP通过最短路径算法(SPF)计算得出

1、通过IGP扩散之后,整个IGP域的所有设备学习到R2的Prefix SID(100)。

2、以R1为例(其他设备类似),它通过SPF算法计算出一条到达R2的最短路径。

基于Prefix Segment的转发路径并不是一条固定路径,头节点也无法控制报文的整条转发路径。

场景二:基于Adjacency Segment的转发路径 (本地有效)

通过给网络中每个邻接分配一个Adjacency Segment,然后在头节点定义一个包含多个Adjacency Segment的Segment List

通过这种方式可以严格指定任意一条显式路径(Strict Explicit),可更好的配合实现SDN。

场景三:基于Adjacency Segment + Node Segment的转发路径 (常用)

将Adjacency Segment和Node Segment结合,通过Adjacency Segment,可以强制整条路径包含某一个邻接。而对于Node Segment,节点可以使用 SPF算法计算最短路径,也可以负载分担。——(相当于一部分路径是强制指定,一部分是SPF计算的)

这种方式的路径并不是严格固定,所以也称作松散路径(Loose Explicit)

五、SR-BE与 SR-TE

SR-MPLS BE (Best Effort)

  • 使用SID来指导设备基于最短路径进行数据转发没有强制走哪条路径,这种工作机制称为SR-MPLS BE。
  • 例如在本例中使用R6的Node SID 606可以指导数据沿着去往R6的最短路径来转发数据该最短路径是基于路由协议计算得出的,并且支持等价路径。
  • SR-MPLS BE是一种替代“LDP+IGP方案”的一种新方案。

SR-MPLS TE (Traffic Engine)流量工程

  • 使用多个SID进行组合来指导数据转发,这种工作机制可以对数据的转发路径进行一定约束,从而满足流量工程的需求,因此被称为SR-MPLS TE(Traffic Engine)。
  • SID的组合形式:

使用多个Node SID。

使用多个Adjacency SID。

使用Node SID与Adjacency SID组合,如图中所示。

  • 23
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用STM32F10x系列单片机的串口与串口通信示例。 在此示例中,我们将使用两个串口进行通信:USART1和USART2。我们将在STM32F103C8单片机上实现此示例。总线时钟为8MHz。 硬件连接: 将USART1的TX引脚(PA9)连接到另一方的RX引脚。 将USART1的RX引脚(PA10)连接到另一方的TX引脚。 将USART2的TX引脚(PA2)连接到另一方的RX引脚。 将USART2的RX引脚(PA3)连接到另一方的TX引脚。 代码: 下面是使用Keil MDK-ARM编写的完整代码: ``` #include "stm32f10x.h" // Device header void usart1Init(void); void usart2Init(void); void usart1SendChar(char ch); void usart2SendChar(char ch); int main(void) { usart1Init(); usart2Init(); while (1) { char ch = USART1->DR; usart2SendChar(ch); } } void usart1Init(void) { RCC->APB2ENR |= RCC_APB2ENR_USART1EN; RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // PA9: USART1_TX GPIOA->CRH |= GPIO_CRH_MODE9_1 | GPIO_CRH_MODE9_0; // Output, 50MHz GPIOA->CRH |= GPIO_CRH_CNF9_1; // Alternate function // PA10: USART1_RX GPIOA->CRH &= ~(GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1); // Input mode GPIOA->CRH |= GPIO_CRH_CNF10_0; // Floating input USART1->BRR = 0x45; // Baud rate = 115200 @ PCLK = 8MHz USART1->CR1 |= USART_CR1_TE | USART_CR1_RE; // Enable transmitter and receiver USART1->CR1 |= USART_CR1_RXNEIE; // Enable RXNE interrupt NVIC_EnableIRQ(USART1_IRQn); USART1->CR1 |= USART_CR1_UE; // Enable USART1 } void usart2Init(void) { RCC->APB1ENR |= RCC_APB1ENR_USART2EN; RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // PA2: USART2_TX GPIOA->CRL |= GPIO_CRL_MODE2_1 | GPIO_CRL_MODE2_0; // Output, 50MHz GPIOA->CRL |= GPIO_CRL_CNF2_1; // Alternate function // PA3: USART2_RX GPIOA->CRL &= ~(GPIO_CRL_MODE3_0 | GPIO_CRL_MODE3_1); // Input mode GPIOA->CRL |= GPIO_CRL_CNF3_0; // Floating input USART2->BRR = 0x45; // Baud rate = 115200 @ PCLK = 8MHz USART2->CR1 |= USART_CR1_TE | USART_CR1_RE; // Enable transmitter and receiver USART2->CR1 |= USART_CR1_UE; // Enable USART2 } void usart1SendChar(char ch) { while ((USART1->SR & USART_SR_TC) == 0); // Wait until transmission complete USART1->DR = ch; } void usart2SendChar(char ch) { while ((USART2->SR & USART_SR_TC) == 0); // Wait until transmission complete USART2->DR = ch; } void USART1_IRQHandler(void) { if (USART1->SR & USART_SR_RXNE) { char ch = USART1->DR; usart1SendChar(ch); // Echo back } } ``` 说明: usart1Init()和usart2Init()函数用于初始化USART1和USART2。我们将PA9和PA2配置为USART1_TX和USART2_TX,将PA10和PA3配置为USART1_RX和USART2_RX。我们选用了波特率为115200,一个停止位,无校验位。 usart1SendChar()和usart2SendChar()函数用于向USART1和USART2发送一个字符。 main()函数中,我们定义了一个char变量ch,用于存储USART1接收到的字符。同时,我们将这个字符发送到USART2中。注意,发送前需要等待前一个字符传输完成(等待USART_SR_TC标志位被置位)。 当USART1接收到一个字符时,我们将这个字符发送回USART1,用于回应。我们还可以在此处添加更多的处理代码。例如,将接收到的字符存储到数组中、将其传输到闪存中等等。 在我们的示例中,我们没有添加错误处理和超时处理。在实际使用中,这些问题可能需要考虑。另外,由于它是一个简单的示例,我们可能没有使用操作系统或RTOS。因此,需要在接收和发送时注意上下文切换的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

里晓山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值