问题描述
设备发生主备倒换后,由于没有保存任何重启前的邻居信息,因此一开始发送的 Hello 报文中不包含邻居列表。此时邻居(Helper)设备收到后,执行两次握手机制进行邻居关系检查,发现在重启(Restarter)设备的 Hello 报文的邻居列表中没有自己,这样邻居关系将会断掉。
同时,邻居设备通过生成新的 LSP 报文,将拓扑变化的信息泛洪给区域内的其它设备,区域内的其他设备会基于新的链路状态数据库进行路由计算,从而造成路由中断或者路由环路。
解决方案
IETF 针对这种情况为 IS-IS 制定了 GR 规范(RFC3847),对保留 FIB 表和不保留 FIB 表的协议重启都进行了处理,避免协议重启带来的路由震荡和流量转发中断的现象。
IS-IS GR 是一种支持 GR 能力的高可靠性技术,可以实现数据的不间断转发。
原理简述
为了实现 GR 特性,IS-IS 引入 211 号 TLV(Restart TLV)和 T1、T2、T3 三个定时器。
211 号 TLV(Restart TLV)
Restart TLV 是包含在 IIH(IS-to-IS Hello PDUs)报文中的扩展部分。支持 IS-IS GR 能力的设备的所有 IIH 报文都包含 Restart TLV。
在 Restart TLV 中,携带了协议重启的一些参数:
Type:1 Byte,TLV 的类型。值为 211 表示是 Restart TLV。
Length:1 Byte,TLV 值的长度。
RA(Restart Acknowledgement):重启应答位;1 bit;设备发送的 RA 置位的 Hello 报文用于通告邻居确认收到了 RR 置位的报文。
SA(Suppress adjacency advertisement):抑制发布邻接关系位,1 bit;用于发生 Starting 的设备请求邻居抑制与自己相关的邻居关系的广播,以避免路由黑洞。
RR(Restart Request):重启请求位;1 bit;设备发送的 RR 置位的 Hello 报文用于通告邻居自己发生 Restarting/Starting,请求邻居保留当前的 IS-IS 邻接关系并返回 CSNP 报文。
Remaining Time:邻居保持邻接关系不重置的时间;2 Byte;邻居保持邻接关系不重置的时间,单位是秒。当 RA 置位时,这个值是必需的。
定时器
T1 定时器:如果 GR Restarter 已发送 RR 置位的 IIH 报文,但直到 T1 定时器超时还没有收到 GR Helper 的包含 Restart TLV 且 RA 置位的 IIH 报文的确认消息时,会重置 T1 定时器并继续发送包含 Restart TLV 的 IIH 报文。当收到确认报文或者 T1 定时器已超时 3 次时,取消 T1 定时器。T1 定时器缺省设置为 3 秒。
T1 定时器:使能了 IS-IS GR 特性的进程,在每个接口都会维护一个 T1 定时器。在 Level-1-2 路由器上,广播网接口为每个 Level 维护一个 T1 定时器。
T2 定时器:GR Restarter 从重启开始到本 Level 所有设备 LSDB 完成同步的时间。T2 定时器是系统等待各层 LSDB 同步的最长时间,一般情况下为 60 秒。
T2 定时器:Level-1 和 Level-2 的 LSDB 各维护一个 T2 定时器。
T3 定时器:GR Restarter 成功完成 GR 所允许的最大时间。T3 定时器的初始值为 65535 秒。T3 定时器超时表示 GR 失败。
T3 定时器:T3 定时器的初始值为 65535 秒,但在收到邻居回应的 RA 置位的 IIH 报文后,取值会变为各个 IIH 报文的 Remaining time 字段值中的最小者。整个系统维护一个 T3 定时器。
IS-IS GR Restarting
主备倒换和重启 IS-IS 进程,将触发的 GR 过程称为 Restarting,FIB 表保持不变。
STEP 01
GR Restarter 进行协议重启后,GR Restarter 进行如下操作:
启动 T1、T2 和 T3 定时器。
从所有接口发送包含 Restart TLV 的 IIH 报文,其中 RR 置位,RA 和 SA 位清除。
GR Helper 收到 IIH 报文以后,进行如下操作:
GR Helper 维持邻居关系,刷新当前的 Holdtime。
注意:如果邻居设备不具备 GR Helper 能力,就忽略 Restart TLV,按正常的 IS-IS 过程处理,重置和 GR Restarter 的邻接关系。
STEP 02
回送一个包含 Restart TLV 的 IIH 报文(RR 清除,RA 置位,Remaining time 是从现在到 Holdtime 超时的时间间隔)。
发送 CSNP 报文和所有 LSP 报文给 GR Restarter。
STEP 03
GR Restarter 接收到邻居的 IIH 回应报文(RR=0、RA=1),做如下处理:
把 T3 的当前值和报文中 Remaining time 比较,取其中较小者作为 T3 的值。
在接口收到确认报文和 CSNP 报文之后,取消该接口的 T1 定时器。
如果该接口没有收到确认报文和 CSNP 报文,T1 会不停地重置,重发含 Restart TLV 的 IIH 报文。如果 T1 超时次数超过阈值,GR Restarter 强制取消 T1 定时器,启动正常的 IS-IS 处理流程。
注意:即在 GR 期间,Restarter 设备会将 T3 定时器的时间设置为邻居保持时间,避免 GR 期间邻居断连造成整个网络路由的重新计算。
STEP 04
当 GR Restarter 所有接口上的 T1 定时器都取消,CSNP 列表清空并且收集全所有的 LSP 报文后,可以认为和所有的邻居都完成了同步,取消 T2 定时器。
STEP 05
T2 定时器被取消,表示本 Level 的 LSDB 已经同步。
如果是单 Level 系统,则直接触发 SPF 计算。
如果是 Level-1-2 系统,此时判断另一个 Level 的 T2 定时器是否也取消。如果两个 Level 的 T2 定时器都被取消,那么触发 SPF 计算,否则等待另一个 Level 的 T2 定时器超时。
STEP 06
各层的 T2 定时器都取消后,GR Restarter 取消 T3 定时器,更新 FIB 表。GR Restarter 可以重新生成各层的 LSP 并泛洪,在同步过程中收到的自己重启前生成的 LSP 此时也可以被删除。
STEP 07
至此,GR Restarter 的 IS-IS Restarting 过程结束。
补充说明
在 Restarting 过程中,Restarter 设备进行协议重启后会同时启动 T1、T2 和 T3 定时器。T1 定时器用来控制 Restarter 设备收到 Helper 设备发送的确认 GR 的 IIH 报文的时间,T2 定时器是系统等待 LSDB 同步的最长时间,T3 定时器控制 GR 完成的时间。正常的 GR 过程中,当 Level-1 和 Level-2 都完成了 LSDB 同步后,取消 T3 定时器。如果 T3 定时器超时仍未完成 LSDB 同步,则 GR 失败。
IS-IS GR Starting
设备重启触发的 GR 过程称为 Starting,进行 FIB 表更新。
对于 Starting 设备,因为没有保留 FIB 表项,所以一方面希望在 Starting 之前和自己的邻接关系为“Up”的邻居重置和自己的邻接关系,同时希望邻居能在一段时间内抑制和自己的邻接关系的发布。
STEP 01
GR Restarter Starting 后,进行如下操作:
为每层 LSDB 的同步启动 T2 定时器。
从各个接口发送携带 Restart TLV 的 IIH 报文,其中 RR 位清除,SA 位置位。
补充说明:
RR 位清除表示 Starting 完成。
SA 位置位则表示希望邻居在收到 SA 位清除的 IIH 报文之前,一直抑制和自己的邻接关系的发布。
STEP 02
邻居收到携带 Restart TLV 的 IIH 报文,根据设备是否支持 GR,进行如下处理:
支持 GR:重新初始化邻接关系。
不支持 GR:邻居忽略 Restart TLV,重置和 GR Restarter 之间的邻接关系。
补充说明:
支持 GR:重新初始化邻接关系。在发送的 LSP 中取消和 GR Restarter 邻接关系的描述,进行 SPF 计算时也不考虑和 GR Restarter 相连的链路,直到收到 SA 位清除的 IIH 为止。
不支持 GR:邻居忽略 Restart TLV,重置和 GR Restarter 之间的邻接关系。回应一个不含 Restart TLV 的 IIH 报文,转入正常的 IS-IS 处理流程。这时不会抑制和 GR Restarter 的邻接关系的发布。在点到点链路上,还会发送一个 CSNP 报文。
STEP 03
邻接关系重新初始化之后,在每个接口上 GR Restarter 都和邻居重建邻接关系。当有一个邻接关系到达 Up 状态后,GR Restarter 为该接口启动 T1 定时器。
STEP 04
在 T1 定时器超时之后,GR Restarter 发送 RR 置位、SA 置位的 IIH 报文。
STEP 05
邻居收到 RR 置位和 SA 置位的 IIH 报文后,发送一个 RR 清除、RA 置位的 IIH 报文作为确认报文,并发送 CSNP 报文。
STEP 06
GR Restarter 收到邻居的 IIH 确认报文和 CSNP 报文以后,取消 T1 定时器。
STEP 07
如果没有收到 IIH 报文或者 CSNP 报文,就不停重置 T1 定时器,重发 RR 置位、SA 置位的 IIH 报文。如果 T1 超时次数超过阈值,GR Restarter 强制取消 T1 定时器,进入正常的 IS-IS 处理流程完成 LSDB 同步。
STEP 08
GR Restarter 收到 Helper 端的 CSNP 以后,开始同步 LSDB。
STEP 09
本 Level 的 LSDB 同步完成后,GR Restarter 取消 T2 定时器。
STEP 10
所有的 T2 定时器都取消以后,启动 SPF 计算,重新生成 LSP,并泛洪。
STEP 11
至此,GR Restarter 的 IS-IS Starting 过程完成。
配置案例
使能 IS-IS 协议的 GR 能力。 [Huawei-isis-1] graceful-restart 配置 IS-IS 邻居的 Holdtime 不受 GR 影响,保持原来的数据。 缺省情况下,配置 IS-IS GR 后,邻居的 Holdtime 值如果小于 60 秒,则修改为 60 秒,否则保持原 Holdtime 值。 [Huawei-isis-1] graceful-restart no-impact-holdtime (可选)配置 IS-IS GR 过程中 T3 定时器的时间。 缺省情况下,GR T3 定时器为 300 秒。 [Huawei-isis-1] graceful-restart interval interval-value (可选)配置 IS-IS GR 过程中 T2 定时器的时间。 缺省情况下,GR T2 定时器为 60 秒。 [Huawei-isis-1] graceful-restart t2-interval interval-value (可选)配置 GR Restarter 来抑制重启 TLV 的 SA 位。 [Huawei-isis-1] graceful-restart suppress-sa 查看 IS-IS GR 的状态信息。 [Huawei] display isis process-id graceful-restart status [ level-1 | level-2 ] [Huawei] display isis graceful-restart status [ level-1 | level-2 ] [ process-id | vpn-instance vpn-instance-name ] level-1:显示 Level-1 的 IS-IS GR 状态信息。 level-2:显示 Level-2 的 IS-IS GR 状态信息。 process-id:显示指定 IS-IS 进程的 IS-IS GR 状态信息。整数类型,取值范围是 1~65535。 vpn-instance vpn-instance-name:显示指定 VPN 的 IS-IS 多实例进程的 IS-IS GR 状态信息。字符串形式,区分大小写,不支持空格,长度范围是 1~31。当输入的字符串两端使用双引号时,可在字符串中输入空格。
命令 graceful-restart no-impact-holdtime 应用场景:
在 IS-IS 网络中,如果一端配置了 GR,则邻居会自动刷新邻居保持时间 Holdtime,如果原 Holdtime 值小于 60 秒则刷新为 60 秒,否则保留原 Holdtime 值,即刷新后邻居的 Holdtime 值最小为 60 秒。因此,在非 GR 期间,链路一端发生了故障,则另一端至少需要 60 秒才能感知故障,在此期间可能会造成大量的丢包,降低了网络的安全性和可靠性。
基于上述情况,可以通过配置 graceful-restart no-impact-holdtime 命令解决该问题,在配置 IS-IS GR 后,仍然可以快速检测邻居状态,实现网络快速收敛。
命令 graceful-restart interval interval-value 和命令 graceful-restart t2-interval interval-value:
interval interval-value:指定 GR 过程中 T3 或 T2 定时器的时间。整数形式,取值范围是 30~1800,单位是秒。
建议配置 T3 定时器的时间大于 T2 定时器的时间,否则可能会导致 GR 失败。
命令 graceful-restart suppress-sa 应用场景:
第一次启动(不包括 GR 后)的路由器不会对转发状态进行维护。如果该路由器不是第一次启动,则它前一次运行时生成的 LSP 可能还存在于网络中其它路由器的 LSP 数据库中。
由于路由器启动时 LSP 分片的序列号也被重新初始化,网络中其它路由器保存的 LSP 拷贝可能会比该路由器启动后新产生的 LSP 看上去更“新”。这将导致网络中出现暂时的“黑洞” ,并一直持续到该路由器重新生成自己的 LSP 且以最高序列号将它们发布出去。
如果该路由器的邻居在路由器启动过程中抑制发布邻接关系到此路由器,直到该路由器将更新的 LSP 发布出去,上述情况也可以避免。因此可以通过 graceful-restart suppress-sa 命令抑制重启 TLV 的 SA 位。