SRv6(BE)-原理介绍+报文解析+配置示例

这篇具有很好参考价值的文章主要介绍了SRv6(BE)-原理介绍+报文解析+配置示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。

因此本文将以SRv6 BE场景下报文交互过程为例,以详细介绍SRv6。

  • 关于SR-MPLS的场景介绍,可参见博客SR-MPLS(BE)-原理介绍+报文解析+配置示例
  • 关于SRv6-TE的场景介绍,可参见博客SRv6 TE Policy场景-原理浅谈及配置示例
  • 关于SRv6扩展介绍内容,可参考博客SRv6扩展阅读-故障保护+Flex-Algo+G-SRv6+网络切片

关于SRv6的相关资料,可参考如下RFC:

  • 2017-RFC8200-Internet Protocol, Version 6 (IPv6) Specification
  • 2018-RFC8402-Segment Routing Architecture
  • 2019-RFC8669-Segment Routing Prefix-SID Extensions for BGP
  • 2020-RFC8754-IPv6 Segment Routing Header (SRH)
  • 2021-RFC8986-Segment Routing over IPv6 (SRv6) Network Programming
  • 2021-RFC9012-The BGP Tunnel Encapsulation Attribute
  • 2022-RFC9252-BGP Overlay Services Based on SRv6
  • 2022-RFC9256-Segment Routing Policy Architecture

IGP对SRv6的扩展支持参考RFC

  • 2016-RFC7981-IS-IS Extensions for Advertising Router Information
  • 2019-RFC8665-OSPF Extensions for Segment Routing
  • 2019-RFC8666-OSPFv3 Extensions for Segment Routing
  • 2019-RFC8667-IS-IS Extensions for Segment Routing
  • 2023-RFC9352-IS-IS Extensions to Support SRv6

其他相关扩展功能还有

  • 2008-RFC5286- Basic Specification for IP Fast Reroute: Loop-Free Alternates
  • 2012-RFC6571-Loop-Free Alternate (LFA) Applicability in Service Provider (SP) Networks
  • 2015-RFC7490-Remote Loop-Free Alternate (LFA) Fast Reroute (FRR)
  • 2020-RFC8924-Service Function Chaining (SFC) Operations, Administration, and Maintenance (OAM) Framework
  • 2022-RFC9259-Operations, Administration, and Maintenance (OAM) in Segment Routing over IPv6 (SRv6)
  • 2023-Internet-Draft (active)-Topology Independent Fast Reroute using Segment Routing
  • 2023-Internet-Draft (active)-Enhanced Topology Independent Loop-free Alternate Fast Re-route
  • 2023-Internet-Draft (active)-Topology Independent Fast Reroute using Segment Routing
  • 关于 SRv6 工作原理和相关概念的相关介绍可参考博客SRv6技术课堂(一):SRv6概述
  • 关于 SRv6 可靠性方案 SRv6 Ti-LFA 的相关介绍可参考博客SRv6技术课堂:SRv6可靠性方案
  • 关于 SRv6 Endpoint Behaviors 和 Segment Types 的字段定义可参考IANA发布的Segment Routing

自动换行
SRv6还存在大量相关RFC,感兴趣者可查阅相关资料。

Note:第一章主要简介了SRv6内容。有相关基础可以直接阅读第二和三章节。
个人能力有限,敬请各位指导。

目录

1.SRv6概念

1.1.SRv6是什么

SRv6(Segment Routing v6,基于IPv6转发平面的段路由)是基于源路由理念而设计的在网络上转发数据包的一种协议。其核心思想是将报文转发路径切割成不同的段,再为其分配SID(Segment Identifier,段标识符)进行标识从而以段指导报文转发。
SR-MPLS基于MPLS转发平面
SRv6的一个重要特点是不再使用LDP/RSVP-TE协议,也不需要MPLS标签,简化了协议。
SRv6基于Native IPv6进行转发。Native IPv6指的是普通的IPv6报文。SRv6是通过IPv6扩展报文头来实现的。普通的IPv6设备也可以识别SRv6报文(其实是识别IPv6报文)。SRv6设备能够和普通IPv6设备共同部署,对现有网络具有更好的兼容性。

这就是SR的Segment概念,例如在SR网络中End节点可以支持SR路由能力,而对中间节点只要求进行普通的IPv6报文转发即可。

1.2.SRv6特点

SRv6原理简介:SRv6主要是利用的IPv6的扩展头部。在扩展头部中携带了“IPv6地址(被称为SID)”,利用这个IPv6地址来指导支持SRv6的设备对报文进行报文转发。该IPv6携带了报文的处理动作。
SRv6可编程:SR的设计理念在于对路径进行分段(Segment)以及在起始节点对路径进行排序组合(Segment List),确定出行路径。例如可以在SRH头部中(IPv6扩展头的一种),携带多个SID。每个节点设备处理不同的SID,从而严格规定报文的转发路径实现可编程。
传统路由网络如果需要指定路径则需要全网统一规划路由,这通常是难以实现的。

2.SRv6术语

2.1.SRH简介

SRH也即(Segment Route Header)是IPv6的扩展头。
如下是IPv6的头部信息
SRv6(BE)-原理介绍+报文解析+配置示例Version:固定为6表示IPv6。
Traffic class:类似IPv6的TOS,用于QOS为报文分配优先级。
Flow Label:流标签。该字段用来标记 IP 数据包的一个流。
Payload Length:IPv6有效载荷的长度,包括扩展头长度。
Next header: IPv6 基本报头后的那一个扩展报头的信息类型。一个IPv6可以有多个扩展头,通过在扩展头中指定下一个头部信息
Hop limit:跳数限制。与IPv4的TTL作用相同。
Source Address:IPv6源地址。
destination Address:IPv6目的地址。
Extension Header:扩展头。类型由Next header定义。

IPv6的Next Header
2017年的RFC8200定义了多种扩展头,这里对其进行简介
1@逐跳选项报头(Hop-by-Hop Options header,Next Header=0)
该报头主要用于为在传送路径上的每跳转发指定发送参数,传送路径上的每台中间节点都要读取并处理该字段。(每台IPv6都需要处理的参数)

@:其应用场景可包括用于巨型载荷;用于路由器提示;用于资源预留。在SR的5G网络切片场景下,也会用到该报头。主要用于差异化服务。关于 SRv6 在网络切片方面的应用可参考博客SRv6扩展阅读-故障保护+Flex-Algo+G-SRv6+网络切片
@:RFC8200规定逐跳选项报头必须紧跟在 IPv6 标头之后。

2@目的选项报头(Destination Options header,Next Header =60)
目的选项报头携带了一些只有目的节点才会处理的信息。目前,目的选项报文头主要用于移动lPv6。
3@路由报头(Routing header,Next Header =43)
路由报头和IPv4的Loose Source and Record Route选项类似,该报头能够被lPv6源节点用来强制数据包经过特定的路由器。
4@分段报头(Fragment header,Next Header =44)
同IPv4一样,IPv6报文发送也受到MTU的限制。当报文长度超过MTU时就需要将报文分段发送,而在IPv6中,分段通过分段报头来实现。
5@认证报头(Authentication header,Next Header =51)
该报头由IPSec使用,提供认证、数据完整性以及重放保护。它还对IPv6基本报头中的一些字段进行保护。
6@封装安全净载报头(Encapsulating Security Payload header,Next Header =50)
该报头由IPSec使用,提供认证、数据完整性以及重放保护和IPv6数据报的保密,类似于认证报头。

关于IPv6扩展头,RFC8200给出了如下说明
1@:强烈建议当数据包出现多个报头时,应当按照以上顺序插入。但也允许节点以任意顺序处理收到报文中的扩展标头。
2@:封装安全净载报头后还可根据需要插入目的选项报头。详细的报头插入原则可查看相关资料。
3@:目的选项报头最多出现二次,其他报头最多出现一次。
4@:如果定义了其他扩展标头,则必须指定它们相对于上面列出的标头的排序约束。

IPv6的SRH
SRH实际是43号IPv6扩展报头路由报头的一种。
SRv6(BE)-原理介绍+报文解析+配置示例Next Header:1字节。描述后续头部类型。可以正常报文也可以是扩展头。这里携带的就是ICMPv6报文。
Length:1字节。自己扩展头的长度。
Type:1字节。标识路由报头的类型。4表示SRH
Segment Left:1字节。SRv6激活的SID。前文提到类似于MPLS的多层标签,SRH可以携带多个SID。这里用于标识当前节点应使用的SID号。该字段与C语言的指针有点类似。
SRv6的SID可以形象理解为IPv6网络中的标签
Last Entry:1字节。
Flags:1字节。

当前在RFC8754中对该Flags定义为未来使用,传输时必须置0并在接收时忽略该Flags字段。
在RFC9259中对该Flags进行如下定义。
SRv6(BE)-原理介绍+报文解析+配置示例//目前仅定义SRv6 O-bit,O-bit用于指示OAM处理。若O-bit置位,则每一个SRv6 Endpoint节点需要复制一份数据包并打上时间戳,然后上送复制报文和时间戳到控制平面处理。为了防止重复处理报文,控制平面无需响应IPv6上层的协议,比如ICMPv6 Ping&Tracert。通常在ping ipv6-sid时会携带该O-bit。
关于SRv6的另一个OAM实现是通过End.Op SID来实现连通性检测或连通质量检测,这里不在进行相关介绍。

Tag:2字节。用于对数排包分组。可以实现基于组的策略。
Address:16字节,这一字段也叫 Segment List []。IPv6地址,也即SRv6的SID。一般有多个,只是这里只有一个 SID=SL[0]。每有一个SID增加16字节
有一个需要说明的是这个SID列表 Segment List 从上往下依次为 SL0,1,2,…。在使用时,首先使用的是最低层的 SL,而传统 MPLS 是从外层开始使用剥离。(正好相反)
点击此处回到目录

2.2.SRv6的SID

Segment 用于指导报文转发,总的来说可分为3类。分别是 Prefix Segment、Node Segment、Adjacency Segment。而针对 Segment 的标识 SID(Segment ID)也有如下三种。

分类 生成方式 作用
Prefix SID 手工 标识目的地址前缀。
简单理解可以用于标识目标网络
Node SID 手工 标识节点设备。
简单理解可以用于标识设备,例如OSPF的router-id
Adjacency SID 手工或协议动态分配 标识网络邻接。

Prefix SID/Node SID 和 Adjacency SID 可以分别类比于传统IP转发中的目的地址出接口
SR-MPLS的SID是与MPLS概念相同的标签,SRv6的SID则可以单纯理解为IPv6地址
SRv6的SID=Locator+Function+Arguments
Locator:提供IPv6的路由能力,报文通过该字段实现寻址转发。此外,Locator对应的路由也是可聚合的。(用于传递报文的路由前缀)
Function:用来表达该设备指令要执行的转发动作,不同的转发行为由不同的Function来表达。(比如可以指定邻居转发或按节点解封装SRH按链路转发,传统L3VPN是按所建立的LSP转发)
Arguments:可选字段,是对Function的补充。这些参数可能包含流、服务或任何其他相关的信息,目前应用较少。

(SID的每个字段都是可变长的,并且可人为指定也可动态分配。并且一个SRH可以包含多个SID)

2.3.SRv6的其他概念

Segment Routing domain (SR domain):一组参与源路由模型计算的节点。这些节点可以连接到相同的物理基础设施(例如,服务提供商的网络)。如果部署了多个协议实例,则SR域通常包括网络中的所有协议实例。

SR Global Block (SRGB):SR域中的全局Segment的集合。如果一个节点参与多个SR域,则节点为每个SR域分配一个SRGB。
@在SR-MPLS中,SRGB具有节点的本地属性,并且标识为全局Segment保留的一组本地标签。在里面SR-MPLS,强烈推荐在SR域内的所有节点上使用相同的SRGB。这样做可以简化操作和故障排除。
@在SRv6中,SRGB是SR域中全局SRv6 SID的集合。

SR Local Block (SRLB):SR节点的局部属性。如果一个节点参与多个SR域,则节点为每个SR域分配一个SRLB。
@在SR-MPLS中,SRLB是为本地段保留的一组本地标签。
@在SRv6中,SRLB是为本地SRv6 SID保留的一组本地IPv6地址。在控制器驱动的网络中,一些控制器或应用程序可以使用控制平面来发现本地段的可用集合。

SR Policy:一个有序的Segments列表。用于将数据包与指定的路径相关联。Segments列表是基于目的地和一组优化目标和约束(例如,延迟、亲和性、SRLG等)来计算的。计算可以是本地的,也可以委托给PCE服务器。
SR Policy的下发可以手工配置也可以通过NETCONF或PCEP协议。

PUSH:PUSH动作包括在Segments列表的顶部插入一个段。类似于MPLS的标签压入。
NEXT:当活动Segments执行完成时,NEXT动作是由下一个Segments的检查组成的操作。下一个分段变为活动分段。在SR-MPLS中,NEXT指的是顶部标签的POP。在SRv6中,NEXT指的是从SRH到IPv6报头的目的地地址的下一段的拷贝。
CONTINUE:Segments未执行完成时或数据包处于Segments中执行时。在SR-MPLS中,CONTINUE指的是顶部标签的SWAP。在SRv6中,CONTINUE指的是IPv6目的地址的转发。

点击此处回到目录文章来源地址https://www.toymoban.com/news/detail-456428.html

3.SRv6(BE)跨域场景介绍

根据之前的介绍可以知道SRv6是一种新型的隧道技术。IPv6地址(也即SID)替代 MPLS 的标签用于公网数据传递。
这里以 L3VPN 跨域 BE 场景为例子进行 SRv6 技术的介绍。实际上 SRv6 方案也可用于承载 EVPN 传递私网路由的场景。

3.1.SID介绍

SRv6的SID主要是由 Locator路由前缀+Function+Argument 组成。
Locator:网络节点的标识。是IPv6路由前缀,主要用于路由传递。一个重要特性是可路由。
Argument:SID的可选参数,在双归双活场景下有应用。

3.1.1.Function功能

Function:SID处理的选择动作,指导报文进行转发。Function 比较复杂,这里重点进行介绍。标准文档可参考2021-RFC8986-Segment Routing over IPv6 (SRv6) Network Programming,这里对不同类型进行简单介绍。

End:表示Endpoint SlD,用于标识目的节点(Node)。对应的处理动作为更新IPv6 DA,目的为End SID时正常路由表转发。
End.X:表示三层连接的Endpoint SID,用于标识链路。对应的转发动作是:更新IPv6 DA,从End.x SID绑定的出接口转发报文。
End.DT4:表示PE类型的Endpoint SID,用于标识IPv4 VPN实例。对应的转发动作是:解封装报文,并且查找IPv4 VPN实例路由表转发。等价于IPv4 VPN的标签。
End.DT6:表示PE类型的Endpoint SID,用于标识IPv6 VPN实例。对应的转发动作是:解封装报文,并且查找IPv6 VPN实例路由表转发。等价于IPv6 VPN的标签。
End.DX4:表示PE类型三层连接的Endpoint SID,用于标识IPv4 CE。对应的转发动作是:解封装报文,并且查找绑定CE SID的三层接口转发。
End.DX6:表示PE类型三层连接的Endpoint SID,用于标识IPv6 CE。对应的转发动作是:解封装报文,并且查找绑定CE SID的三层接口转发。

其实Function有一定的命名规则:
End:是最基础的Segment处理动作,中止当前动作。处理时将SRH的Segment Left字段-1,Segment List复制到IPv6的Destination Address中。
D:Discapsulate。不仅解封装IPv6扩展头还解封装IPv6报文。
X:指定出接口进行转发。
T:Table。查找路由表转发。
V:Vlan。查找vlan转发。
U:Unicast。查找单播Mac表转发。
M:Multicast。查看组播表转发。
B6:指定应用SRv6 Policy。
BM:指定应用SR-MPLS Policy。

其余 Function 动作可查阅相关资料。

3.1.2.Flavors附加行为

Flavors 是为了增强 SRv6 Segment 而定义的附加Function行为。这些附加行为是可选项,它们将会增强SRv6 Segment的执行动作,满足更丰富的业务需求。2021年发布的RFC8986-Segment Routing over IPv6 (SRv6) Network Programming定义了如下三种Flavors。
PSP: Penultimate Segment Pop of the SRH:在倒数第二个Endpoint节点执行移除SRH操作。类似于MPLS的倒数第二跳弹出。但是这里是段的概念,每个段之间可能经历了多台设备。
USP: Ultimate Segment Pop of the SRH:在倒数第一个Endpoint节点执行移除SRH操作
USD: Ultimate Segment Decapsulation:在倒数第一个Endpoint节点执行移除IPv6头部操作

设备如何知晓对报文的Function处理动作:
在报文中携带SID时,会进行SID标识。例如在ISIS的LSP报文的SRv6 Locator型SubTLV中会携带Code字段进行标识具体是哪种Function,以及是否需要进行Flavors行为。
控制面:IGP会将SID在全网通告(还有BGP的相应动作)。

例如《3.2.1.IGP报文分析》中展示的ISIS LSP携带的SRv6 Locator-Type=27就携带了PSP型的End SID。
RFC8402中也表明BGP也可作为控制面传递SID。

转发面:End节点收到DIP=SID的IPv6报文后,根据该SID相应的Function字段进行相应报文转发行为。
(对于该IPv6报文收到后,会进行SRH的SID替换DIP。这一过程在3.3章节进行详细介绍)。点击此处到达第3.3章节

和L3VPN的小区别
在L3VPN中,标签不仅作为数据转发的指导也承载了对私网租户的标识作用。
SRv6不存在L3VPN的标签,而是由SID代替了标签。SID的Locator本身作为IPv6路由前缀可以指导数据转发。而丰富的Function不仅可以承载对私网的标识,而且可以进一步指导报文的处理动作。相比于Label,业务承载类型和业务处理动作的丰富性都大大提高!!

3.2.SID地址的传递(IGP报文分析)

3.2.1.IGP报文分析

与SR-MPLS相同,SR的SID都可由IGP协议动态生成。在IGP协议的收敛完成的同时,标签转发路径LSP也随之建立。
本场景下以ISIS作为Underlay协议进行SID信息的传递。本场景下ISIS协议涉及SRv6功能的有如下三种TLV:Router capabilitySRv6 LocatorExtender IS reachability。接下来对其进行介绍:
自动换行
Router Capability-Type=242由RFC7981介绍
SRv6(BE)-原理介绍+报文解析+配置示例
Router Capability:T=242。
Type:1字节。取值242。
Length:1字节。取值5-255。
Router ID:4字节。
S-bit:1bit。置1时,表示Router capability整个ISIS域泛洪。
D-bit:1bit。UP/Down bit,置1时,表示从Level-2区域泄漏到Level-1区域。并不得在泄露至Level-2区域水平分割。

并在该TLV中标识携带
SRv6 capability :T=25。由RFC9352介绍。
OAM-bit:Operations, Administration, and Maintenance功能。
其中标识了路由器对SRv6的支持能力。Node Maximum SID Depth:T=23。
Router capability作用在于协商对SRv6的支持能力,因为设备对SID的处理程度是有限制的。这一限制主要在于芯片处理能力的限制。
Maximum Segment Left:对Segment Left字段最大支持处理能力;Maximum End Pop:节点POP能力;Maximum T Insert:最多插入SID数;Maximum T Encaps:最多的封装SID数;Maximum End D:执行End.D动作时,可指定SID最大值。
自动换行
SRv6 Locator-Type=27由RFC9352介绍SRv6(BE)-原理介绍+报文解析+配置示例
SRv6 Locator:T=27。主要用于传递SID信息,建立LSP。
Topology ID:12bit。表示所承载IGP协议对网络的支持能力。
SRv6(BE)-原理介绍+报文解析+配置示例Algorithm:1字节。表示所使用的路由算法。目前只有两种0和1:0表示SPF,1表示严格SPF。

由RFC8402介绍严格SPF表示结果严格按照SPF算法执行忽略任何可能的覆盖SPF决策的本地策略。如果使用严格SPF通常要求全网都使用严格SPF。

Locator Size:1字节。和Locator共同表示了SID的Locator或路由前缀。
SubTLV=SRv6 End SID:Code=5。这里的End SID用于标识节点的SID。
SRv6 Endpoint Function:2字节。表示Endpoint Behavior行为。

而PSP指的是Flavors行为(用于增强SRv6 Segment的执行动作)
PSP表示在倒数第二个End节点剥离SRH
SRv6(BE)-原理介绍+报文解析+配置示例
这里的Local-sid也即节点SID。此外在Extended IS reachability中携带了邻居SID。

自动换行
Extended IS reachability-Type=22由RFC5305介绍
SRv6(BE)-原理介绍+报文解析+配置示例
Extended IS reachability:T=22。主要用于传递SID信息。这里主要传递的是邻居SID End.X SID表示按链路进行传递。
SRv6(BE)-原理介绍+报文解析+配置示例 并在该TLV中标识携带Sub TLV
SRv6 LAN End.X SID :Code=44。由RFC9352介绍。
B-bit:Backup备份标志位。如果置位表明SID受保护,使用IPFRR等功能。
S-bit:Set标志位。如果置位表明SID指的是一组相邻(因此也可以分配给其他相邻)。
P-bit:Persistent永久标志位。如果置位表明SID是永久分配的,即SID值在路由器重新启动和/或接口波动之间保持一致。
Algorithm:1字节。表示所使用的路由算法。目前只有两种0和1:0表示SPF,1表示严格SPF。

由RFC8402介绍严格SPF表示结果严格按照SPF算法执行忽略任何可能的覆盖SPF决策的本地策略。如果使用严格SPF通常要求全网都使用严格SPF。

Weight:1字节。RFC8402中主要描述了用于负载分担场景。
Endpoint Behavior:2字节。对于不支持或不识别的Behavior将进行忽略。
RFC8986中主要描述了所定义的几种End节点行为。本文档的3.1.1.章节对其进行了相关描述。
SID:16字节。封装通告的SRv6 SID。
Sub-sub-TLV-length:1字节。所使用的sub-sub- TLVs字节数,也即之后还可根据选择携带相应的sub-sub- TLVs。

在IGP分发SID收敛完成后,BGP为CE分配Prefix-SID即可:由RFC8669介绍。
SRv6(BE)-原理介绍+报文解析+配置示例
Extended Community:传递VPN的RT。
BGP Prefix-SID:为相应的节点配置Prefix-SID。目前wireshark4.0.1暂不支持对该字段的识别。但是可以隐约识别出:3001:1:1:1::。
MP-NLRI:传递相应的VPNv4路由192.168.1.0/24(可以通过Prefix Length=112进行判断),下一跳指定为1111::1111。

点击此处回到目录

3.2.2.SID扩展阅读

BGP-SID简介:
RFC8402的page-9中介绍BGP也可作为Underlay网络传输SID地址信息,也即BGP-based distributed control plane此时BGP Segments可分为:BGP-Prefix Segment和BGP Peering Segments。
BGP-Prefix Segment:SR域中的BGP-Prefix segment具有全局属性并且等价于IGP-Prefix Segment。
BGP Peering Segment:在BGP Egress Peer Engineering(EPE)的概念中,启用了EPE的出口节点可以通告与其所连接的对等体相对应的分段。这些Segment称为BGP Peering Segment或BGP peering SIDs。它们用于表达SR域间路径。

而BGP Peering Segment则又可分为:PeerNode SID、PeerAdj SID和PeerSet SID。
PeerNode SID:本地Segment(local segment),SR动作为NEXT。segment相关的对等体Node。类似于LDP的标签SWAP。
PeerAdj SID:本地Segment(local segment),SR动作为NEXT。接口连接与Segment相关的对等体。
PeerSet SID:本地Segment(local segment),SR动作为NEXT。同一个组的对等体集合,通过任意连接的接口进行负载分担。

Binding Segment:
Binding Segment称为绑定Segment,又称为粘连Segment。主要用于SID的扩展,网络不透明和服务独立性。

通常由于设备的芯片等硬件的限制,SRH所能携带的SL通常是有限的。当进行一个大范围多个 Segment 的网络时,就无法一次包含所有的 SID。此时可通过 SID 映射的方式进行扩展。
此外与 SR Policy 强相关的 Binding Segment 也可以实现多种策略路由。

3.3.SRv6的场景分析

SRv6可以分为控制面和转发面。通俗意义上控制面通常指的是路由信息生成,而转发面则指的是具体的流量传输。
例如我们所说的传统 MPLS L3VPN 的控制面是 MPLS(LDP基于路由表生成标签)。转发面则是依照形成的 LSP 进行流量传递。
普通的 L2VPN 没有控制面,而是通过2层的 MAC/ARP 泛洪学习来导通的。目前基于 MP-BGP 的 L2VPN EVPN 以 MP-BGP 作为控制面传递 5 种 EVPN 路由实现了转控分离。(目前EVPN路由已标准化了8种。)

接下来以图示为例进行相应介绍:
CX1-CX6用于公网隧道建立(CX1-3为AS100,CX4-6为AS200。CX2和CX5可以支持SRv6功能,也可以不支持);
AR1AR2分别作为VPN的CE路由器;
NE路由器可用于模拟SDN控制器(SRv6通常与SDN技术相关联)SRv6(BE)-原理介绍+报文解析+配置示例AR1向AR2通信:

控制面:
1@控制面上首先应进行IPv6网络的构造,通常CX1-6的每台设备都需要进行IPv6的地址改造。
2@CX1-6 都运行 IGP 协议,同时应使能 SRv6 功能。自动或手动指定相应的SID信息,由IGP协议进行泛洪。
SRv6 的一个强大之处在于不要求所有网络节点都支持SR功能。并且工程应用上的设备通常跨越多个AS。
因为在使用时节点设备实际上执行的IPv6的普通路由转发,只有支持SRv6功能的End节点才处理SRH头部信息。(TLV格式构造报文的一个好处是,可以忽略自己不支持的TLV。)

3@在IGP完成SID的泛洪同步后,需要建立BGP邻居传递相应的 SID 和 VPN私网路由。CX1 和 CX3 建立iBGP,CX4 和 CX6 建立iBGP,CX3 和 CX4 建立 eBGP。如果有控制器的加入,还需另外和控制器NE建立BGP-LS 邻居。
(根据实际的网络规划决定是否需要建立 BGP 的 RR 反射器。)

传统MPLS L3VPN场景下,PE 端 BGP 的一个作用在于生成 MP-BGP 标签作为私网VPN的标识。而SRv6场景没有单纯的标签概念,PE 端只需将相应的 VPN 实例与 SID 关联即可。而 SID(Function) 中自动包含的相应处理动作。
(当然还是需要 BGP 传递私网 IPv4 路由,只是下一跳指向了IPv6。RFC9252)

SDN控制器的加入为SRv6提供了可编程功能:
SDN控制器通过建立BGP邻居,下发BGP SID属性(BGP-LS等)。从而指导相应的流量行为。
目前的SDN控制器可以达到在底层可达的网络中(underlay)自动下发配置,更加简化了网络变动的工作量。

SRv6的一个重要特点:跨域
传统MPLS L3VPN中,经常有跨域场景出现。而通常 MPLS 是无法连续的为非AS域的设备分配标签(一般来说LSP的连续通常只能在一个AS内)。针对这种情况MPLS 提出了3种方案:OptionA(各自 AS 当成对端的 CE 设备转发), OptionB(ASBR之间的MP-eBGP分配MPLS单层标签),OptionC(有两种方案可分别产生2层和3层标签,相同点在于内层都是目标CE的私网标签)。
SRv6场景中,不存在传统意义的标签概念(标签被SID/IPv6地址替代)。控制面传递的是 SID/IPv6地址。也即只需要每台设备仅知道去往目标 CE 的 IPv6地址即可。

转发面:
在转发面上,实际是 IPv6 的路由转发。只是 IPv6 的报文携带了相应的 SRH,SRH 的处理由所支持的设备来完成。

1@源节点收到AR1传递过来的数据流量。查表发现下一跳为CX6。去往CX6的地址可以迭代入相应的 SRv6 隧道。(实际使用时可能有多种隧道并行)
2@源节点对该报文进行封装。外层封装 IPv6 报头,MAC 取相应的下一跳地址。同时 IPv6 报头插入相应的 SRH 头部信息。
DIPv6 地址取 SRH 的 Segment List 字段的最大值,发送时 Segment left-1。
3@中间节点对相应报文进行2层解封装。
如果支持 SRv6 功能,则取 SRH 字段中 Segment left 对应 Segment List 的 SID/IPv6 地址,替换为 DIPv6 地址,随后 Segment left-1 发送。
点击此处回到SRH报文介绍。
这一行为与MPLS网络中间节点设备的标签替换非常类似
如果不支持SRv6功能,则只查找IPv6路由表比对该SID进行转发。
4@目地节点对相应报文进行解封装。目的节点收到该IPv6报文,可以识别该IPv6地址(也是SID)相应的Function。例如可以是End.DT4型SID,此时就会将SRH和IPv6同时剥离暴露出里边的IPv4报文查找IPv6路由表转发。

这里未提到的一点是Flavors附加行为。
具有Flavors附加行为的SID可以进行倒数第二段弹出,或弹出SRH弹出IPv6等操作。
SRv6的Segment概念可以理解为处理SRH的两个最近节点。在这两个End之间只需查表转发IPv6。

具体转发时,SR可以分为不同的SID类型(不同的SID具有不同的行为)。
例如可以指定链路转发,可以仅查路由表的节点转发。
而添加链路检测的SDN网络,可以根据需求实时下发SID更改转发情况。因此选择性非常强。
实际SRH携带情况还需以实际为准

点击此处回到目录

3.4.L3VPN for IPv4 over SRv6 BE

这里以 SRv6 BE 为例进行介绍。SRv6 BE 可能更像一个加强版的 MPLS 转发。

考虑到设备所支持情况,这里在CX1、CX2和CX3之间建立AS=100,并且在CX3和CX4之间建立eBGP邻居关系AS200。
1@这里只提供了PE设备配置,有能力者可自行进行其他P和PE设备的配置。
有需要者可私信联系提供模拟器源文件及配置。

SRv6(BE)-原理介绍+报文解析+配置示例这里以CX3为例进行配置介绍:

sysname CX3
#
segment-routing ipv6
 locator [CX3] ipv6-prefix 3003:1:1:1:: 64
#

设置 SRv6 的 SID。
//指定名为 [CX3] 的 locator 3003:1:1:1:: 且前缀为64。

设备可自动根据定义的长度进行选择。例如此时Locaor指定为64,Function未指定则动态分配那么Function为128-64。Function可以静态指定也可以动态指定。
例如
locator [CX3] ipv6-prefix 3003:1:1:1:: 64 static 32
opcode ::1111 end
//此时为64的Locator,32的人为分配Function,32的动态Function指定。
//(Arg参数未指定则该SID完全由Locator和Function组成。)

isis 10
 is-level level-2
 cost-style wide
 network-entity 49.0000.0000.0003.00
 #
 ipv6 enable topology standard
  segment-routing ipv6 locator CX3
 #
 #
//指定IGP携带SRv6相关信息,并且未定义的SID长度部分由IGP自动分配。
bgp 100
 router-id 3.3.3.3
 peer 2003::4 as-number 200
 peer 2222::2222 as-number 100
 peer 2222::2222 connect-interface LoopBack1
 #
 ipv6-family unicast
  undo synchronization
  network 1111::1111 128
  network 2222::2222 128
  peer 2003::4 enable
  peer 2222::2222 enable
  peer 2222::2222 next-hop-local
 #
 ipv4-family vpnv4
  undo policy vpn-target
  peer 2222::2222 enable
  peer 2222::2222 prefix-sid
 #
#
//使能VPNv4传递BGP Prefix-SID信息。
//需要宣告了AS内部的loopback用于建立BGP邻居。

3.5.状态查看

SID信息SRv6(BE)-原理介绍+报文解析+配置示例Local-sid:描述了节点的SID。包括End SID、End.x SID和End.DT4等。
Locator:描述了本地定义的Segment信息。
3.2.章节(点击可达)已做过体现,这里不在举例。

VPN路由信息SRv6(BE)-原理介绍+报文解析+配置示例此处可看到私网路由的下一跳为 IPv6 地址。

私网流量传递时的报文
SRv6(BE)-原理介绍+报文解析+配置示例这里直接携带的是 CX4 的 End 型 SID 地址,直接查 IPv6 路由表转发。因为只有1个Segment,这里携带的是目的选项报头而非SRH。

具有SRH的报文
使用ping ipv6-sid -a 1111::1111 4444::4444可以进行相应SID可达性检查。
SRv6(BE)-原理介绍+报文解析+配置示例IPv6 的 Next Header 为43号路由报头,路由报头类型为4表示SRH。同时路由报头的 Next Header 为58标识携带 ICMPv6 作为payload。

点击此处回到目录

4.SR Policy的扩展介绍

主要参考2022-RFC9256-Segment Routing Policy Architecture进行描述。
此时仅进行简单介绍,详细的取值和定义可查阅相关资料。

有关于SRv6-TE的场景介绍,可参见博客SRv6 TE Policy场景-原理浅谈及配置示例

4.1.SR Policy和Candidate Path

1@:SR Policy必须通过元组<Headend,Color,Endpoint>来标识。Color和Endpoint共同描述了到目标的信息。

元组是一个程序概念,可以理解为数据结构的最小单元。只是这个单元有三个要素/成员。
Headend:实例化或实施策略的节点。也即IPv4/IPv6地址,在SR domain中全局唯一。
Color:非0的32-bit整数。将SR策略与意图或目标(例如,低延迟)相关联。
Endpoint:policy的目的。同样即IPv4/IPv6地址,在SR domain中全局唯一。特定情况下可为未指定地址:0.0.0.0或::。

2@:SR Policy与一个或多个 Candidate Path 候选路径相关联。候选路径可通过 Path Computation Element Communication Protocol (PCEP) 或BGP SR Policy协议或手工传递相应的信令。

3@:候选路径可以是动态的、显式的或复合的。
动态的候选路径表示特定数据平面(即SR-MPLS或SRv6)的优化目标和一组约束。Headend可借助PCE对优化问题动态的生成SL或SL的集合。
显式的候选路径表示为SL或SL的集合。
复合的候选路径充当对SR Policy进行分组的容器。每个策略都具有显式的候选路径和/或具有潜在不同优化目标和约束的动态候选路径的组合,可用于对分组流进行负载平衡的引导。

简单来说候选路径就是Segment List,用于标识的流量经过的路径。并且如果动态候选路径与SL相关联,则SID报文中的weight有效,并默认置为1用于负载分担。
自动换行
SR Policy可包含/继承其他SR policy,此时要求子父SR Policy有如下要求:
@:子父SR Policy的endpoints必须相同。
@:子父SR Policy的Color必须不同。
@:父SR Policy不可使用复合的候选路径。

4@:至少有一个Candidate Path 候选路径,SR Policy才可生效。

因此SR Policy的关键在于候选路径的选择。
CP的标识:候选路径的标识主要有以下原则:

@:前文提到SR Policy可有多个候选路径,这里要说明的是一个候选路径只为一个SR Policy服务。一个候选路径不可共享给其他SR Policy。
@:SL不可用于区分候选路径,即使他们一样。SL是候选路径的一个属性。
@元组<Protocol Origin,Originator,Discriminator>唯一标识候选路径。
@:候选路径使用ASCII[RFC0020]字符(即0x20到0x7E)的符号名称发信号,以用作用户友好属性,用于调试和故障排除。此类符号名称不得被视为候选路径的标识符。

Protocol-Origin of CP:8-bit,候选路径的协议起源。

目前RFC9256建议PCEP协议取10;BGP SR Policy协议取20;配置取30。
该值可作为同等条件下候选路径选择依据之一。

Originator of CP:160-bit,候选路径的始发者用于识别节点。该节点在Headend上提供或用信号标识候选路径。

Originator主要由ASN(4字节)和Node Address(16字节)进行标识。当AS Number取2字节时,高bit置0。同样的当使用IPv4地址时,映射到低32-bit位而高bit置0。

Discriminator of CP:32-bit,候选路径在来自特定Protocol-Origin的SR policy的上下文中唯一地标识。

候选路径的唯一标识,与Protocol-Origin相关。不同的Protocol-Origin有不同的选择定义。

Preferencer of CP:32-bit,用于为SR Policy选择最佳候选路径。

越大越优,默认100。PCEP协议和BGP SR Policy协议对优先级的定义可查阅相关文档。

Active CP:当候选路径可用并被选择为最优时称为Active CP。每一次的路径信息改动必须重新选举Active CP。选举原则如下

@:比较Preferencer,越大越优
@:比较Protocol-Origin,越大越优。如果都是手工配置的,优选已经存在的。
@:比较Originator,越小越优。
@:比较Discriminator,越大越优

SR Policy的实际应用:在SR Policy的实际应用上通常有如下原则:

@:只有可用的SR Policy才能下发到转发面,指导流量执行转发。
@:Active CP必须用于转发被引导到该策略上的流量,但某些情况除外,如Fast ReRoute快速重新路由。
@:如果一组SL与策略的Active CP相关联,则转向是按流的,并根据每个SL的相对权重加权ECMP(W-ECMP)。当复合候选路径处于活动状态时,引导到每个组成SR策略的流的分数等于每个组成SR政策的相对权重。w/Sw。
@:加权负载平衡的准确性取决于平台实现。

SR Policy的priority:取值0-255,越小优先级越高。默认128。SR Policy的priority可以用在如下场景:

当拓扑发生改变时,每一条SR Policy势必要重新计算Active CP。priority可用于指导优先进行计算的SR Policy。
当使用非默认的priority时,也用于选举。

SR Policy的应用举例
有如下场景1:
SRv6(BE)-原理介绍+报文解析+配置示例

SR Policy1有候选路径CP1和CP2,按上文介绍应选择CP1作为Active CP。并且在引导数据流量时,根据flow-based哈希到SL1的流量应为W1/(W1+W2)。

有如下场景2:
SRv6(BE)-原理介绍+报文解析+配置示例SR Policy100为复合Policy,有父SR Policy color1和SR Policy color2。并且依照上文定义,父SR Policy color1和SR Policy color2都不包含复合CP。此时在父SR Policy color1上进行per-flow的哈希流量应为W1/(W1+W2)。

这里的流量还是根据转发表里的SL来。

4.2.其他概念和SR Policy的Implement

Segment Routing Database:也即SR-DB。
SR-DB是一个数据库概念,用于说明可能有助于SR Policy计算和验证的各种信息及其来源。SR Policy计算节点(例如,Headend或控制器)通常维护SR-DB。Headend可通过SR-DB验证显式候选路径和动态候选路径。

SR-DB通常包括:
@:IGP拓扑信息
@:Segment Route信息,例如SRGB、SRLB和SID等。
@:TE链路属性,例如TE度量、Shared Risk Link Groups共享风险链路组、attribute-flag属性标志、extended admin group扩展管理组等。
@:扩展TE链路属性,例如延迟、丢包。
@:AS内部拓扑信息。
所连接域的拓扑可以通过IGP、BGP-LS和NETCONF协议获得。非所连接则可通过BGP-LS和NETCONF协议获得。

Segment Types
基于所需的数据平面,可从Segment List构建MPLS标签栈或SRv6 SRH。但是,Segment List本身可以使用不同的Segment Types来指定,并且当前定义了以下内容:

Type A=SR-MPLS Label:与SR-MPLS定义的任何Segment Types相对应的MPLS标签
Type B=SRv6 SID:与SRv6的任何SID行为相对应的IPv6地址
Type C=IPv4 Prefix with optional SR Algorithm:这是一种特殊情况。要求headend将指定的IPv4前缀地址解析为与其前缀SID段相对应的SR-MPLS标签。
Type D=IPv6 Global Prefix with optional SR Algorithm for SR-MPLS:这是一种特殊情况。要求headend将指定的IPv6全局前缀地址解析为与其前缀SID段相对应的SR-MPLS标签
Type E=IPv4 Prefix with Local Interface ID:这是一种特殊情况。要求headend将指定的IPv4前缀地址解析为发起它的节点,然后使用本地接口ID来识别其邻接为点对点链路。
Type F=IPv4 Addresses for link endpoints as Local, Remote pair:这是一种特殊情况。要求headend将指定的IPv4本地地址解析为发起它的节点,然后使用IPv4远程地址来识别所引用的链路邻接。
Type …
Type K= IPv6 Addresses for link endpoints as Local, Remote pair for SRv6

Binding SID of a Candidate Path
相同SR Policy的候选路径应该具有相同的Binding SID。
不同SR Policy的候选路径不得具有相同的Binding SID。

Binding SID of a SR Policy
SR Policy的Binding SID是其活动候选路径的Binding SID。

使用SR Policy导入流量:主要的方式有4种。
通过Active SID:传入数据包具有与头端的本地Binding SID相匹配的Active SID。

举例:头端H
@Active SL<S1, S2, S3>Binding SID B
自动换行
当H收到具有标签/SL为<B, L2, L3>数据包K时,H将进行POP/PHP弹出B并压入<S1, S2, S3>。此时形成<S1, S2, S3, L2, L3>的标签/SL进行相应转发。

Per-Destination的引导:传入数据包与BGP/服务路由匹配,该路由在SR策略上重复出现。

举例:头端H
@从BGP学习到路由R下一跳NColor扩展属性CVPN标签V
@有可用SR Policy P(headend=H,Color=C,endpoint=N),且其有可用候选路径<S1, S2, S3>和Binding SID B
@有BGP policy可匹配到Color扩展属性C并可应用
自动换行
如果满足所有这些条件,H在RIB/FIB中安装R,下一跳设置BSID B的SR Policy P,而非N。当H收到可匹配路由R的数据包K时,H将压入标签栈/SL<S1, S2, S3, V>。

举例:头端H
@从BGP学习到路由R下一跳NColor扩展属性CVPN标签V
@有可用SR Policy P1(headend=H,Color=C1,endpoint=N),且其有可用候选路径<S1, S2, S3>和Binding SID B1
@有可用SR Policy P2(headend=H,Color=C2,endpoint=N),且其有可用候选路径<S4, S5, S6>和Binding SID B2
自动换行
如果满足所有这些条件,H在RIB/FIB中安装R,下一跳设置BSID B的SR Policy P2,而非N。因为优选Color大者。并且当SR Policy P1失效时,继续优选Color大的SR Policy。

Per-Flow的引导:传入数据包根据特定的Flow特征在Forwarding Class转发数组上匹配或递归,根据选中的SR Policy进行转发。

举例:头端H
@有可用SR Policy P1(headend=H,Color=C1,endpoint=N),且其有可用候选路径<S1, S2, S3>和Binding SID B1
@有可用SR Policy P2(headend=H,Color=C2,endpoint=N),且其有可用候选路径<S4, S5, S6>和Binding SID B2
@有指向N的数组/队列A。这一数组/队列称为Forwarding Class,并且有元素0-7。例如A[0],A[1],A[2],…,A[7]。数组/队列A中进行如下定义,使用IGP转发至N的数据流定义为A[0],具有Color=C1映射A[2],具有Color=C1映射A[2]。
@具有相应的Flow分类,例如基于VLAN/TOS/DSCP/IP Destination/IP Source/Port等。并对相应的Flow进行着色Color。
自动换行
如果满足所有这些条件,发往N的数据将进行递归。Entry A(0)将按IGP最短路径转发,Entry A(1)将引导至SR Policy P1,Entry A(2)将引导至SR Policy P2。
需要注意的是,即使走A[0]数组/队列也可压入Prefix-SID进行SL转发。并且其他未匹配或无效匹配的数据走A[0]。
当所有流量都进行A[0]转发时,发往N的转发条目被更新以绕过数组/队列并直接指向其传出接口和下一跳。

Policy-Based的引导:传入的数据包与在SR Policy上引导它们的路由策略相匹配。
头端H可以配置有本地路由策略,该策略覆盖任何BGP/IGP路径并在SR Policy上引导指定的数据包。这包括使用IGP Shortcut等机制,通过SR策略自动路由IGP前缀。

点击此处回到目录

更新

到了这里,关于SRv6(BE)-原理介绍+报文解析+配置示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 广域网技术——SRv6隧道类型及数据转发

    目录 SRv6节点 节点角色 节点行为 SRv6数据转发隧道建立方式 SRv6 BE L3VPNv4 over SRv6 BE EVPN L3VPNv6 over SRv6 BE SRv6 TE Policy SRv6使用IPv6数据平面,基于IPv6扩展头进行扩展实现类似标签转发的处理 SR-MPLS在建立SR-MPLS隧道时,如果有设备不支持MPLS或SR,则就无法建立隧道 SRv6在建立SRv6隧道

    2023年04月16日
    浏览(82)
  • PPP协议原理介绍+报文分析+配置指导-RFC1661

    个人认为, 理解报文就理解了协议 。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。 因此本文将在PPP协议报文的基础上进行介绍。 关于PPP协议基本原理,可参考 RFC1661-The Point-to-Point Protocol (PPP) 。 关于PPP协议的IPv4控制协议,可参考 RFC1

    2024年01月25日
    浏览(39)
  • 智能手机卫星通信(北斗短报文)原理介绍

    1、短报文介绍 北斗短报文通信是一种类似于手机短信的可双向实时与卫星通信的技术,是北斗导航系统附带的一项功能。 由于其地面终端设备简单,体积小方便携带,甚至可以内置于智能手机中,所以在应急通信和海洋运输等行业起着非常关键的作用。 2、短报文分类 全球

    2024年03月23日
    浏览(43)
  • 2.1 - 网络协议 - ARP协议原理,报文解析,抓包实战

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 ARP(Address Resolution Protocol)是 「地址解析协议」 ,可以根据IP地址获取Mac地

    2024年02月07日
    浏览(35)
  • TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式

    目录 一、什么是IP分片 二,为什么要进行IP分片 三、IP分片原理及分析 标志字段的作用  下面是标志位在IP首部中的格式以及各个标志的意义:  TTL  Protocol 协议号 分片包文示例: 分片偏移量计算方法:  第一个分片:  第二个分片:  第三个分片: IP分片是网络上传输IP报

    2024年02月02日
    浏览(66)
  • 动态规划算法:原理、示例代码和解析

    动态规划算法是一种常用的优化问题解决方法,它可以应用于许多计算机科学和其他领域的问题。动态规划算法的基本思想是将一个大问题分解成多个子问题,并将每个子问题的解存储在一个表中。通过计算表中的值,可以得到最终问题的解。在本文中,我们将介绍动态规划

    2024年02月02日
    浏览(39)
  • DNS域名解析,以及A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR说明

    温故知新,最近网上开到相关文章,这里终结记录一下,供大家参考。 目录 1.A记录 2、CNAME: 两种域名解析方式 4、NS记录 5、TXT记录: 6、AAAA记录: 7、SRV记录: 8、SOA记录: 9、PTR记录: 10、相关说明 11. DNS解析中一些问题 11.1 A记录与CNAME记录 11.2 A记录与AAAA记录 11.3 IPv4与

    2024年02月08日
    浏览(38)
  • 深入解析PyTorch中的模型定义:原理、代码示例及应用

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 (封面图由文心一格生成) 在机器学习和深度学习领域,PyTorch是一种广泛

    2024年02月07日
    浏览(38)
  • STM32循迹小车原理介绍和代码示例

    目录 1. 循迹模块介绍 2. 循迹小车原理 3. 循迹小车核心代码 4. 循迹小车解决转弯平滑问题 TCRT5000传感器的红外发射二极管不断发射红外线 当发射出的红外线没有被反射回来或被反射回来但强度不够大时 红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管

    2024年02月03日
    浏览(40)
  • IPv4报文格式详解和报文示例

    目录 一,IP数据报文的组成 二,IP报文格式 三,IPv4报文示例 作者:柒烨带你飞 一个IP数据报文都是 由首部和数据两部分组成 。 每个 IP 数据报都以一个 IP 报头开始。IP 报头中包含大量信息,如源 IP 地址、目的 IP 地址、数据报长度、IP 版本号等。每个信息都被称为一个字段

    2023年04月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包