SRV6基础

参考链接

https://support.huawei.com/enterprise/zh/doc/EDOC1100195151?sendFrom=mobile

https://www.bilibili.com/video/BV1vK4y197tX?p=1&vd_source=4134b92c3a7468ae0a22c27b16a3440f

SRv6 基础概念

基本问题

源节点凭什么去规划路径?它怎么会有这样的能力呢

这个问题其实很好回答,我们先来看一下IGP当中的OSPF是怎么规划路径的,IGP当中的OSPF是凭什么形成路径的转发树的呢?所有的路由器都要事先交换信息从而形成LSDB,有了LSDB意味着路由器对整个网络有了一个详细认知,然后再根据SPF算法计算出最优的路径树。

SR的源节点之所以能规划出最优秀的路径树整体思路与OSPF是差不多的。在SR当中,我们把规划路径的看做是控制能力,最常见的方式是SR源节点把控制能力交给控制器,由控制器反所有的路径算好之后下发到源节点,这是一种方式;另一种方式就是让SR网络设备之间相互交互信息自己计算出一个最优秀的路径,当然管理员也可以参与规划。

源路由

1. MPLS架构用的好好的,为什么要用SR呢

image-20230622152804904

上面这个图不错,是华为PPT上的图,我们来简单解释一下;

  1. 第一阶段是纯纯的MPLS架构,控制层面必须得基于IGP建立;
  2. 第二阶段是重心转到了对IGP的扩展上,但IPV4的报文设计无法原生支持SR,所以还是借鉴了MPLS架构;
  3. 第三阶段是彻底摆脱对MPLS架构,IGP的真正意义实现了控制层面和转发层面合二为一。

2. SRV6的优势体现在什么地方

  • 继承IPV6的优势
  • 原生亲和SDN
  • 具有可编程的优势

3. SR的两种部署方式

  • IPV4网络:通过MPLS架构增量部署
  • IPV6网络:无需借助其它技术,IPV6原生即支持SR

SRH和报文结构

SRH全称是segment routing header,直译为段路由的扩展报文头。

我们知道IPV6报文默认只有一个标准的首部,可以通过添加扩展头来实现多种功能,如果说在标签首部上添加段路由扩展头,那IPV6报文就能直接支持SR功能,这意义相当重大哈!为什么这么说,在MPLS-LDP时期想实现报文通过MPLS穿越ISP,那中间所有的网络都必须得运行MPLS-LDP,本来这些网络设备就已经运行了IPV4的路由协议,现在还在在此基础上叠加一个MPLS-LDP,SRv6时代不用了,只运行一个支持IPV6的动态路由协议即可完成转发了,也就是说一个支持IPV6的IGP协议就能完成之前整个MPLS架构才能完成的事情。

SRH的报文结构如下所示:

image-20230622152813182

我们可以看到SRH的位于标准首部和载荷中间,蓝色部分全都是,但其中最核心的部分就是segment list,这其实就是由连续的IPV6地址组成的列表,数据报文在转发的时候根据这个列表进行转发,就是源路由那个感觉。也就是说SR报文在发送之前在填充SRH,而填充SRH之前要先计算出路径,谁来计算出路径呢?支持的IPV6的IGP都可以,比如扩展后的OSPF或ISIS。

这里会涉及一个问题,那就是SRH会改变报文的源目IP地址吗?

不会的,SRH是附加在标准首部之上的,不会改变标准首部中的源目IP地址。

SID

image-20230622152825363

SRH里面最关键的字段就晃segment,也称为是SID

SID的表现形式就像IPV6地址,SID由三部分组成(小于等于128位):

  • locator
  • function
  • arguments

locator

SID里面最关键的字段就是locator

locator的作用是标识网络节点,用于路由和转发到该节点

在SR-MPLS里面控制层还是依赖MPLS标签,而在SRV6当中没有标签的概念,那代替MPLS标签是什么呢?是一个类似IPV6地址的字段叫locator,locator是本地管理员参与分配,分配完之后会随之IGP协议分发,IGP的作用是形成底层的承载路由条目,而其中就有locator所形成的路由条目。也就是说以后再转发的时候不再看下一跳标签转发表,而是直接查路由表就行了!而且locator还有一个标签不具有好处,标签仅仅是两台路由设备之间才会生效,而locator是全域唯一,因为它是跟随ISIS进行泛洪,可以直接全域唯一标识一台路由设备,这可比router-id的功能要强,router-id虽然也是全AS泛洪并唯一标识,但是router-id并不能直接用来路由。

在MPLS LDP时代,底层的IGP负责形成承载路由条目,LDP形成最外层的标签,而现在,ISIS或OSPF本身通过locator字段实现了类似标签分发的效果,原本IGP和LDP泾渭分明,各自负责自己的工作,而现在IGP通过locator实现了LDP做到事情。我们可以一个新形象的例子说明,原本A是种植鸦片的,是整个毒品网络最底层,B从A进货销售,而现在情况变了,A不仅自己种植鸦片,而且自产自销,直接开启了“厂家直销,没有中间商赚差价”的新商业模式。

function

image-20230622152833074

locator用于标识,而function里面是要执行的动作

function在华为路由器当中以opcode来命名

arguments

一般情况下不配置

SID类型和举例

image-20230622152841730

image-20230622152849898

  • End SID用于标识网络中的某个目的节点(Node)。类似SR-MPLS中的Node SID。End SID通过IGP协议扩散到其他网元,全局可见,本地有效。

End.X SID表示三层交叉连接的Endpoint SID,用于标识网络中的某条链路。类似SR-MPLS中的Adjacency SID。End.X SID通过IGP协议扩散到其他网元,全局可见,本地有效。

End.DT4 SID表示PE类型的Endpoint SID,用于标识网络中的某个IPv4 VPN实例。End.DT4 SID对应的转发动作是解封装报文,并且查找IPv4 VPN实例路由表转发。End.DT4 SID在L3VPNv4场景使用,等价于IPv4 VPN的标签。End.DT4 SID可以通过静态配置生成,也可以通过BGP在Locator的动态SID范围内自动分配。

SID的配置

我们整理一下前面的关键内容之前关系:

  • IPV6报文

    • SRH
      • SID/srv6 segment
        • locator
        • function
        • arguments
  • 上述这个关系很简单,IPV6报文通过在标准的报文头当中插入特定的SRH扩展报文头用以支持SRV6的功能,也就是说SRV6的大部分功能都能在该SRH报文扩展头当中有所体现。

  • SRH结构当中较为关键的一组字段为SID/srv6 sid,sid的表现形式类似于IPv6地址,sid又有三部分组成;

  • locator用于标识节点,function用于标识动作。

  1. 进一步说,我们如果想要使能SRV6,必须得配置SID,否则SRH报文首部无法被填充;
  2. 再进一步,我们如果想配置SID,就必须先配置locator
  3. 最后,当我们配置完locator之后,sid会自动形成,SRH得以填充,报文得以发送
  • SRV6的SID配置方式分为:
    • 动态配置:只需配置locator,arguments由IGP动态分配
    • 静态配置:不仅需要配置locator,还得规定arguments(推荐静态配置End SID和End.X SID。动态生成的SID如果设备重启,SID会变化,不利于维护。)

问题1:arguments是动作,如果是动态分配,系统怎么知道我们想要执行什么动作呢

是因为locator有类型之分,而这些类型有默认的动作,所以系统能自动进行实例动作。

问题2:动作是否可以自定义

是可以的,这就是SRv6可编程性的一个体现

基本实验

image-20230622152909659

image-20230622152922601

接口IP的配置

# CX1的配置
sys i
sysn CX1
undo dcn
y
int ether1/0/0
ipv6 enable
ipv6 address 2012::1/64
int l0
ipv6 enable
ipv6 add 2000::1/128

# CX2的配置
sys i
undo dcn
sysn CX2
y
int l0
ipv6 enable
ipv6 address 2000::2/128
int ether1/0/0
ipv6 enable
ipv6 address 2012::2/64
int ether1/0/1
ipv6 enable
ipv6 address 2023::2/64
quit
# CX3
sys i
sysn CX3
undo dcn
y
int l0
ipv6 enable
ipv6 address 2000::3/128
int ether1/0/0
ipv6 enable
ipv6 address 2023::3/64
quit

ISIS的配置

# CX1
isis 1
is-level level-2
cost-style wide
is-name cx1
network-entity 49.0001.0000.0000.0001.00
ipv6 enable topology standard
int ether1/0/0
isis ipv6 enable 1
int l0
isis ipv6 enable 1

# CX2
sysn CX2
isis 1
	is-level level-2
	cost-style wide
	is-name cx2
	network-entity 49.0001.0000.0000.0002.00
	ipv6 enable topology standard
int ether1/0/0
isis ipv6 enable 1
int ether1/0/1
isis ipv6 enable 1
int l0
isis ipv6 enable 1
quit

# CX3
isis 1
is-level level-2
cost-style wide
is-name cx3
network-entity 49.0001.0000.0000.0003.00
ipv6 enable topology standard
int ether1/0/0
isis ipv6 enable 1
int l0
isis ipv6 enable 1
quit

SRv6配置

# 检查类的命令,先检查一下基础环境
dis current interface ether1/0/0
dis ipv6 interface brief
ping ipv6 2000::1/64
dis isis peer
dis isis route ipv6
SRV6的关键配置
segment-routing ipv6 首先全局打开ipv6
encapsulation source-address 2000::1/128 设置srv6报文封装源,用环回接口配置
locator yeslab ipv6-prefix A111::96 static 16 设置前缀为96位,静态固定部分16位
isis
segment-routing ipv6 locator yeslab 要求在ISIS当中宣告出去

PS:static在这里的意思是静态段的位数,而不是静态locator的意思,上述的prefix依然是动态分配的方式。也就是说这条命令的意思是locator yeslab ipv6-prefix A111::96 static 16,locator前缀为96位,还剩下32位,32位中的16位用做静态,剩下的16位用做动态分配。

# 下面演示一下动态的方式配置SID
[CX1]segment-routing ipv6
[CX1-segment-routing-ipv6]encapsulation source-address 2001::1
[CX1-segment-routing-ipv6]locator test1 ipv6-prefix A111::1 96 static 16
[CX1-segment-routing-ipv6-locator]
[CX1]isis 1
[CX1-isis-1]segment-routing ipv6 locator test1
**[CX1]dis segment-routing ipv6 local-sid end forwarding** 
                    My Local-SID End Forwarding Table
                    ---------------------------------
SID        : A111::1:0/128                                FuncType : End
Flavor     : -- # 正常的
LocatorName: test1                                        LocatorID: 1

SID        : A111::1:1/128                                FuncType : End
Flavor     : PSP # 附加额外功能的
LocatorName: test1                                        LocatorID: 1

**[CX1]dis segment-routing ipv6 local-sid end-x forwarding** 
                    My Local-SID End.X Forwarding Table
                    -----------------------------------
SID        : A111::1:2/128                                FuncType : End.X
Flavor     : --
LocatorName: test1                                        LocatorID: 1
NextHop    :                      Interface :             ExitIndex:
  FE80::3A2A:8FFF:FE01:100          Eth1/0/0                0x00000006

SID        : A111::1:3/128                                FuncType : End.X
Flavor     : PSP
LocatorName: test1                                        LocatorID: 1
NextHop    :                      Interface :             ExitIndex:
  FE80::3A2A:8FFF:FE01:100          Eth1/0/0                0x00000006

Total SID(s): 2

我们会发现通过动态方式配置SID时,我们仅需要把locator写上,然后规定一下静态位占多少位,在上文我们规定locator是96位,同时规定静态位占16位,其实也意味着动态位也是16位,注意这里面的16仅仅是位数而已,static并不代表这是静态配置。

当我们查看end SID的时候发现产生了两个,一个是flavor是空,另一个是PSP,这是什么意思?另外这两种SID这也不一样呀,这是怎么回事?我们规定了SID的前96位(也就是prefix),所以所有的SID前96位都是固定的都是A111,后面的数字依次是动态位和静态位,各占16位,这个两个数字都是动态自动分配的,因为我们在配置locator的时候使用的就是动态配置呀,为什么会有两个呢?你还记得MPLS-LDP当中两个表吗?一个表是下一跳标签转发表,另一个表是入标签转表,这两张表里面一个存储的是自己对网段分配的标签,另一张表里面存储的是下游对网段的描述,这里也类似,Flavor为空的是本地的描述,而 flover是PSP是要发给上游的。

一个SID即可以形成end-sid,也只可以形成end-x-sid,end是描述节点的,而end-x是描述链路或网段的,这一点就比MPLS-LDP要强多了,标签就只能标识一个网段或一个路由。做完locator之后会生成各种SID,locator会扩散出去在其它路由表上形成路由,如果有路由器把标签设置为某个SID,就可以通过locator路由直接转发。

posted @ 2021-06-28 18:43  张贺贺呀  阅读(345)  评论(0编辑  收藏  举报