BGP 的连接状态和活动状态有什么区别?

网络工程 bgp 协议理论
2021-07-09 09:32:50

当两者都尝试建立 TCP 连接时,在 FSM 中具有两种不同的状态有什么意义?

2个回答

BGP 对等体以空闲状态开始在空闲状态下,对等体已被配置为彼此形成邻接关系,但尚未发起或接收任何通信。

BGP 使用 TCP 作为传输协议。所以要建立BGP邻接关系,首先要建立TCP连接。当两个对等体都处于空闲状态时,它们每个都会以独立的时间间隔(基于 BGP 对等配置实际完成的时间)定期尝试启动 TCP 连接。

当一个对等方使用 SYN发起TCP 三向握手时,对等方转换为活动状态。此状态表示本地路由器正在主动尝试发起 TCP 连接。

当另一个对等方收到来自其对等方的 TCP SYN 时,它将转换为连接状态。此状态表示本地路由器已收到来自其他路由器的 TCP 启动,并且正在/已使用 SYN ACK 进行响应。

从那里,两个对等点继续通过其余状态:打开发送、打开确认、建立。

总结一下:

  • 活动状态 - 本地路由器刚刚发送了一个 TCP SYN
  • 连接状态 - 本地路由器刚刚从它的对等方接收到一个 TCP SYN

“发起” BGP 说话者的状态转换以形成邻接将是: Idle, Active, Open Sent, Open Received,Established

“响应” BGP 说话者形成邻接的状态转换将是: Idle, Connect, Open Sent, Open Received,Established

注意,只有发起 TCP 握手的对等方通过Active状态。并且只有没有发起 TCP 握手的对等方通过该Connect状态。


添加一些证明行为的调试。这是 Cisco 路由器代码版本 15.4(1)T。

这是来自 R1 (9.9.12.1) 和 R2 (9.9.12.2) 之间的 BGP 对等会话。

R2 是此 TCP 会话的发起方:

router1# show ip bgp neighbors | i ^BGP|host
BGP neighbor is 9.9.12.2,  remote AS 2323, external link
Local host: 9.9.12.1, Local port: 179
Foreign host: 9.9.12.2, Foreign port: 43876

在另一台路由器上确认:

router2# show ip bgp neighbors | i ^BGP|host
BGP neighbor is 9.9.12.1,  remote AS 1111, external link
Local host: 9.9.12.2, Local port: 43876
Foreign host: 9.9.12.1, Foreign port: 179

这是发起者 R2 上的(过滤的)调试:

$ cat BGP-Peering_Initiator.txt | grep -e "TCP src" -e "went from"
*Oct 28 17:06:36.971: BGP: 9.9.12.1 active went from Idle to Active
*Oct 28 17:06:36.972:     TCP src=43876, dst=179, seq=1526684246, ack=0, win=16384 SYN
*Oct 28 17:06:36.975:     TCP src=179, dst=43876, seq=2072809595, ack=1526684247, win=16384 ACK SYN
*Oct 28 17:06:36.975:     TCP src=43876, dst=179, seq=1526684247, ack=2072809596, win=16384 ACK
*Oct 28 17:06:36.977: BGP: 9.9.12.1 active went from Active to OpenSent
*Oct 28 17:06:36.982:     TCP src=43876, dst=179, seq=1526684247, ack=2072809596, win=16384 ACK PSH
*Oct 28 17:06:36.985:     TCP src=179, dst=43876, seq=2072809596, ack=1526684304, win=16327 ACK
*Oct 28 17:06:36.985:     TCP src=179, dst=43876, seq=2072809596, ack=1526684304, win=16327 ACK PSH
*Oct 28 17:06:36.985: BGP: 9.9.12.1 active went from OpenSent to OpenConfirm
*Oct 28 17:06:36.985:     TCP src=43876, dst=179, seq=1526684304, ack=2072809653, win=16327 ACK PSH
*Oct 28 17:06:36.987:     TCP src=179, dst=43876, seq=2072809653, ack=1526684304, win=16327 ACK PSH
*Oct 28 17:06:36.987: BGP: 9.9.12.1 active went from OpenConfirm to Established

这是响应方 R1 上的(过滤的)调试:

$ cat BGP-Peering_Responder.txt | grep -e "TCP src" -e "went from"
*Oct 28 17:06:36.973:     TCP src=43876, dst=179, seq=1526684246, ack=0, win=16384 SYN
*Oct 28 17:06:36.974:     TCP src=179, dst=43876, seq=2072809595, ack=1526684247, win=16384 ACK SYN
*Oct 28 17:06:36.976:     TCP src=43876, dst=179, seq=1526684247, ack=2072809596, win=16384 ACK
*Oct 28 17:06:36.976: BGP: 9.9.12.2 passive went from Idle to Connect
*Oct 28 17:06:36.983:     TCP src=43876, dst=179, seq=1526684247, ack=2072809596, win=16384 ACK PSH
*Oct 28 17:06:36.984:     TCP src=179, dst=43876, seq=2072809596, ack=1526684304, win=16327 ACK
*Oct 28 17:06:36.984: BGP: 9.9.12.2 passive went from Connect to OpenSent
*Oct 28 17:06:36.984: BGP: 9.9.12.2 passive went from OpenSent to OpenConfirm
*Oct 28 17:06:36.985:     TCP src=179, dst=43876, seq=2072809596, ack=1526684304, win=16327 ACK PSH
*Oct 28 17:06:36.986:     TCP src=179, dst=43876, seq=2072809653, ack=1526684304, win=16327 ACK PSH
*Oct 28 17:06:36.986:     TCP src=43876, dst=179, seq=1526684304, ack=2072809653, win=16327 ACK PSH
*Oct 28 17:06:36.986: BGP: 9.9.12.2 passive went from OpenConfirm to Established

TCP 在两个对等体之间建立连接,BGP 使用 TCP。一个 TCP 对等体将尝试连接到另一个 TCP 对等体,这就是connect状态。一个对等方可能会侦听连接(尤其是在其连接尝试失败之后),这就是active状态。

BGP 有多种状态,每个状态都清楚地记录在RFC 4271,边界网关协议 4 (BGP-4) 中状态的描述和从一个移动到另一个(和/或返回)的描述实在是太大了,无法在这里讨论。下面是描述 BGP 有限状态机 (FSM) 的图像:

在此处输入图片说明

RFC 完整描述了 FSM 的各种状态以及每个阶段发生的情况

从空闲状态开始,当系统上发生 ManualStart 或 AutomaticStart 事件时,它会将其状态更改为 Connect,但这些事件的被动版本(ManualStart_with_PassiveTcpEstablishment 或 AutomaticStart_with_PassiveTcpEstablishment)发生,然后将其状态更改为 Active。基本上,当它被告知连接到对等点时,它会更改为 Connect,但是当被告知要侦听对等点时,它会更改为 Active。

当处于 Connect 状态时,如果 TCP 连接失败,它会将其状态更改为 Active 以侦听来自对等方的连接。

当处于 Active 状态,并且 ConnectRetryTimer_Expires 事件发生时,它会尝试 TCP 连接并进入 Connect 状态。

确实有更多的东西,但它对于这样的网站来说太大了。