Frrouting学习笔记(五)——OSPF Segment Routing

本篇翻译自doc/developer/ospf-sr

这是对“RFC 8665”的实验性支持。

不要将其用于商用网络。

一、支持的功能

  1. 利用Cisco实验远程IP地址自动计算主和备份相邻SID
  2. SRGBSRLB配置
  3. 带有可选NO-PHP标志的节点SID前缀配置(Linux内核支持这两种模式)
  4. 节点MSD配置(Linux内核>=4.10时,最多可以堆叠32个标签)
  5. MPLS表的自动配置
  6. 等成本多路径(ECMP
  7. 静态路由配置,标签堆栈最多32个标签
  8. TI-LFA(仅适用于P2P接口)

二、互操作性

  1. FRRouting实例和Cisco IOS-XR 6.0.x的混合中测试了各种拓扑结构,包括点对点和LAN接口
  2. 检查OSPF LSA是否符合最新的wireshark 2.5.0-rc版本

三、实施细则

3.1 基本概念

        分段路由在OSPF中使用了3种不同的OPAQUELSA来承载各种信息:

  1. **Router Information:** 洪泛节点的分段路由功能。这包括支持的算法,分段路由全局块(SRGB)和最大堆栈深度(MSD)。
  2. **Extended Link:** 洪泛相邻和Lan相邻段标识符
  3. **Extended Prefix:** 填充前缀段标识符

        该实现遵循先前的TE和路由器信息代码。它使用了ospf_oopaque中定义的OPAQUE LSA函数。[ch]以及OSPF API。后者对于实现是强制性的,因为当接收到扩展链路/前缀或路由器信息LSA时,它提供回调到分段路由功能(见下文)。

3.2 概述

        修改或添加了以下文件:

  1. ospd_ri.[c,h] 已被修改以添加用于分段路由的新TLV
  2. ospf_ext.[c,h] 实现RFC7684作为扩展链路和前缀不透明LSA的基本支持。
  3. ospf_sr.[c,h] 实现分段路由的地球。它添加了一个新的分段路由数据库,用于管理每个链路和前缀的分段标识符和分段路由启用节点,回调功能用于处理传入LSA并通过Zebra安装MPLS FIB条目。

        下图显示了各种文件之间的关系:

  1. ospf_sr.c集中了所有的分段路由处理。它从ospf_pri.c接收Opaque LSA路由器信息(4.0.0.0),从ospf_ext.c接收Extended Prefix7.0.0.XLink8.0.0.X)。一旦接收到,它将解析TLVSubTLV并将信息存储在SRDB(在ospf_sr.h中定义)中。对于每个接收到的LSANHLFE将被计算并发送到Zebra以添加/删除新的MPLS标签条目和FEC。新的CLI配置也集中在ospf_str.c中。此CLI将分别触发ospf_ri.c洪泛新的LSA路由信息(4.00.0)、Extended Preference7.0.0.X)和Link8.0.0.X ospf_ext.c
  2. ospf_ri.c将接收到的路由器信息LSA发送回ospf_sr.c,并用ospf_sr.c提供的参数(即SRGBMSD)更新自路由器信息LSA。它使用ospf_opaque.c函数来发送/接收这些opaque LSA
  3. ospf_ext.cospf_sr.c发送接收到的扩展前缀和链路不透明LSA,并通过ospf_oopaque.c函数发送自身扩展前缀和链接不透明LSA

1分段路由交互概述

3.3 模块交互

        为了处理传入的LSA,该代码基于在LSDB中插入或删除LSA时调用“hook()函数的能力,以及为不透明LSA注册特定处理的可能性。第一点由OSPF API特性提供,第二点由Opaque实现本身提供。事实上,可以为给定的Opaque LSA ID注册回调函数(请参阅“ospf_register_Opaque_functab()中定义的函数)。每次向LSDB添加新的LSA时,都会调用先前为此LSA类型注册的“new_LSA_hook()函数。对于不透明LSA,使用“ospf_Opaque_LSA_install_hook()。对于删除,使用`ospf_opaque_lsa_deletehook()`

        请注意,已经存在于LSDB中的传入LSA将在从LSDB中删除该LSA的旧实例之后插入。因此,在第一次之后,每个进入的LSA将触发删除,然后是安装。这对处理真正的LSA删除没有太大帮助。事实上,LSA删除是通过刷新LSA来完成的,即在将LSA的年龄设置为MAX_age后对其进行洪泛。然后,垃圾函数的作用是删除LSDB中所有“age==MAX_age”LSA。因此,要处理LSA刷新,最好是查看LSA年龄,以确定它是安装还是将来删除,即刷新的LSA首先存储在LSDB中,MAX_age等待垃圾收集器功能。

3.4 路由器信息LSAs

        为了激活Segment Routing,引入了新的CLI命令“Segment Routing on”。激活此命令时,将调用函数ospf_router_info_update_sr()`,以向路由器信息进程指示分段路由TLV必须洪泛。调用相同的函数来修改分段路由全局块(SRGB)和最大堆栈深度(MSDTLV。仅支持最短路径优先(SPF)算法,因此代码不提供修改此TLV的可能性。

        当不透明LSA类型4,即路由器信息存储在LSDB中时,函数`ospf_opaque_lsa_install_hook()` 将调用以前注册的函数`ospf_router_info_lsa_update()`. 反过来,该函数将简单地触发

`ospf_sr_ri_lsa_update()` or `ospf_sr_ri_lsa_delete` LSA年龄的函数中。之前,它验证LSA不透明类型为4(路由器信息)。自不透明LSA不会发送回分段路由功能,因为已经存储了信息。

3.5 扩展链路前缀LSAs

        与路由器信息类似,分段路由在扩展链路/前缀级别通过新的打开分段路由命令激活。这会自动触发邻接已满的所有ospf接口的扩展链路LSA的洪泛。对于扩展前缀LSA,新的CLI命令“segment routing Prefix…”将触发前缀SID TLV/SubTLV的洪泛。

        当不透明LSA类型7(即扩展前缀)和类型8(即扩展链路)存储在LSDB中时,与路由器信息LSA类似,分别调用“ospf_ext_pref_update_LSA()“ospf_ext_Link_update_LSA()。反过来,如果lsa年龄等于MAX_age,则它们分别触发“ospf_sr_ext_prefix_lsa\uupdate()”/“ospf_str_ext_link_lsa_update

3.6 Zebra

        当必须在数据平面中添加或删除新的MPLS条目或新的转发等效类(FEC)时,分别调用`add_sid_nhlfe()``del_sid_nhilfe()'。一旦检查了标签的有效性,它们就会通过“ZEBRA_MPLS_labels_ADD”命令发送到ZEBRA层,分别通过“ZEBRA_MPLS_labels_DELETE”命令删除。这是通过一个新的标记路由分别通过“ZEBRA_route_ADD”命令和“ZEBRA_route_DELTE”命令完成的。

3.7 TI-LFA

        对拓扑无关LFA(无环路备用)的实验支持,例如参见“draft-bashandy-rtgwg-segment-routing-ti-LFA-05”。相关文件为“ospf_ti_lfa.c/h”

        当前的实现相当幼稚,并且不支持例如RFC7490RFC8102中建议的高级优化。它专注于提供基本的基础设施,这些基础设施稍后也可以用于增强算法方面。

        支持的功能:

  1. 链路和节点保护
  2. 区域内支持
  3. 标签堆栈中前缀SID和相邻SID的正确使用
  4. 不对称权重(使用反向SPF
  5. 非相邻P/Q空间
  6. 前缀SID的保护

        如果为每个SPF运行配置了路由表,则会为每个前缀增加额外的备份路径。在OSPF SR更新任务中,也使用备份路径更新相应的前缀SID

        非正式高级算法描述:

        可能的性能改进:

  1. 改进整体数据结构,摆脱顶点的链表
  2. 不要为每个目的地计算Q空间,而是为覆盖聚合后SPF中所有目的地的最小备份路径集计算Q空间。这里的想法是,一旦知道备份路径,它也是路径上所有节点本身的备份路径。这可以通过使用从该特定P空间的收敛后SPF树生成的修剪最小生成树的叶子来实现。
  3. 对于另一种(也许更好)优化,请查看https://tools.ietf.org/html/rfc7490#section-5.2.1.3描述了使用受链路故障等影响的节点的Q空间。请注意,此优化取决于拓扑结构。

        强烈建议阅读Filsfils“Segment Routing I/II”,以了解Ti LFA的基本知识。

四、配置

4.1 Linux Kernel

        为了使用OSPF分段路由,您必须设置MPLS数据平面。据了解,仅支持Linux内核>=4.5版本。

        首先,默认情况下不会加载MPLS模块,因此您需要自己加载它们:

        然后,您必须在要使用的接口上激活MPLS

        最后一行固定了最大MPLS标签值。

        一旦OSPFd开始使用分段路由,您可以检查MPLS路由是否启用:

        第一个命令显示MPLS LFIB表,而第二个命令显示包含具有MPLS标签封装的路由的FIB表。

        如果您使用“no php flag”禁用Penfinal Hop Popping(见下文),则必须检查RP过滤器是否未为您打算使用的接口启用,尤其是“lo”接口。为此,请使用以下选项禁用RP筛选:

4.2 OSPFd

        这里是启用分段路由的简单配置示例。请注意,“不透明能力”和“路由器信息”必须设置为在分段路由之前激活不透明LSA

        第一个分段路由语句启用它。第二个和第三个分别设置SRGBSRLB,第四行设置MSD,最后为给定前缀设置前缀SID索引。

        请注意,只有环回接口的前缀才能配置前缀SID。可以在prefix命令的末尾添加“no php flag”来禁用Penfinal Hop Popping。这向对等方通告,他们在发送数据包之前不得弹出MPLS标签。

五、已知限制

  1. 仅在默认VRF内运行
  2. 仅支持单个区域。尚未支持ABR
  3. 仅支持SPF算法
  4. 不支持扩展前缀范围
  5. 由于Linux内核不可能执行双POP指令,因此在无最终跳跳的情况下,不可能用相邻SID表示段路径。

六、Credits

  1. Author: Anselme Sawadogo <anselmesawadogo@gmail.com>
  2. Author: Olivier Dugeon <olivier.dugeon@orange.com>
  3. Copyright (C) 2016 - 2018 Orange Labs http://www.orange.com

这项工作是在H2020-ICT-2014项目5GEx(赠款协议编号671636)的框架内进行的,该项目的部分资金由欧盟委员会提供。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值