文/陈磊
关于GR通用的基本概念,原理,以及作用,请参考《网络之路-OSPF专题讨论》中的文章《OSPF Graceful Restart》。
该文对于GR的来源,作用和通原理做了详细的介绍,本文将跳过这方面,直接进入BGP GR实现的介绍。
从GR中完成的任务来看,分为GR Restarter(协议重起的设备)和GR Helper(协助完成协议重起的设备)两个角色。在本文中,将BGP GR过程中的GR Restarter称为Restarting Speaker,GR Helper称为Receiving Speaker。
为了实现GR,BGP必须满足以下几点:
Ø 在邻居之间通告各自的GR能力;
Ø GR被触发后,通知邻居GR事件的发生;
Ø Receiving Speaker上,在与Restarting Speaker之间的BGP会话所依赖的TCP连接中断后或者重建过程中,需要保留并使用从Restarting Speaker学来的路由,并进行相应的标记和维护;
Ø GR正常结束时机的确定,以及异常退出的条件;
为了做到以上几点,BGP引入了如下的变化:
定义:一个不包含任何NLRI,或withdrawn NLRI 的update被定义为Marker for End-of-RIB。
如:当一个BGP连接建立完成后,设备会向邻居发送自己的BGP路由。当所有路由发送完成后,会在最后一个Update后,再发送一个空的Update,这个空的Update就是Marker for End-of-RIB。被用作路由信息表结束的标志。
End-of-RIB可以帮助设备确认已经学习到了邻居所有的路由,是GR正常结束的条件之一。
GR引入的新BGP capability类型。该能力放在BGP的Open报文中携带,用来在邻居之间通告各自的GR能力;同时,在发生RP(Route Processor)切换事件后,通知对端GR状态的开始。
该CAP的定义如下:
Capability code::64
Capability length:可变长度
Capability value:由Restart Flags,Restart Time,地址族编号组成。
可以按照不同的地址族,分别通告其GR能力
Restart Flags (4 bits) |
Restart Time in seconds (12 bits) |
Address Family Identifier (16 bits) |
Subsequent Address Family Identifier (8 bits) |
Flags for Address Family (8 bits) |
... |
Address Family Identifier (16 bits) |
Subsequent Address Family Identifier (8 bits) |
Flags for Address Family (8 bits) |
Ø Restart Flags:该Flag只使用了最高位的一个bit。当Restarting Speaker发生RP切换后,新的RP重新触发BGP邻居的建立,发送的第一个OPEN报文中,该flag会置位。用来告知Receiving Speaker邻居,本端的BGP开始GR。
Ø Restart time:由Restarting Speaker告知Receiving Speaker,GR过程中,邻居关系建立需要的时间上限。
Ø AFI,SAFI,Flags for Address Family:这三个字段组合,实现了GR能力的通告。AFI/SAFI是MP-BGP中用来区分不同网络层协议的地址族编号。每个地址族都对应了一个Flags for Address Family,表示相应的地址族对于GR的支持能力。该Flag也只使用了最高位的一个bit。当Restarting Speaker发生重启,如果能够保证在重启过程中,相应地址族报文的转发不受影响,其发送的OPEN报文中,会将相应的AFI的Flags for Address Family置位。
如果邻居的OPEN报文中含有Graceful restart capability,表示该邻居一定会在路由发送完成之后发送一个End-of-RIB marker。该标记可以帮助加速路由表的收敛。
无论设备是GR restarter还是GR helper,都要求设备在Open报文中包含Graceful restart capability。以标识自己对于GR的支持。同时,也表示自己支持End-of-RIB marker,邻居可以通过该标志来判断自己路由表的结束。
如果邻居的OPEN报文中的Graceful restart capability的capability value为空,表示邻居是一个GR aware设备:能够作为一个Receiving Speaker,可以识别Restarting Speaker的GR发起信令,配合在Restarting Speaker重起期间,保留从Restarting Speaker学习到的路由转发表项;但是,该设备自己,没有在协议重启过程中,保持路由转发表项的能力,不能做GR.。
Receiving Speaker设备在得知邻居进入GR后,会将从该邻居学来的BGP路由标记为Stale状态。标记为Stale状态的路由,在转发和选路方面,与其他路由没有区别。当GR结束后,Stale路由会根据新路由的学习情况被unmark stale状态或者被删除。
RFC4724定义了BGP GR的详细流程,结合ComwareV5的GR实现,如图1:
图1:BGP GR流程图
BGP邻居重新建立前:
RP切换前:
Ø Restarting Speaker和Receiving Speaker之间在建立BGP邻居时,通过Open报文中的Graceful restart capability来交互两者对于GR的支持,同时,使用End-of-RIB marker来标识各自路由表的结束。
RP切换后,新的RP开始启动BGP连接:
Ø 保证GR相关地址族的转发表项不受影响,在重启过程中能够正常使用。-――从Receiving Speaker转发过来的数据报文仍然能够正常转发。
Ø 重启BGP连接时,发送的OPEN报文中,restart位置位;GR过程中转发不受影响的地址族的Flags for Address Family置位。-――通知Receiving Speaker GR开始,同时,告知其哪些地址族可以实现GR。
BGP邻居重新建立后(RFC4724):
Ø 连接建立后,开始从邻居接收update信息,在此过程中,不进行BGP的路由选路,不向外发布路由。-――防止在路由收敛完成前发送了错误的路由导致环路或者路由黑洞
Ø 等待Restarting Speaker收到了所有邻居的End-of-RIB marker(不包括restart位置位的设备和Open报文中没有Graceful restart capability的设备)。―――这里的所有邻居中,不包括restart位置位的设备,是为了防止当两台相邻的设备同时重启进行GR时,都等待对方的End-of-RIB marker导致死锁。
Ø 再等待其他路由协议通知路由收敛完成,才恢复选路,刷新转发表,并向邻居发布路由。路由发布完成后,也需要发送End-of-RIB marker
BGP邻居重新建立后(我司V5平台实现):
Ø 连接建立后,开始从邻居接收update信息,在此过程中,不向外发布路由,但是,路由选路仍然进行,但是不刷新FIB;
Ø Restarting Speaker等待收到所有邻居的End-of-RIB marker后,通知路由管理该地址族退出GR,此时,开始向FIB表刷新路由
Ø 等待路由管理通知所有的路由协议都已经退出GR后,开启一个60s的定时器;
Ø 这段时间用来等待路由管理完成路由的迭代,定时器超时后,开始向Receiving Speaker发送路由,路由发送完成后,需要发送End-of-RIB marker
BGP退出GR的条件:
Ø 按照上面的流程,正常结束退出GR
Ø 定时器wait-for-rib超时,仍然没有收到所有邻居的End-of-RIB marker,则退出GR。―――该定时器用户可配,用来限制Restarting Speaker学习路由的时间上限
进入GR helper状态的条件:
Ø TCP层通知设备,与Restarting Speaker的TCP连接中断。―――被动开始
Ø 收到Restarting Speaker发出的新的Restart置位的OPEN报文。―――主动开始
侦测到GR事件后:
Ø 重置与Restarting Speaker的BGP连接,重置过程中不发送NOTIFICATION报文
Ø 标记从Restarting Speaker学到的相关地址族的路由为stale状态,当作正常的路由信息使用。―――使用stale标记进行区分,方便之后的路由管理
Ø Receiving Speaker设备的Restart位不置位,除非Receiving Speaker设备自己也进行GR。―――这里指两端同时进行GR的情况
连接建立后:
Ø 向Restarting Speaker发送路由,路由信息发送完成后,发送End-of-RIB marker。即使没有路由需要发送,也要发送End-of-RIB marker。―――以告知对方路由表的完结。
Ø 收到Restarting Speaker发送的路由后,需要使用这些路由刷新stale状态的路由
Ø 当收到Restarting Speaker发送的End-of-RIB marker后,需要立即删除该邻居相关地址族的所有仍然处于stale状态的路由。
GR helper状态的退出条件:
Ø 收到Restarting Speaker发出的路由和End-of-RIB marker,刷新自己的stale路由,正常退出
Ø 定时器Restart timer超时,与Restarting Speaker的邻居关系仍然没有建立,则退出GR helper状态,删除所有标记位stale的路由―――该定时器用户可配,用来控制GR过程的时间
Ø 与Restarting Speaker的邻居建立后,如果在其OPEN报文中没有Graceful restart capability,或者Graceful restart capability中没有某一个地址族,或者某个地址族的Flags for Address Family没有置位,则删除该邻居所有相关地址族的stale路由
支持GR的设备上,一个新BGP连接的建立,会导致旧连接的中断。这使得设备有可能受到DOS攻击。
解决方法是对BGP连接做认证。