BGP有限状态机(Finite State Machine) 究极版
BGP Finite State Machine (FSM)BGP Session attributes
①. Mandatory for each connection
1) State
2) Connect Retry Counter
3) Connect Retry Timer
4) Connect Retry Time
5) HoldTimer
6) HoldTime
7) Keepalive Timer
8) Keepalive Time
②. Optional for each connection
Group 1—— Automatic Administrative Events (Start/Stop)
○ 1)Allow Automatic Start
○ 2)Allow Automatic Stop
○ 3)Damp Peer Oscillations
○ 4)Idle Hold Time
○ 5)Idle Hold Timer
§ 如果BGP Peer反复“振动”(Connected/Disconnected,具体何谓“反复”有厂家自定)——
□ Damp Peer Oscillations转变为True。
□ 设置Idle Hold Timer,相应的FSM在Idle Hold Time内保持Idle状态。
Group 2 —— Unconfigured Peers
○ 6)Accept Connections Unconfigured Peers
§ BGP Speaker可以接受没有在本地手工指定BGP连接
Group 3 —— TCP processing
○ 7)Passive Tcp Establishment
§ BGPFSM只会被动地等待BGP Peer去建立TCP连接
○ 8)Track Tcp State
§ BGP FSM追踪TCP 连接的最终结果,而不是个别的TCP Message
Group 4 —— BGP Message Processing
○ 9)Collision Detect Established State
§ 当检测到冲突,允许和Established状态的连接对比Router-ID
§ 否则,正常情况下,会在丢弃一切新的【和Established连接冲突】的连接
○ 10) DelayOpen
§ 允许延时(DelayOpenTime)发送Open Message
§ 使Peer先发出Open Message
○ 11) Delay Open Time
○ 12) Delay Open Timer
○ 13) Send Notification without Open
§ 允许在在发送Open之前发送Notification
Administrative Events
——
1、Manual Start
2、Manual Stop
3、Automatic Start
4、Manual Start with Passive Tcp Establishment
5、Automatic Start with Passive Tcp Establishment
6、Automatic Start with Damp Peer Oscillations
7、Automatic Start with Damp Peer Oscillations and Passive Tcp Establishment
8、Automatic Stop
9、Connect Retry Timer Expires
10、Hold Timer Expires
11、Keepalive Timer Expires
12、Delay Open Timer Expires
13、Idle Hold Timer Expires
14、Tcp Connection Valid —— A Tcp Connection received for a valid port
15、Tcp Connec Request Invalid
16、Tcp Connec Request Acked
17、Tcp Connection Confirmed
18、Tcp Connection Fails
19、BGP Open
20、BGP Open with Delay Open Timer running
21、BGP Header Error
22、BGP Open Message Error
23、Open Collision Dump
24、Notification Message Version Error
25、Notification Message
26、Keepalive Message
27、Update Message
28、Update Message Error
Finite State Machine (FSM)
——
BGP为每个Peer分别维持独立的FSM
术语“Active”和“Passive”——
○ 对于TCP连接来说,一边是Actice Side,一边是Passive Side
§ 发起第一个TCP Syn的一方为Active Side,
□ 其BGP连接为Outgoing Connection
§ 发起第一个Syn/Ack的一方为Passive Side,
□ 其BGP连接为Incoming Connection
○ 当TCP连接建立起来以后,“Active”和“Passive”完全不影响BGP连接。
§ 唯一区别在于哪一边使用了Port 179。
所有BGP Speaker都必须监听TCP port 179
所有BGP Sperker都会尝试连接(未建立连接的)Peer的TCP port 179,除非——
○ FSM被设定在Idle状态
○ BGP(TCP)连接为Passive模式
①. Idle State
○ 在FSM初始化之后,处于Idle状态
○ 在Idle状态下,FSM拒绝一切Incoming Connection
○ 如果触发Event 1、3、4、5——
□ 初始化连接所需资源
□ 把【Connect Retry Counter】初始化为0
□ 开启【Connect Retry Timer】
□ 发起对Peer的Outgoing Connection
‥舀鱙触发的是Event 4、5,不执行此项。
□ 侦听Incoming Connection(TCP port 179)
□ 将状态跃迁至Connect
‥舀鱙触发的是Event 4、5,跃迁至Active状态
○ 在Idle状态下,无视Event 2、8~12、15~28
○ 如果BGP连接属性Damp Peer Oscillations为True
□ 在Idle状态可以触发Event 6、7、13,用以防止Peer翻动
②. Connect State
○ 在Connect状态下,FSM等待TCP连接完成
○ 在Connect状态下,FSM无视所有Start Event(Event 1,3~7)
○ 如果触发Event 2(Manual Stop)
□ Drop掉TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】初始化为0
□ 停止【Connect Retry Timer】,并设置为0
□ 将状态跃迁至Idle
○ 如果触发Event 9(Connect Retry Timer Expires)
□ Drop掉TCP连接
□ 重启【Connect Retry Timer】(置为初始值)
□ 停止【Delay Open Timer】,并设置为0
□ 发起对Peer的Outgoing Connection(发起TCP连接)
□ 侦听Incoming Connection(TCP port 179)
□ 状态继续维持在Connect
○ 如果触发Event 14(Tcp Connection Valid)
□ 等待处理TCP连接
□ 状态继续维持在Connect
○ 如果触发Event 15(Tcp Connec Request Invalid)
□ 拒绝掉该TCP连接
□ 状态继续维持在Connect
○ 如果TCP连接成功建立(触发了Event 16或17)
□ 检测连接属性Delay Open ——
如果Delay Open为True
‥尀扐【Connect Retry Timer】,并设置为0。
‥言【Delay Open Timer】设为初始值(并开始计时)
‥状态继续维持在Connect
} 如果触发Event 20(Received Open with Delay Open Timer running)
□ 停止【Connect Retry Timer】,并设置为0
□ 停止【Delay Open Timer】,并设置为0
□ 向Peer发送Open Message
□ 向Peer发送Keepalive Message
w 如果协商的Hold Time非0
w 开启Keepalive Timer
w 将Hold Time设为协商值
w 如果协商的Hold Time为0
w 将Keepalive Timer清零
w 将Hold Time设为0
□ 状态跃迁至OpenConfirm
} 如果触发Event 12(Delay Open TimerExpires)
□ 向Peer发送Open Message
□ 将【Hold Time】设为一个非常大的值(RFC建议为4 min)
□ 状态跃迁至Open Sent
如果Delay Open为False
‥尀扐【Connect Retry Timer】,并设置为0。
‥向Peer发送Open Message
‥将【Hold Time】设为一个非常大的值(RFC建议为4 min)
‥状态跃迁至Open Sent
○ 如果触发Event 18(Tcp Connection Fails)
□ 检测连接属性Delay Open ——
如果Delay Open为True
‥重启【Connect Retry Timer】(置为初始值)
‥尀扐【Delay Open Timer】,并设置为0
‥侦听Incoming Connection(TCP port 179)
‥状态跃迁至Active
如果Delay Open为False
‥尀扐【Connect Retry Timer】,并设置为0
‥Drop掉该TCP连接
‥释放占用的相关硬件资源
‥状态跃迁至Idle
○ 如果触发Event 21、22(Error Checked)
□ 如果连接属性Send Notification without Open为True
发送Notification
□ 停止【Connect Retry Timer】,并设置为0
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】+ 1
□ 如果连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
□ 状态跃迁至Idle
○ 如果触发Event 24(Received Notification Message Version Error)
□ 检测【Delay Open Timer】是否运行——
如果【Delay Open Timer】正在运行
‥尀扐【Connect Retry Timer】,并设置为0
‥尀扐【Delay Open Timer】,并设置为0
‥Drop掉该TCP连接
‥释放占用的相关硬件资源
‥状态跃迁至Idle
如果【Delay Open Timer】没有启动
‥尀扐【Connect Retry Timer】,并设置为0
‥Drop掉该TCP连接
‥释放占用的相关硬件资源
‥言【Connect Retry Counter】+ 1
‥舀鱙连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
‥状态跃迁至Idle
○ 如果触发其他任何Event(8,10,11,13,19,23,25~28)
□ 停止【Connect Retry Timer】,并设置为0
□ 停止【Delay Open Timer】,并设置为0
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】+ 1
□ 如果连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
□ 状态跃迁至Idle
③. Active State
○ 在Active状态,FSM尝试通过侦听Incoming Connection(TCP port 179)来获取一个TCP连接,进而获取一个BGP Peer。
○ 在Actice状态下,FSM无视所有Start Event(Event 1,3~7)。
○ 如果触发Event 2(Manual Stop)
□ 如果连接属性Send Notification without Open为True
发送Notification(Err.Code = Cease)
□ Drop掉TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】初始化为0
□ 停止【Connect Retry Timer】,并设置为0
□ 将状态跃迁至Idle
○ 如果触发Event 9(Connect Retry Timer Expires)
□ Drop掉TCP连接
□ 重启【Connect Retry Timer】(置为初始值)
□ 发起对Peer的Outgoing Connection(发起TCP连接)
□ 侦听Incoming Connection(TCP port 179)
□ 状态跃迁至Connect
○ 如果触发Event 14(Tcp Connection Valid)
□ 等待处理TCP连接
□ 状态继续维持在Active
○ 如果触发Event 15(Tcp Connec Request Invalid)
□ 拒绝掉该TCP连接
□ 状态继续维持在Active
○ 如果TCP连接成功建立(触发了Event 16或17)
□ 检测连接属性Delay Open ——
如果Delay Open为True
‥尀扐【Connect Retry Timer】,并设置为0。
‥言【Delay Open Timer】设为初始值(并开始计时)
‥状态继续维持在Active
} 如果触发Event 20(Received Open with Delay Open Timer running)
□ 处理方法同Connect状态
□ 状态跃迁至OpenConfirm
} 如果触发Event 12(Delay Open TimerExpires)
□ 停止【Connect Retry Timer】,并设置为0
□ 停止【Delay Open Timer】,并设置为0
□ 向Peer发送Open Message
□ 将【Hold Time】设为一个非常大的值(RFC建议为4 min)
□ 状态跃迁至Open Sent
如果Delay Open为False
‥处理方法同Connect状态
‥状态跃迁至Open Sent
○ 如果触发Event 18(Tcp Connection Fails)
□ 重启【Connect Retry Timer】(置为初始值)
□ 停止【Delay Open Timer】,并设置为0
□ 释放占用的相关硬件资源
□ 如果连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
□ 状态跃迁至Idle
○ 如果触发Event 21、22(Error Checked)
□ 处理方法同Connect状态
□ 状态跃迁至Idle
○ 如果触发Event 24(Received Notification Message Version Error)
□ 处理方法同Connect状态
□ 状态跃迁至Idle
○ 如果触发其他任何Event(8,10,11,13,19,23,25~28)
□ 停止【Connect Retry Timer】,并设置为0
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】+ 1
□ 如果连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
□ 状态跃迁至Idle
④. OpenSent State
○ 在OpenSent状态,FSM等待从邻居发过来的Open Message。
○ 在OpenSent状态下,FSM无视所有Start Event(Event 1,3~7)。
○ 在OpenSent状态下,FSM无视Event 15(Tcp Connec Request Invalid)
○ 如果触发Event 2(Manual Stop)
□ 发送Notification(Err.Code = Cease)
□ 其余处理方法同Connect状态
□ 状态跃迁至Idle
○ 如果触发Event 8(Automatic Stop)
□ 发送Notification(Err.Code = Cease)
□ 其余处理方法同Connect状态
□ 状态跃迁至Idle
○ 如果触发Event 10(Hold Timer Expires)
□ 发送Notification(Err.Code = 4,Hold Time Expired)
□ 其余处理方法同Connect状态
□ 状态跃迁至Idle
○ 如果触发了Event 14、16、17(Tcp Connection Valid、Tcp Connec Request Acked、Tcp Connection Confirmed)
□ 表明可能出现了新的冲突的TCP连接
当收到Open Message(状态转变为OpenConfirm)后,开始执行连接冲突检测/处理进程。
○ 如果触发了Event 18(Tcp Connection Fails)
□ 关闭BGP连接
□ 重启【Connect Retry Timer】
□ 侦听Incoming Connection(TCP port 179)
□ 状态跃迁至Active
○ 如果触发了Event 19(Received BGP Open Message with no Errors)
□ 停止【Connect Retry Timer】,并设置为0
□ 停止【Delay Open Timer】,并设置为0
□ 发送Keepalive Message
根据协商值设置Hold Timer
根据Hold Timer协商值和本地手工配置值,设置Keepalive Timer
□ 状态跃迁至OpenConfirm
○ 如果触发Event 21、22(Error Checked)
□ 发送Notification
□ 其余处理方法同Connect状态
□ 状态跃迁至Idle
○ 如果触发Event 19、20(ReceivedaValidOpenMessage)
□ 开启连接冲突检测机制
如果检测到冲突,并且处理结果需要关闭当前连接
‥生成并触发Event 23(Open Collision Dump)
} 发送Notification(Err.Code = Cease)
} 停止【Connect Retry Timer】,并设置为0
} Drop掉该TCP连接
} 释放占用的相关硬件资源
} 把【Connect Retry Counter】+ 1
} 如果连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
} 状态跃迁至Idle
○ 如果触发Event 24(Received Notification Message Version Error)
□ 停止【Connect Retry Timer】,并设置为0
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 状态跃迁至Idle
○ 如果触发其他任何Event(9,11,12 ,13,20,25~28)
□ 发送Notification(Err.Code = FSM)
□ 停止【Connect Retry Timer】,并设置为0
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】+ 1
□ 如果连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
□ 状态跃迁至Idle
⑤. OpenConfirm State
○ 在OpenConfirm状态,FSM等待从邻居发过来的Keepalive Message或Notification Message。
○ 在OpenConfirm状态下,FSM无视所有Start Event(Event 1,3~7)
○ 在OpenConfirm状态下,FSM无视Event 15(Tcp Connec Request Invalid)
○ 如果触发Event 2、8、10(Manual Stop、Automatic Stop、Hold Timer Expires)
□ 处理方法同OpenSent状态
□ 状态跃迁至Idle
○ 如果触发Event 11(Keepalive Timer Expires)
□ 向Peer发送Keepalive Message
□ 重启Keepalive Timer
□ 状态继续维持在OpenConfirm
○ 如果触发了Event 14、16、17(Tcp Connection Valid、Tcp Connect Request Acked、Tcp Connection Confirmed)
□ 执行连接冲突检测/处理进程。
○ 如果触发了Event 18或25(Tcp Connection Fails、Notification Message)
□ 停止【Connect Retry Timer】,并设置为0
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】+ 1
□ 如果连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
□ 状态跃迁至Idle
○ 如果触发Event 24(Received Notification Message Version Error)
□ 处理方法同OpenSent状态
□ 状态跃迁至Idle
○ 如果触发Event 19(OpenMessage)
□ 开启连接冲突检测机制
如果检测到冲突,并且处理结果需要关闭当前连接
‥生成并触发Event 23(Open Collision Dump)
} 处理方法同OpenSent状态
} 状态跃迁至Idle
○ 如果触发Event 21、22(Error Checked)
□ 发送Notification
□ 其余处理方法同Connect状态
□ 状态跃迁至Idle
○ 如果触发Event 26(Keepalive Message)
□ 重启Hold Timer
□ 状态跃迁至Established
○ 如果触发其他任何Event(9,11,12 ,13,20,27,28)
□ 处理方法同OpenSent状态
□ 状态跃迁至Idle
⑥. Established State
○ 在Established态,BGP Speaker可以和Peer交换Update、Keepalive、Notification Message。
○ 在Established状态下,FSM无视所有Start Event(Event 1,3~7)
○ 在Established状态下,FSM无视Event 15(Tcp Connec Request Invalid)
○ 如果触发Event 2、8、10(Manual Stop、Automatic Stop、Hold Timer Expires)
□ 处理方法同OpenSent状态
□ 状态跃迁至Idle
※.例如,BGP Speaker收到一个Update,导致从Peer收到的前缀数量超出设置的阈值。就可能触发Automatic Stop。
○ 如果触发Event 11
□ 向Peer发送Keepalive Message
□ 重启Keepalive Timer
除非协商的Hold Time为0
○ 如果触发Event 14(Tcp Connection Valid)
□ 执行连接冲突检测/处理进程。
○ 如果触发Event 16或17(Tcp Connect Request Acked、Tcp Connection Confirmed)
□ 在接收该BGP连接的Open Message后,执行连接冲突检测/处理进程。
○ 如果触发Event 19(Received BGP Open)
□ 如果连接属性CollisionDetectEstablishedState为True
开启连接冲突检测机制
‥舀鱙检测到冲突,并且处理结果需要关闭当前连接
} 生成并触发Event 23(Open Collision Dump)
处理方法同OpenSent状态
状态跃迁至Idle
○ 如果触发Event 18或24或25(Tcp Connection Fails、Received Notification Message Version Error、Notification Message)
□ 停止【Connect Retry Timer】,并设置为0
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】+ 1
□ 状态跃迁至Idle
○ 如果触发Event 26(Keepalive Message)
□ 如果协商的Hold Time非0
重启Hold Timer
□ 状态继续维持在Established
○ 如果触发Event 28(Update Message Error)
□ 发送Notification(Err.Code = 3,Update Message Error)
□ 停止【Connect Retry Timer】,并设置为0
□ 删除所有与此BGP连接相关的路由
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】+ 1
□ 如果连接属性Damp Peer Oscillations为True
启用相关防止Peer翻动的策略
□ 状态跃迁至Idle
○ ○ 如果触发其他任何Event(9,12 ,13,20,21,22)
□ 发送Notification(Err.Code = FSM)
□ 停止【Connect Retry Timer】,并设置为0
□ Drop掉该TCP连接
□ 释放占用的相关硬件资源
□ 把【Connect Retry Counter】+ 1
□ 如果连接属性Damp Peer Oscillations为True
‥启用相关防止Peer翻动的策略
状态跃迁至Idle
有文档么,有些字乱码了 Thanks for your information. 谢谢分享! Thanks for sharing
页:
[1]