HCIP-Datacom(BGP)
BGP概述
概述
一、 协议定位与属性
- 基本定义:BGP 是一种实现自治系统(AS)之间路由可达的距离矢量协议(路径矢量)。
- 选路机制:非基于带宽/开销,而是基于路径属性(Path Attributes)进行选路。
- 关键属性:
AS_PATH、Next_hop、Origin、Local_Pref、MED等。
- 关键属性:
- 版本演进:
- BGP-4:当前 IPv4 网络通用版本。
- MP-BGP:多协议扩展 BGP,支持 IPv6、VPNv4 等多族地址。
二、 核心技术特征
- 高可靠性:承载于 TCP 179 端口。利用 TCP 的确认和重传机制,协议本身不设计复杂的可靠性校验。
- 增量更新:仅在初次建立连接时交换全量路由,后续仅发送触发式增量更新,极大地节省了带宽和 CPU 资源。
- 高扩展性:支持承载全球级(数十万条)路由条目,具备路由聚合(Summary)和路由衰减(Dampening)功能,增强网络稳定性。
三、 对等体关系(Neighbor/Peer)对比
| 特性 | EBGP (External BGP) | IBGP (Internal BGP) |
|---|---|---|
| 部署范围 | 不同自治系统(AS)之间 | 同一自治系统(AS)内部 |
| AS 号 | 必须不同 | 必须相同 |
| 物理连接 | 通常直连(非直连需配置 ebgp-multihop) |
无需直连(逻辑可达即可) |
| 核心作用 | AS 间路由交换 | AS 内部 BGP 路由透传 |
四、 邻居建立三阶段
1. 传输层连接 (TCP Connection)
- 过程:由一端发起 TCP 三次握手,目的端口为 179。
- 前提:IP 路由可达,且防火墙放行 179 端口。
2. 参数协商 (Open Packet Exchange)
- 交互内容:发送 Open 报文。
- 核心参数:
My Autonomous System:自身 AS 号。Hold Time:保持时间(协商取小,默认 180s)。BGP Identifier:Router ID(全网唯一)。
- 校验:若 AS 号匹配失败或 Router ID 冲突,连接立即中止。
3. 状态确认与维护 (Keepalive)
- 确认:双方校验 Open 参数无误后,回送 Keepalive 报文。
- 完成:进入 Established 状态,开始交换 Update 路由信息。
- 维护:周期性发送 Keepalive(默认 60s)以维持对等体状态。
AS(自治系统)
- 定义:AS 是指在同一个组织管理下,使用统一选路策略的设备集合。
- 诞生背景:OSPF、IS-IS 等 IGP(内部网关协议)在组织内部应用广泛,但随着网络规模扩大,路由数量激增,IGP 无法管理超大规模的网络。为了实现全球范围内的网络互联,AS 的概念应运而生。
AS 号由 IANA(因特网地址分配组织)统一负责分发。
编号格式
AS 号有两种表示方式:
- 16 bit:取值范围 1 - 65535。
- 32 bit:随着 16 位编号耗尽而推出,范围更大。
公有 vs 私有
类似于私有 IP 地址,AS 号也分为公有和私有。私有 AS 号仅限在企业内部或特定环境使用,不能在互联网上发布。
| AS 号长度 | 私有 AS 号范围 |
|---|---|
| 16 bit | 64512 - 65535 |
| 32 bit | 4200000000 - 4294967294 |
BGP报文格式
BGP 的五种报文(Open, Update, Notification, Keepalive, Route-refresh)都共享相同的报文头格式,总长度为 19 Byte。以下是各字段的具体含义:
- Marker (16 Byte)
- 作用:用于标明 BGP 报文的边界,帮助对等体识别报文的起始位置。
- 取值:在不使用认证的情况下,所有 bit 均填为 “1”。
- Length (2 Byte)
- 作用:指示 BGP 报文的总长度。
- 范围:长度包括报文头在内,单位为 Byte。BGP 报文最小为 19 Byte(仅包含头部,如 Keepalive),最大为 4096 Byte。
-
Type (1 Byte)
- 作用:指示该报文的具体类型。
-
取值对应关系:
取值 报文名称 1 Open (开启报文) 2 Update (更新报文) 3 Notification (通知/错误报文) 4 Keepalive (保活报文) 5 Route-refresh (路由刷新报文)
block-beta
columns 3
Marker["Marker (16 Bytes)"]:3
Length["Length (2 Bytes)"]:1
Type["Type (1 Byte)"]:1
%% 下方是 Type 的注释说明
block:TypeDetail:1
direction LR
t1["1: Open<br/>2: Update<br/>3: Notification<br/>4: Keepalive<br/>5: Route-refresh"]
end
%% 连线效果
Type -- "类型定义" --> TypeDetail
BGP五种报文
| 报文名称 | 作用 | 发送时刻 |
|---|---|---|
| Open | 协商 BGP 对等体参数,建立对等体关系 | BGP TCP 连接建立成功之后 |
| Update | 发送 BGP 路由更新 | BGP 对等体关系建立之后有路由需要发送或路由变化时向对等体发送 Update 报文 |
| Notification | 报告错误信息,中止对等体关系 | 当 BGP 在运行中发现错误时,发送 Notification 报文将错误通告给 BGP 对等体 |
| Keepalive | 标志对等体建立,维持 BGP 对等体关系 | BGP 路由器收到对端发送的 Keepalive 报文,将对等体状态置为已建立,同时后续定期发送 keepalive 报文用于保持连接 |
| Route-refresh | 用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新能力的 BGP 设备会发送和响应此报文 | 当路由策略发生变化时,触发请求对等体重新通告路由 |
BGP六种状态机
| 状态名称 | 描述 / 含义 | 关键动作与后续 |
|---|---|---|
| Idle | 初始状态。BGP 拒绝任何连接请求。 | 启动后开始查找路由,尝试发起 TCP 连接,转入 Connect。 |
| Connect | 连接状态。BGP 等待 TCP 三次握手完成。 | 握手成功则发送 Open 报文并转入 OpenSent;若失败则转入 Active。 |
| Active | 活跃状态。TCP 连接未能建立,正尝试重新握手。 | 持续尝试 TCP 建立。成功则转入 OpenSent;多次失败可能退回 Idle。 |
| OpenSent | 报文已发送。TCP 已通,已向对端发送 Open 报文。 | 等待并检查对方的 Open 报文。若参数匹配则发送 Keepalive 并转入 OpenConfirm。 |
| OpenConfirm | 报文确认。收到对方正确的 Open 参数,等待最终确认。 | 等待对方的回应。收到对方的 Keepalive 报文后,立即转入 Established。 |
| Established | 连接已建立。对等体关系正式成立,可以交换路由。 | 开始交互 Update 报文交换路由信息;周期性发送 Keepalive 维持连接。 |
BGP 邻居建立的完整时序图
sequenceDiagram
participant RTA as RTA (1.1.1.1)
participant RTB as RTB (2.2.2.2)
Note over RTA, RTB: 状态:Idle / Connect
rect rgb(240, 248, 255)
Note right of RTB: TCP 三次握手
RTB->>RTA: TCP SYN
RTA->>RTB: TCP ACK + SYN
RTB->>RTA: TCP ACK
end
rect rgb(255, 250, 240)
Note right of RTB: BGP 报文交换
RTB->>RTA: Open 报文
Note right of RTB: 状态:OpenSent
RTA->>RTB: Open 报文
Note left of RTA: 状态:OpenSent
end
rect rgb(240, 255, 240)
RTA->>RTB: Keepalive 报文
Note left of RTA: 状态:OpenConfirm
RTB->>RTA: Keepalive 报文
Note right of RTB: 状态:OpenConfirm
end
Note over RTA, RTB: 状态:Established (建立成功)
loop 数据交互
RTA-->>RTB: Update / Keepalive / Route-refresh / Notification
RTB-->>RTA: Update / Keepalive / Route-refresh / Notification
end
BGP邻居建立的方式
默认情况下EBPG邻居之间的BGP报文ttl=1,如果跨链路建立邻居,ttl超时导致EBGP邻居无法正常
1 最常见的直连物理接口建立邻居
2 Loopback接口建立邻居
双方都收到 Keepalive 后,状态变为 Established(正式脱单,可以开始传路由了)。
直连物理接口建立EBGP(一般不太用)
[r1]bgp 100
peer 10.1.12.2 as-number 200
[r2]bgp 200
peer 10.1.12.1 as-number 100
loopback接口建立ebgp
理接口一旦 Down,邻居就断;但只要网络中有冗余路径,Loopback 接口永远是 Up 的,能极大提高邻居关系的稳定性。
- 静态路由:双方都配了两条下一跳(10.1.12.x 和 10.1.21.x),实现等价多路径(ECMP)冗余
- ebgp-max-hop 255:正确,EBGP 默认 TTL=1,用 Loopback 建邻居需要经过物理链路转发,TTL 会减 1,必须改大
- connect-interface LoopBack 0:正确,指定用 Loopback 地址作为 BGP 报文的源地址,对方才能匹配到 peer 地址
[r1]ip route-static 2.2.2.2 32 10.1.12.2
[r1]ip route-static 2.2.2.2 32 10.1.21.2
[r2]ip route-static 1.1.1.1 32 10.1.12.1
[r2]ip route-static 1.1.1.1 32 10.1.21.1
[r1]bgp 100
peer 2.2.2.2 connect-interface LoopBack 0 #BGP 报文的源 IP 必须等于对方配置的 peer IP。如果不指定 connect-interface,路由器默认用出接口 IP 发包,会导致对方校验失败
peer 2.2.2.2 as-number 200
peer 2.2.2.2 ebgp-max-hop 255
[r2]bgp 200
peer 1.1.1.1 as-number 100
peer 1.1.1.1 ebgp-max-hop 255
peer 1.1.1.1 connect-interface LoopBack0
peer 1.1.1.1 timer keepalive 20 hold 60 # hold time 时间需要是keepalive的三倍,默认是60 180,两边open报文协商后,按照数值小的来。
Loopback接口建立ibgp
bgp 100
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface LoopBack 0
BGP路由产生
BGP 协议没有路由计算的机制:无法像 IGP(如 OSPF/IS-IS)那样通过算法自动计算出拓扑路由,它本身不产生路由信息。
BGP 只是路由的搬运工:它负责在不同的自治系统(AS)之间传递路由条目。
BGP 路由管理手动发布:必须将 IP 路由表中已经存在的路由,通过 BGP 协议手动发布出去。
network
最为精确的发布方式,要求发布的网络前缀和掩码必须与路由表中的条目完全一致。
注意: network 将路由表中的路由引入bgp转发表network引入路由时,路由需在路由表中存在,且引入时掩码需要和路由表中保持一致。
graph LR
subgraph AS100 ["AS 100 (OSPF Area 0)"]
direction LR
RTA["RTA (1.1.1.1)"]
RTB["RTB (2.2.2.2)"]
Net_Routes["100.0.0.0/24<br/>100.0.1.0/24"] -.-> RTA
RTA -- "10.1.12.0/24" --- RTB
end
subgraph AS200 ["AS 200"]
RTC["RTC (3.3.3.3)"]
end
RTB -- "EBGP (10.1.23.0/24)" --> RTC
%% 配置标注
style RTB fill:#f96,stroke:#333
Note_RTB["<b>RTB Network 注入:</b><br/>network 10.1.12.0 24<br/>network 100.0.0.0 24<br/>network 100.0.1.0 24"]
RTB --- Note_RTB
Network命令是逐条将IP路由表中已经存在的路由引入到BGP路由表中。
bgp 200
network 10.1.12.0 255.255.255.0
import-route
注入方式,可以将 IGP 路由或其他协议路由批量引入 BGP。
bgp 200
import-route ospf 1
手动汇总
在 BGP 视图下手动配置聚合路由,减少明细路由数量。
自动汇总
针对自然网段进行聚合(现网中已较少使用,通常建议手动控制)。
BGP 通告路由规则
- BGP 只通告最优路由
- 从 EBGP 邻居得到的路由,传递给所有邻居。
- 从 IBGP 邻居得到的路由,不会传递给 IBGP 邻居。
- 原因: IBGP 水平分割,用于在 AS 内部防止 BGP 路由环路。
- AS 内部 IBGP 邻居架构: IBGP 全互联 + IBGP 水平分割 = 路由传递 + 路由防环。
- 简化 IBGP 全互联架构的方法:
- 使用路由反射器 (Route Reflector)
- 使用联盟技术 (Confederation)
- 当不存在 BGP 路由黑洞时,从 IBGP 邻居得到的路由,只要下一跳可达,就可以传递给 EBGP 邻居,不要求同步。