BGP(边界网关协议)详解
BGP(Border Gateway Protocol) 是一种用于在不同自治系统(AS)之间交换路由信息的外部网关协议(EGP),广泛应用于互联网核心路由。它是路径矢量协议,基于TCP(端口179),具有高可靠性和可扩展性。
一、BGP的报文类型
-
Open报文
- 作用:建立BGP邻居关系,协商参数(如版本、AS号、Hold Time、BGP标识符等)。
- 触发时机:TCP连接建立后发送的第一个报文。
-
Update报文
- 作用:携带路由更新信息(新增/撤销路由),包含路径属性(如AS路径、下一跳、Local Preference等)。
- 关键字段:NLRI(网络层可达信息)、Withdrawn Routes(撤销的路由)。
-
Keepalive报文
- 作用:维持BGP邻居关系,周期性发送(默认间隔60秒)。
- 规则:Hold Time超时若未收到Keepalive,邻居关系断开。
-
Notification报文
- 作用:在检测到错误时(如参数不匹配)立即发送,终止BGP连接。
- 包含信息:错误代码和子代码(如版本不支持、AS号无效等)。
-
Route-Refresh报文(可选)
- 作用:动态请求邻居重新发送路由信息,需双方支持此能力(通过Open报文协商)。
- 场景:策略变更后需刷新路由表时使用。
二、BGP邻居状态机
BGP邻居建立需经历以下状态转换:
-
Idle(空闲)
- 初始状态:拒绝所有连接尝试,可能因管理员触发或错误恢复后进入。
- 动作:启动连接重试定时器,尝试发起TCP连接。
-
Connect(连接中)
- 动作:等待TCP连接完成。
- 转换:
- 成功 → 发送Open报文,进入OpenSent。
- 失败 → 进入Active状态,尝试重新连接。
-
Active(活跃)
- 动作:持续尝试建立TCP连接。
- 转换:
- 成功 → 发送Open报文,进入OpenSent。
- 失败 → 返回Idle。
-
OpenSent(Open已发送)
- 动作:已发送Open报文,等待对端Open报文。
- 转换:
- 收到合法Open报文 → 发送Keepalive,进入OpenConfirm。
- 参数不匹配 → 发送Notification并回到Idle。
-
OpenConfirm(Open已确认)
- 动作:等待对端Keepalive报文。
- 转换:
- 收到Keepalive → 进入Established。
- Hold Time超时 → 回到Idle。
-
Established(已建立)
- 最终状态:邻居关系建立成功,开始交换Update/Keepalive报文。
- 异常:若收到Notification或Keepalive超时,回到Idle。
三、BGP邻居建立过程
-
TCP连接建立
- 发起方(通常为两端中较低路由器ID的一方)尝试与对端(端口179)建立TCP连接。
-
Open报文交换
- 双方发送Open报文,协商参数:
- BGP版本:必须一致(通常为BGPv4)。
- AS号:若为eBGP邻居,需不同;iBGP则相同。
- Hold Time:双方协商较小值(默认180秒)。
- BGP标识符:通常为路由器Loopback地址。
- 双方发送Open报文,协商参数:
-
Keepalive确认
- 参数匹配后,双方发送Keepalive报文确认,进入Established状态。
-
路由信息交换
- 通过Update报文交换路由表,携带路径属性和策略信息。
-
维护与错误处理
- 周期性发送Keepalive维持连接。
- 检测到错误时发送Notification报文终止会话。