“IOAM+SRv6”方案设计及实现
2022-01-06刘博闻王嘉楠吴军平
刘博闻,王嘉楠,吴军平
(1.武汉邮电科学研究院,湖北武汉 430074;2.烽火通信科技股份有限公司,湖北武汉 430073)
OAM 是操作、维护、管理的融合统一。操作主要是完成对日常网络和业务进行的分析、预测、规划和配置工作;维护、管理主要是对网络及其业务的测试、对故障进行管理[1]。IOAM 作为一种新的带内遥测技术,用于业务在网络中的质量检测等功能。网络遥感是一种网络信息采集技术,目的是为了采集网络中的信息,网络遥感一般分为两种,分别是主动探测和被动探测。被动探测以思科的Netflow 技术为代表,而主动探测则大多数类似于微软Everflow中的guided probe 组件。它会在发送端的虚拟机中注入一种“探测数据包”,并在网元上设置一些探测识别点,探测数据包每经过一个网元都会上传状态信息,但是主动探测“注入探测数据包”会对当前网络中的流量作出一些影响。被动探测以思科的Netflow 和INT(Inband Network Telemetry)为代表,具体应用为IOAM。Netflow 是一种带外采集技术,而INT 是一种新型的“带内网络遥感技术”,具体实现方式是将监测检查点插入数据包的内部,也就是途中的OAM 层,INT 通常的做法是在数据包的头(Header)和数据包内部数据(Payload)之间插入一块OAM 层,然后数据包经过每一个网元,都会将探测信息插入OAM 层中,包括网元对数据包的行为,是转发还是丢弃,最后数据包到达终点,数据包中的OAM 层被剥离出来,通过信息导出协议上传到远程的分析服务器[2-5]。IOAM 的检测方式目前已经应用在公司设备R8000E 上,为运营商提供服务。
1 原理概述
1.1 IOAM原理
报文从入接口进入,在封装节点将OAM 数据报文嵌入在数据报文中,在转发节点根据算法将相关的OAM 信息填入OAM 数据中,在解封装节点,判断IOAM转发节点填入的OAM信息校验路径是否与配置的路径一致,并将OAM 数据报文移除,如图1所示。
图1 IOAM网络部署图
IOAM 层由两部分组成,一部分为instruction,即指令,另一部分为data,即数据,指令中携带需要收集的信息,Translation Node 只需要根据指令把相应的信息塞入data 部分中即可完成数据的收集。
IOAM 协议的承载形式有很多种,包括GRE、IPV6、SRv6、VXLAN-GPE、NSH、GENEVE 等。文中主要讨论IOAM 承载SRv6 隧道。
1.2 SRv6隧道
SRv6 技术基于已经普及的IPv6 技术扩展报文头部,对数据报文进行转发处理[2]。当分段路由应用于IPv6 数据平面时,会引入一种路由扩展报头—分段路由报文头部[IPv6-SRH]。分段路由报文头部(Segment Routing Header,SRH)将一些元数据添加到IPv6 数据包中,其中包含数据包必须经过转发路径元素的列表,并由IPv6 地址表示[3-10],如图2 所示。
图2 IOAM转发模型
在Ingress 入口节点添加SID[N]和带内流量信息遥测(In-situ Flow Information Telemetry,IFIT)的报文头部,进行SRv6 动作类型的实现和网络遥感的监测(IFIT 头部)。其中SID 是使能SRv6 节点维护的一个本地SID(Local SID)表,该表包含所有在该节点生成的SRv6 SID 信息[11-12],通过该表可以生成一个SRv6转发表。Local SID 表有以下用途:定义本地生成的SID,例如End.X SID;指定绑定到这些SID 的指令;存储和这些指令相关的转发信息,包括出接口和下一跳等[13-17]。SRv6 SID 有很多类型,不同类型的SRv6 SID 代表不同的功能[9-10],例如:
1)End SID 表示Endpoint SID,用于标识网络中的某个目的地址前缀(prefix);
2)End.DT4 SID 表示PE 类型的Endpoint SID,用于标识网络中的某个IPv4 VPN 实例;
3)End.DX6 SID 表示PE 类型的三层交叉连接的Endpoint SID,用于标识网络中的某个IPv6 CE。
还有多种类型用于实现不同功能。IFIT 报文头部格式如图3 所示。
图3 IFIT报文头部格式
Type:类型指示,表示扩展数据类型,显示是否携带扩展头;
Length:IFIT 长度,默认为8 字节;
L:Loss Flag,丢包测量染色标记;
D:Delay Flag,时延测量染色标记;
R:R Flag,保留位,预留未来扩展使用;
Flow ID:用于唯一标识一条业务流。
当芯片判定SRH 的标志位为1 时,表明SRH 携带了IOAM,然后通过IFIT 的Length 字段判断IOAM的长度,同时根据HTI 字段判断IOAM 的检测方式,包括从入节点到出节点的端到端检测和在转发过程中的逐点检测[6]。
IOAM 的报文转发检测需要经过源节点、中间节点和宿节点。IOAM 报文的封装在源节点完成,其中包含IOAM 引导标签和流标签以及正确的L-bit、D-bit。运用IOAM 对报文进行筛选,通过ACL 匹配UNI 侧流信息,对匹配上的报文进行封装[7]。ACL 周期性的指向A Block 或B Block,CPU 实现L 的交替标记,在标记周期上添加Counter 功能,可以进行L 的标记统计,而D 报文则是每个周期标记一个。
中间节点则是对IOAM 进行L 统计和D 报文识别,宿节点是对RX/TX 方向的L 和D 数据进行性能统计,并将IOAM 标签剥掉,完成IOAM 的转发[8]。
2 IOAM+SRv6的方案设计
2.1 数据结构设计
IOAM中的数据流向是从平台FDPO下发,传递给驱动层DDPO 数据结构,DDPO 数据从驱动层下发到数据转发平面层,再从数据转发平面层传递给微码层面进行相应处理[4]。如图4所示,代码中接口是在驱动层从FHDRV接口开始调用,在FHDRV中调用数据转发平面层接口,再通过Y接口进行写入数据等操作。
图4 驱动接口调用层次图
FDPO 和DDPO 是两种不同层面的数据结构体,通过IDE 工具构建而成。数据由FDPO 发送,传递到DDPO 数据模型中。IOAM 功能中,FDPO 的数据结构体需要定义不同字段并实现对应功能。
DDPO 是根据FDPO 定义的字段进行改动,定义驱动层需要的字段,构建DDPO 时,需要设计DDPO中的普通字段、驱动返回值、字段映射关系和DDPO依赖链关系。
DDPO 中定义了数据报文在IOAM 功能中传输所需的字段,如表1 所示。
表1 IOAM传输字段
这些字段根据不同的映射关系,通过数据结构依赖链从对应的FDPO 结构体中获取数据。
在FDPO 中,数据的下发也是通过外键关联,根据依赖链逐步下发的,相对应的DDPO 需要设计出数据下发的依赖链关系,如图5 所示为IOAM 数据结构的依赖链关系。
图5 DDPO依赖链关系
依赖链以IOAM_CFG 结构体为起始类,通过ifindex、first_nni_ifindex 和second_nni_ifindex 外键关联到IFMGR_IF_NET 结构体,对于部分字段,还需通过index、if_foreign_key 和flexe_client_foreign_key 外键迭代到UES_IF、IFMGR_IF_LAG、FLEXE_CLIENT数据结构体,获取对应的字段数据。
2.2 SRv6转发方案
SRv6 的转发方案结合L3VPN 的流程进行了设计[13-14],如图6 所示。
图6 SRv6 L3VPN流程
数据报文从intf 入接口进入,根据最长匹配算法查找路由表,得到l3_path_id,根据该索引值查询l3path 表项,在l3path 表项中配置保护类型,包括无保护、frr 保护和ecmp 保护,同时得到查询l3nhi 表项的索引值,在l3nhi 表项中,entry_type 类型置为SRv6,并继续查询srv6_path 表,同时查询srv6_sid 表项,获取sid 的动作类型,srv6_path 表可以提供故障保护,并为查询srv6_attr 属性表提供索引id,srv6_attr 属性表中则包含了出口信息、arp_id 等,通过查询arp 表项得到出口,将数据报文转发出去。
3 测试过程和结果
对于IOAM 功能,首先配置一条采样周期为30 s,检测方式为端到端的L3VPN SRv6 数据流,分别在出口进行L 标记统计和D 标记时延统计测试。
3.1 L标记统计
测试验证源宿包统计是否正常,两站均采用SSUA4 单盘,从UNI→NNI 建立一条SRv6 业务,保证业务流通畅。然后在源站和宿站下的IOAM 配置建立一条flow 为2 的IOAM 配置。登录设备进入驱动层,打开flow_id 为2 的打印,psn_tmtry_dbg_flow_switch(2),图7、图8 分别为源站、宿站L 标记统计。
图7 源站L标记统计
图8 宿站L标记统计
比较图7 和图8 可以看出,源站L 标记收包为L:rx[253320363],宿站L 标记收包为L:rx[253320363],源宿统计的包数相等,所以L 包统计正常,测试结果成功。
3.2 D标记时延统计
D 标记作为时延测量标志位,需要测试源宿的时延获取是否正常。先建立SRv6 业务流,保证业务流畅通,再在源站和宿站配置IOAM 信息,建立一条flow id为2的IOAM配置。登录设备后进入驱动层,打开flow id 为2 的打印,psn_tmtry_dbg_flow_switch(2)。图9、图10 分别为源站、宿站D 标记时延统计。
图9 源站D标记时延统计
图10 宿站D标记时延统计
由图9 和图10 比较可以看出,源站D 标记收包时间为D:rx[18029232],宿站D 标记收包时间为D:rx[18061888],两者时延差为32 656 ms,即32.656 s,D标记时延统计正常,源宿时延差在30 s 左右,属于误差允许范围内,满足要求,测试结果成功。
4 结束语
IOAM 技术属于数据包粒度级别的丢包检测,检测对象更加精细,甚至可以获取网络中的丢包情况、原因和丢包位置;IOAM 作为一种带内技术,可以捕获到网络中的时延或丢包的时刻;同时,由于IOAM可以获取网络中的每一条链路的时延、带宽以及丢包情况,将这些信息整合,选择最优的网络传输路径,实现智能路由和选路。但IOAM 技术也存在一些明显的缺点,比如在运营商等网络中,发送、接收的数据包数量是巨大的,对每一个数据包插入OAM层并收集监测信息,会产生巨大的信息量,这些信息的压缩、重分析也是一个需要考虑的问题[18-19]。而且巨大的信息量,需要不断地申请新的空间进行数据拷贝和新OAM 层的插入,会产生更大的性能消耗。由于数据包会被分片,插入的OAM 长度也会有所限制,经过转发的设备数量必然不能太多[20]。目前的IOAM 技术基本都是基于硬件实现,并与软件相配合,随着技术的发展,如果能将IOAM 应用于软件转发,则将为数据监测提供更大的应用平台。