BGP——邻居状态机+报文分析

本文深入探讨了BGP(边界网关协议)的状态机,包括从idle到established的六个状态,并详细解析了open、keeplive和其他关键报文的结构与功能。了解这些基础知识对于理解BGP的邻居建立与维护至关重要。

目录

一、BGP邻居状态机:

二、BGP报文分析:

(1) open报文:协商邻居

(2) keeplive报文:保持邻居关系

(3)其他报文 


一、BGP邻居状态机:

  • 1.1 idle状态:空闲状态,对方邻居没有起来
  • 1.2 connect: 正在建立TCP连接(被动),如果一旦建立好就进入open-sent状态,如果建立不成功进入 active状态
  • 1.3 active: 建立TCP连接(主动),查底层路由可达性,如果可达建立TCP连接;
  • 1.4 open-sent :发送BGP open报文
  • 1.5 open-confirm :在open-sent接收到邻居过来的open报文
  • 1.6 established :在open-confirm状态下收到邻居发过来的keeplive报文

详细:(16条消息) BGP状态机及其总结_艺博东的博客-CSDN博客_bgp 状态机

二、BGP报文分析:

  • (1) open报文:协商邻居

     —marker:如果BGP采用了MD5认证,此处填写认证信息
     —长度 :头部2字节+数据
     —type:open message 报文类型
     —version:表示协议版本号
     —my AS :我在那个AS里面
     —holdtime:keeplive的超时时间,默认180秒(keeplive双方不匹配,可以通过协商,建立邻居)
     —BGP identifier :BGP的RID

     —Opt Parm Len:Optional Parameters(可选参数)的长度。为0,没有可选参数。

     —Optional Paramters:BGP可选参数列表,我具备那些能力

     —My autonomous System:发送者自己的AS域号

  • (2) keeplive报文:保持邻居关系

     ——marker:如果BGP采用了MD5认证,此处填写认证信息
     ——长度 :头部2字节+数据
     ——type:keeplive message (4)

  • (3)其他报文 

  • 1.3 notification报文:错误通告报文
  • 1.4 update报文:数据库更新和删除,触发增量更新
  • 1.5 Route-refresh:软刷新报文,针对软刷新使用的,在邻居不中断的情况下申请邻居把数据库再发我一份

详细:(16条消息) BGP报文类型_曹世宏的博客-CSDN博客_bgp报文

### BGP协议报文格式与邻居状态机详解 BGP(Border Gateway Protocol)是一种基于TCP的路径矢量路由协议,其核心功能是通过特定的报文格式和状态机机制来实现可靠的路由信息传递和邻居关系管理。以下是关于BGP报文格式及邻居状态机的详细解析。 --- #### 1. BGP 报文类型 BGP 使用四种主要的报文类型来进行通信[^2]: - **Open 报文**:用于在两个BGP对等体之间建立初始连接。该报文包含版本号、AS号、保持时间、BGP标识符以及可选参数。 - **Update 报文**:用于交换路由信息。它包括路径属性、可达性信息和不可达性信息。 - **Notification 报文**:当检测到错误时发送,用于通知对端关闭BGP会话。 - **Keepalive 报文**:用于确认BGP对等体之间的连接仍然有效。如果在指定的时间内未收到任何其他类型的报文,则发送此报文以维持连接。 --- #### 2. BGP 邻居状态机 BGP 状态机描述了BGP对等体之间建立和维护邻居关系的过程。整个过程分为以下六个主要状态[^3]: - **Idle 状态**:在此状态下,BGP拒绝所有传入的连接请求。当BGP决定启动一个新的对等体连接时,它会重置连接重传定时器并转至Connect状态。 - **Connect 状态**:在此状态下,BGP等待TCP连接完成。如果连接失败且连接重传定时器超时,BGP将返回Idle状态;如果连接成功,则进入Active状态。 - **Active 状态**:在此状态下,BGP持续尝试建立TCP连接。如果TCP连接成功,BGP向对等体发送Open报文,并进入OpenSent状态。 - **OpenSent 状态**:在此状态下,BGP等待对端的Open报文。收到后,BGP检查报文是否正确。如果正确,则进入OpenConfirm状态;否则发送Notification报文并返回Idle状态。 - **OpenConfirm 状态**:在此状态下,BGP等待第一个Keepalive或Notification报文。如果收到Keepalive报文,则进入Established状态;如果收到Notification报文,则返回Idle状态。 - **Established 状态**:在此状态下,BGP对等体可以交换Update、Keepalive和Notification报文。这是BGP邻居关系完全建立的状态。 --- #### 3. BGP 报文状态机的交互 BGP报文状态机紧密相关,具体表现为: - 在Idle和Connect状态下,BGP专注于TCP连接的建立。 - 在Active状态下,BGP通过发送Open报文进入下一状态。 - 在OpenSent和OpenConfirm状态下,BGP验证对端的Open报文并等待进一步的确认。 - 在Established状态下,BGP通过Update报文交换路由信息,并通过Keepalive报文保持连接稳定。 此外,BGP 的触发更新和增量更新机制确保了路由信息的高效传递,避免了周期性更新带来的网络不稳定问题[^2]。 --- #### 4. 路由信息查看 如果需要查看某条BGP路由的详细信息,可以通过以下命令实现: ```bash display bgp routing-table ipv4-address { mask | mask-length } ``` 该命令能够展示匹配的BGP路由信息,包括路径属性、下一跳地址等细节[^4]。 --- ### 示例代码 以下是一个简单的Python脚本,用于模拟BGP状态机的部分逻辑: ```python class BGPStateMachine: def __init__(self): self.state = "Idle" def transition(self, event): if self.state == "Idle" and event == "start": self.state = "Connect" elif self.state == "Connect" and event == "tcp_success": self.state = "Active" elif self.state == "Active" and event == "open_sent": self.state = "OpenSent" elif self.state == "OpenSent" and event == "open_confirm": self.state = "OpenConfirm" elif self.state == "OpenConfirm" and event == "keepalive_received": self.state = "Established" else: self.state = "Idle" def get_state(self): return self.state # 示例运行 bgp = BGPStateMachine() bgp.transition("start") print(f"Current State: {bgp.get_state()}") # Output: Current State: Connect bgp.transition("tcp_success") print(f"Current State: {bgp.get_state()}") # Output: Current State: Active ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值