个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
因此本文将以SR-MPLS BE场景下报文交互过程进行介绍,以详细介绍SR-MPLS。
关于SRv6-BE场景的介绍可见该文章
关于SR-MPLS的RFC,可参考
2018-RFC8402-Segment Routing Architecture
2019-RFC8660-Segment Routing with the MPLS Data Plane
Note:第一章主要简介了SR-MPLS内容。有相关基础可以直接阅读第二章节。
SR-MPLS(Segment Routing MPLS,基于MPLS转发平面的段路由)是基于源路由理念而设计的在网络上转发数据包的一种协议。其核心思想是将报文转发路径切割成不同的段,再为其分配SID(Segment Identifier,段标识符)进行标识从而以段指导报文转发。
MPLS | RSVP-TE |
---|---|
依赖IGP | 可路径规划,但配置、维护复杂 |
缺乏路径规划能力 | 不支持负载分担 |
简单来说就是传统MPLS必须依赖路由表(协议表都不行),必须在路由协议收敛之后才可进行同步。无法收敛就会造成流量黑洞。在网络质量要求越来越高的今天是不可接受的。
而资源预留协议-流量工程RSVP-TE不支持负载,这样也会造成链路带宽的浪费。且配置TE隧道极其复杂。
SDN思想(SDN不是一种协议而是一种网络架构)的兴起,对网络提出了智能化需求。SDN可以依据需求智能检测链路带宽时延情况,并据此进行网络调优。
简单来说SR-MPLS是针对传统L3VPN场景的一种替代方案。在传统L3VPN中,公网隧道由LDP协议分配标签进行流量转发。
而在SR-MPLS场景下,底层逻辑并未改变。 公网仍然使用标签进行转发,只是分配标签的协议由LDP转为了IGP或SDN控制器。IGP收敛完成则公网标签收敛完成,而不在需要LDP协议根据路由表建立同步。
同时引入了TI-LFA(Topology-Independent Loop-Free Alternate)拓扑独立无环备份,加速IGP的收敛过程。
Segment用于指导报文转发,总的来说可分为3类。分别是Prefix Segment、Node Segment、Adjacency Segment。而针对Segment的标识SID也有如下三种。
分类 | 生成方式 | 作用 |
---|---|---|
Prefix SID | 手工 | 标识目的地址前缀。 简单理解可以用于标识目标网络 |
Node SID | 手工 | 标识节点设备。 简单理解可以用于标识设备,例如OSPF的router-id |
Adjacency SID | 手工或协议动态分配 | 标识网络邻接。 |
Prefix SID/Node SID和Adjacency SID可以分别类比于传统IP转发中的目的地址和出接口。
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的集合。
在传统MPLS中对标签字段(20bit)进行了定义。例如,
0== ipv4显式空标签。常用于QOS场景。
1== Route Alert Label非栈底场景有效。常用于故障场景。
2== ipv6显式空标签。作用同0。
3== ipv4/ipv6隐式空标签。用于MPLS的次末跳弹出,减轻PE设备负担。
4-13== 保留。
14== OAM Route Alert Label非栈底场景有效,常用于故障场景。
15== 保留。
16-1023== 一般用于静态LSP和静态CR(Constraint-based)-LSP。
1024-== LDP、RSVP-TE、MP-BGP等LDP动态分配。
Note:不同厂家关于标签的划分,可能不同。例如CISIO动态协议不从1024开始。
而SRGB则是相当于人为定义了一个标签分配范围。表示用户指定的为SR-MPLS预留的全局标签集合,需要手工配置,并且该集合内的标签值只能分配给Prefix SID和Node SID,而Adjacency SID是SRGB范围外的本地SID。
点击此处回到目录
SR-MPLS的BE场景基于Prefix SID或Node SID建立转发路径,这一LSP的建立过程与传统MPLS非常类似。通过将SID(SRGB和Prefix解析而来)在全网泛洪,建立起一条LSP。每个节点设备与传统P设备作用类似,生成标签进行普通的标签压入和弹出。
SR-MPLS的TE场景(Traffic Effort)基于Adjacency SID建立转发路径。该Adjacency SID可手工配置,也可协议分配。通过在头节点进行标签栈(多个Adjacency SID)压入,从而指定了在整个转发过程所经历的路径(严格路径)。
而且通过与Prefix SID和Node SID结合,又可分为松散路径(通过IGP自动发现最优路径而不强制指定途径节点)。
SR-MPLS BE场景下的LSP(Label Switched Path,标签交换路径)主要是通过IGP来实现的。通过对IGP协议进行扩展,使其可以携带SID在网络中泛洪建立LSP。从而实现IGP作为控制协议的效果。
此处IGP选择ISIS(TLV格式扩展性强)作为SR-MPLS的控制层。
OSPF当然也可以,主要是通过Type-10 Opaque LSA来传递SID
ISIS在互相发送ISIS Hello包建立邻居关系后,将发送LSP报文(Link state Protocol Data Unit)。并在LSP报文中新增如下3种字段TLV:
|-----------------------------------------------------------------------------------------------------|
Router Capability:Type=242,Length=16。并表明自己支持SR功能(IPv4),同时携带了SID=16000。这里的SID应当是SRGB的起始值,Range表示了SRGB的范围。也即16000-23000。
233
|-----------------------------------------------------------------------------------------------------|
Extended IS reachability:Type=22,Length=35。并携带子TLV也即subTLV=LAN-Adj-SID:Type=32,Length=11。这里的SID应当是Adjacency SID=48021。Flags字段的Local Significance bit置为1也即具有本地意义。在BE场景下自动生成不涉及,但全网泛洪。
Flags标志字段:
F== 地址族标志。如果未置位,代表IPv4;如果置位,代表IPv6。
B== 备份标志。如果置位,Adj-SID用于保护其他节点。
V== Value标志。如果置位,Adj-SID携带标签值Value。
S== 序列标志。如果置位,表示Adj-SID是一个Adjacency序列。
L== Local标志。如果置位,表示Adj-SID携带的Value/Index具有本地意义。
P== 永久标志。如果置位,表示Adj-SID是一个永久分配的SID,无论设备重启或接口震荡该SID都不变化。
此处未在Wireshark中展示
Weight:1字节。代表Adj-SID权重,可以用于负载分担。
System-ID:6字节。ISIS节点标识。
SID/Index/Label:可变长度。V-bit和L-bit都不置位=0时,表示 SID/Label范围内的4字节的标签偏移值。V-bit和L-bit都置位=1时,表示一个3字节的本地标签,最右边的20位用于标记标签值。
在广播网中存在DIS的概念,每个网元仅发布一条到DIS的IS-IS Extended IS reachability TLV-22,然后把到其他邻居的Adj-SID封装在一个新的TLV中,这就是LAN-Adj-SID Sub-TLV。该TLV包含了网元为所有LAN网络邻居分配的Adj-SID。
233
|-----------------------------------------------------------------------------------------------------|
Extended IP reachability:Type=135,Length=26。该TLV主要用于携带Prefix SID和Node SID。指定前缀为1.1.1.1,前缀长度为32。其中携带子TLV== subTLV-Prefix SID
subTLV=Prefix SID:Type=3,Length=6。并在Flags字段的Node-SID bit位置为1标识为Node-SID。实际上Node-SID可以认为是一种特殊的Prefix SID,是针对设备Loopback口IP地址映射的标签。值得注意的是这里的SID=0x0000000a(转化为10进制的10)指的是人为指定的SRGB prefix Index。可参考下一节对loopback地址的配置。
Flags标志字段:
R== 重发布标志。如果置位,表示该前缀从其他路由协议引入或者从ISIS的其他Level区域引入。
N== Node-SID标志。如果置位,则该Prefix-SID代表一个节点。
这里从报文角度解析了Node-SID其实是Prefix-SID的一种
P== no-Penultimate Hop Popping。如果置位,表示不启用倒数第二跳弹出。
E== 显式空标签Explicit-Null标志。如果置位,则启用显式空标签特性。上游发送报文Label为显示空标签。
V== Value标志。如果置位,则Prefix-SID携带的SID为实际值。
例如这里置为0,表示携带的SID是Index
L== Local标志。如果置位,表示Prefix-SID携带的Value/Index具有本地意义。
Algorithm:1字节。0== Shortest Path First,最短路径算法;1== Strict Shortest Path First,严格最短路径算法。
SID/Index/Label:可变长度。V-bit和L-bit都不置位=0时,表示 SID/Label范围内的4字节的标签偏移值。V-bit和L-bit都置位=1时,表示一个3字节的本地标签,最右边的20位用于标记标签值。
ISIS将不同设备的SID进行同步后,在完成路由收敛的同时也完成了标签转发路径LSP的建立。
@:随后在PE之间建立BGP VPNv4邻居以便传递VPNv4路由后进行不同VPN流量的互相导入。
最终在转发流量时进行标签压入和弹出。
公网标签=16030,私网标签=48061。
SR-MPLS的标签转发路径LSP的建立可参考传统L3VPN的LDP理解。
1@:每台设备上配置SRGB,并在Loopback地址节点上指定Index(Prefix-SID)。Note:SRGB和Index具有本地意义,可以不一致。
2@:IGP协议(ISIS)在LSPDU报文中封装SRGP和Prefix-SID在全网泛洪。网络中其他设备接收到LSP报文后,解析D发布的Prefix SID。并为LSP分配标签。
计算公式是:OuterLabel=下一跳设备发布的SRGB的起始值+Prefix SID值。
示例:P1–P2–P3需要建立LSP
1@首先定义
P1== SRGB=16000-17000,IndrxPrefix-SID=10
P2== SRGB=18000-19000,IndrxPrefix-SID=20
P3== SRGB=20000-21000,IndrxPrefix-SID=30
P1为上游P1分配标签16010;上游P2分配标签16020;上游P3分配标签16030。
P2为上游P2分配标签18020;上游P3分配标签18030。
P2为上游P3分配标签20030。
按如上顺序便可建立P1到P3路径上的多条LSP。
此时P1向P3发报文封装16030的标签,P2封装18030。(此时没有考虑PHP下一跳弹出场景)。
P3向P1的LSP建立也如上类似,从而建立双向LSP。
针对BE场景进行如下配置示范:1@为了减轻设备压力,此时将CE设备替换为终端。其实无影响,只是BGP引入私网路由方式为直连路由。这里也可选用CE设备建立OSPF、BGP邻居等后进行双点双向重分发。
@其实P设备也可指定为两个,可以实现负载效果。这里考虑了设备的最小化需求。实际可酌情添加。
2@这里只提供了PE设备配置,有能力者可自行进行P和PE设备的配置。
有需要者可私信联系提供模拟器源文件及配置。
PE:
sysname NE1
ip -instance -a
ipv4-family
route-distinguisher 1:1
tnl-policy sr-mpls
-target 100:100 export-extcommunity
-target 100:100 import-extcommunity
//需要在私网中优选SR-MPLS隧道。
mpls lsr-id 1.1.1.1
//sr-mpls使用的还是mpls,只是控制协议由LDP变成了IGP。所以仍然需要开启MPLS。
isis 10
is-level level-2
cost-style wide
network-entity 49.0000.0000.0001.00
segment-routing mpls
segment-routing global-block 16000 23000
frr
loop-free-alternate level-2
ti-lfa level-2
//使用IGP建立标签转发路径LSP。并指定SRGB。这里启用了TI-LFA FRR,可以用于缓解拓扑改变时的流量中断情况。
interface Ethernet1/0/0
undo shutdown
ip binding -instance -a
ip address 10.1.1.100 255.255.255.0
interface Ethernet1/0/1
undo shutdown
ip address 10.1.2.1 255.255.255.0
isis enable 10
mac-address 380f-ae01-1122
interface LoopBack1
ip address 1.1.1.1 255.255.255.255
isis enable 10
isis prefix-sid index 10
//这里手动指定Prefix SID的Index,可参考先前报文的Extended IP reachability字段。
bgp 100
router-id 1.1.1.1
peer 3.3.3.3 as-number 100
peer 3.3.3.3 connect-interface LoopBack1
ipv4-family unicast
undo synchronization
undo peer 3.3.3.3 enable
ipv4-family v4
policy -target
peer 3.3.3.3 enable
ipv4-family -instance -a
import-route direct
//建立MP-BGP传递私网路由,与传统L3VPN相同。
undo dcn
//由于设备资源需要,建议关闭DCN。
tunnel-policy sr-mpls
tunnel select-seq sr-lsp load-balance-number 1
//建立SR-MPLS隧道,并同时选定负载均衡为1。如果有多个P设备,可以选定多个进行负载。
#查看adjacency-SID标签。#查看Prefix-SID标签。
#查看私网标签/转发等价类FEC。
#查看SR-MPLS的标签转发路径LSP。
#查看目标前缀的SR-MPLS状态。
MPLS/VPN使用LDP作为公网隧道的一个特点就是在不同AS域间无法传递标签,标签转发路径LSP只能在AS内建立。而SR-MPLS也具有这一特定。针对该场景,BGP也进行了协议扩展能够针对BGP的Peer相关信息分配BGP Peer SID。(SRv6对跨域场景有更好的解决方式)
L3VPN over SRv6可见该文章
BGP for SR-MPLS主要包括BGP EPE(Egress Peer Engineering)扩展和BGP-LS扩展。
之后将对BGP的协议扩展进行介绍。
点击此处回到目录