BGP(Border Gateway Protocol,边界网关协议)第 4 版是域间路由(Inter-Domain Routing)的事实标准——全球互联网被划分为数万个自治系统(AS),AS 内部跑 OSPF、IS-IS 这类 IGP,AS 与 AS 之间几乎只跑 BGP。没有 BGP,各运营商的网络就是一座座孤岛。它也是一种 EGP(外部网关协议),与 IGP 的分工是「IGP 管网内的路,BGP 管网与网之间的路」。
在协议分类上,BGP 是路径矢量(Path Vector)协议:它不像距离矢量那样只告诉邻居「我离你几跳」,也不像链路状态那样泛洪全网拓扑,而是在每条路由里携带完整经过的 AS 序列(AS_PATH)——既有距离矢量的简单,又能凭 AS 序列可靠地发现并绕开环路。
| 范式 | 代表协议 | 一句话原理 |
|---|---|---|
| 距离矢量 DV | RIP | 「我到 X 要 n 跳」——只传度量,不知路径,易环路、收敛慢。 |
| 链路状态 LS | OSPF / IS-IS | 全网泛洪拓扑,每台设备独立算最短路径——看得全,但泛洪范围必须受限。 |
| 路径矢量 PV | BGP | 「到 X 要经过 AS1→AS3→AS7」——路径即防环依据,还能按策略对路径做加减分。 |
BGP-4 本体(RFC 4271)只有 100 来页,但围绕它长出了一个庞大的扩展家族。本页按下图脉络组织,覆盖全部 9 篇:
| RFC | 主题 | 解决什么 · 本页位置 |
|---|---|---|
| RFC 4271 | BGP-4 核心规范 | 报文格式、状态机、路径属性、决策过程——本页第 3–6 节的地基。 |
| RFC 4760 | 多协议扩展 MP-BGP | 用 AFI/SAFI 让 BGP 从「只懂 IPv4」变成「什么都能装」——第 9 节。 |
| RFC 1997 | Community 团体属性 | 给路由打 4 字节标签做批量策略——第 8 节上半。 |
| RFC 4360 | Extended Community | 8 字节扩展团体,Route Target / Route Origin——第 8 节下半。 |
| RFC 4456 | 路由反射 RR | 免 iBGP 全互联的扩展性方案——第 7 节。 |
| RFC 7432 | EVPN 架构 | 用 MP-BGP 分发 MAC/IP 可达性——第 10 节。 |
| RFC 8365 | EVPN over VXLAN | EVPN 路由在 VXLAN 封装下的具体用法——第 10.3 节。 |
| RFC 9136 | EVPN IP 前缀路由 | RT-5 与 IRB 集成路由桥接——第 10.4 节。 |
| RFC 7938 | 数据中心 BGP 实践 | Clos 架构里 eBGP 通吃 Underlay/Overlay——第 10.5 节。 |
自治系统(AS)是在单一管理域下、执行统一路由策略的一组网络——一家运营商、一个大型企业的骨干网通常各是一个 AS。每个 AS 有一个编号 ASN:
邻居 AS 号不同的会话叫 eBGP(外部),同 AS 内的叫 iBGP(内部)。报文格式完全一样,行为差异却在每一处:
| 维度 | eBGP(AS 之间) | iBGP(AS 之内) |
|---|---|---|
| 典型拓扑 | 直连一跳:实现上通常把报文 TTL 置 1 限制在一跳内;跨多跳要显式配置 ebgp-multihop | 跨整网多跳:两端常是相隔多跳的路由器,TCP 能通即可,邻居地址常用 loopback |
| NEXT_HOP 行为 | 发向 eBGP 邻居时改写为自己的接口地址 | 转发给 iBGP 邻居时默认原样保留——iBGP 通病「下一跳不可达」由此而来(第 4.4 节) |
| AS_PATH | 发出时前置自己的 AS;收到含自己 AS 的路由即丢弃(防环) | 读写 AS_PATH 都不动——靠水平分割规则防环(下一条) |
| 再通告规则 | 学到的路由可自由发给 eBGP 与 iBGP 邻居 | iBGP 学到的路由不再发给其他 iBGP 邻居(RFC 4271 §9.2,水平分割)→ 需要全互联或路由反射(第 7 节) |
| 默认管理距离 | 更被信任(如 Cisco AD 20) | 较不被信任(如 Cisco AD 200)——避免与 IGP 抢转发权 |
BGP 通告的每一条目的地叫 NLRI(Network Layer Reachability Information,网络层可达信息)。IPv4 单播的 NLRI 编码极简,就是一个二元组:
前缀部分只带长度字段所需的字节数(/24 带 3 字节、/8 带 1 字节),末尾不足一字节的比特位任意填充——所以 BGP 的 NLRI 天生支持 CIDR 无类前缀。撤销路由的编码与此完全相同;多协议地址族的 NLRI 则装进 MP_REACH/MP_UNREACH 属性里(第 9 节)。
RFC 4271 §3.2 给每台 BGP 路由器定义了三个概念性路由库,路由信息在其中的流动就是 BGP 工作的全部:
BGP 只有一类报文外壳 + 五种报文类型。所有报文都以 19 字节定长首部开头,其后按类型跟不同的数据部分;报文最大 4096 字节,最小就是裸首部 19 字节(KEEPALIVE)。多字节字段一律网络字节序。下图为首部结构(Marker 16 字节按每行 32 位展开为 4 行):悬停任意字段查看详解,单击可钉住。
| Type | 报文 | 最小长度 | 职责 |
|---|---|---|---|
1 | OPEN | 29 字节 | 建联握手:协商参数与能力 |
2 | UPDATE | 23 字节 | 通告 / 撤销路由(唯一干活儿的报文) |
3 | NOTIFICATION | 21 字节 | 报错并立即拆链 |
4 | KEEPALIVE | 19 字节 | 保活 + 对 OPEN 的确认 |
5 | ROUTE-REFRESH | 23 字节 | 软重置:请邻居重发路由(RFC 2918) |
OPEN 固定部分 10 字节(最小全长 29 字节),逐字段如下表(悬停行查看详解):
| 字段 | 长度 | 要点 |
|---|---|---|
| Version | 1 字节 | 恒 = 4;谈不拢报 2/1 错误。 |
| My AS | 2 字节 | 决定 eBGP/iBGP;配错即 2/2 拆链。 |
| Hold Time | 2 字节 | 0 或 ≥3;双方取小;超时即拆链。 |
| BGP Identifier | 4 字节 | = Router ID;选路决胜与 RR 防环都靠它。 |
| Opt Parm Len | 1 字节 | 可选参数总长度;0 = 无。 |
| Optional Parameters | 变长 | TLV 列表;能力协商(RFC 3392)在此。 |
UPDATE 是五段式变长结构(前四段可因取值为 0 而缺席,最小全长 23 字节)。悬停下图各段查看含义:
错误码/子码是 BGP 排障的第一现场,全表如下(悬停行查看场景提示):
| 错误码 | 名称 | 子码与典型场景 |
|---|---|---|
1 | 报文首部错 | 子码 1–3:Marker 失同步 / Length 非法 / Type 未知 |
2 | OPEN 报文错 | 子码 1–7:版本 / AS 号 / RID / 可选参数 / Hold Time / 能力 |
3 | UPDATE 报文错 | 子码 1–11:属性列表 / 必备属性缺失 / 标志 / 长度 / AS_PATH |
4 | Hold Timer 超时 | 无子码;邻居失联判死 |
5 | FSM 状态机错 | 无子码;状态与报文不匹配 |
6 | Cease 终止 | 管理性拆链;子码见 RFC 4486 |
BGP 路由的灵魂不在 NLRI,而在路径属性——它是路由的「履历与政策标签」,防环、选路、策略全靠它。每个属性按 TLV 编码(悬停下图各字段):
属性沿两个轴分类:公认(well-known)vs 可选(optional)——实现是否必须认识它;可传递(transitive)vs 不可传递——不认识时能否继续转发。组合出四类:
| 属性(Type Code) | 分类 | 一句话 |
|---|---|---|
| ORIGIN(1) | 公认 · 必遵 mandatory | 路由出身:IGP(0)/EGP(1)/INCOMPLETE(2)。 |
| AS_PATH(2) | 公认 · 必遵 mandatory | 经过的 AS 序列;防环 + 选路双料主力。 |
| NEXT_HOP(3) | 公认 · 必遵 mandatory | 下一跳 IP;eBGP 改写、iBGP 保留。 |
| LOCAL_PREF(5) | 公认 · 自选 discretionary | AS 内优先级,越大越优,只管出站。 |
| ATOMIC_AGGREGATE(6) | 公认 · 自选 discretionary | 「我是有损聚合」的标记,长 0。 |
| AGGREGATOR(7) | 可选 · 可传递 transitive | 谁做的聚合:AS + Router ID。 |
| COMMUNITY(8) | 可选 · 可传递 transitive | 4 字节标签(AS:NN),批量策略载体。 |
| MED(4) | 可选 · 不可传递 non-transitive | 入站引导,越小越优,同邻居 AS 才比。 |
另有三个扩展属性在本页后续章节展开:ORIGINATOR_ID(9)/ CLUSTER_LIST(10)(路由反射,第 7 节)、MP_REACH_NLRI(14)/ MP_UNREACH_NLRI(15)(多协议,第 9 节)、EXTENDED_COMMUNITIES(16)(扩展团体,第 8 节)。
1 字节枚举,由注入 BGP 的方式决定,沿途不可篡改(常被策略改写除外):
| 值 | 名称 | 来源 |
|---|---|---|
0 | IGP | 通过 network 命令精确注入,或本地聚合产生——「根正苗红」,选路最优。 |
1 | EGP | 从古老 EGP 协议学来——历史化石,现网基本绝迹。 |
2 | INCOMPLETE | 重分发(redistribute)等其他途径注入——「来路不明」,选路最劣。 |
AS_SEQUENCE(2) 是有序经过列表(每向 eBGP 通告一次就在段首前置本 AS);AS_SET(1) 是聚合时合并出来的无序集合(防环兜底,选路时整个集合按 1 个 AS 计)。next-hop-self(把下一跳改写成自己),或把互联链路网段注入 IGP。这是 iBGP 部署的第一课,也是第 15 节故障表的头号条目。| 对比 | LOCAL_PREF | MED |
|---|---|---|
| 方向 | 管出站:本 AS 从哪个口出去 | 管入站:建议对方从哪个口进来 |
| 传播范围 | 只传 iBGP,出 AS 必剥 | 可在相邻 AS 间传递,进本 AS 后内部可见,不再外传 |
| 大小 | 越大越优(默认常 100) | 越小越优(缺省按 0) |
| 比较前提 | 所有路由间都可比 | 一般只在同一邻居 AS 学来的路由间比 |
| 选路顺序位置 | 最优先(仅次于厂商 Weight) | 靠后(AS_PATH、ORIGIN 之后才比) |
每个邻居会话由一台独立的状态机驱动,共 6 个状态。整条正向链路是「TCP 打通 → OPEN 互认 → KEEPALIVE 确认 → Established」;任何环节失败都会回退或拆链重来。实线为正向建联路径,虚线为出错回退;悬停状态节点查看含义与排障提示,迁移条件标在箭头旁。
| 当前状态 | 触发事件 | 动作 | 下一状态 |
|---|---|---|---|
| Idle | ManualStart(配置生效) | 起 ConnectRetryTimer;发起 TCP;监听 179 | Connect |
| Connect | TCP 建立成功 | 停 ConnectRetry;发送 OPEN;HoldTimer 置大值(建议 4 分钟) | OpenSent |
| Connect | TCP 建立失败 | 释放资源(实现转 Active;RFC 4271 文本回 Idle) | Active |
| Connect | ConnectRetry 超时 | 丢弃旧 TCP、重启定时器、重新发起 | Connect |
| Active | ConnectRetry 超时 | 重启定时器,再次发起 TCP | Connect |
| Active | TCP 建立成功 | 发送 OPEN | OpenSent |
| OpenSent | 收到合法 OPEN | 回 KEEPALIVE;按协商值起 Keepalive/Hold 定时器 | OpenConfirm |
| OpenSent | OPEN 校验失败 | 发 NOTIFICATION(错误码 2/x);拆 TCP | Idle |
| OpenConfirm | 收到 KEEPALIVE | 重置 HoldTimer | Established |
| OpenConfirm | Hold 超时 / NOTIFICATION | 拆 TCP,释放资源 | Idle |
| Established | 收到 KEEPALIVE / UPDATE | 重置 HoldTimer,正常收发路由 | Established |
| Established | 任何错误 / NOTIFICATION / Hold 超时 | (视情况回 NOTIFICATION;)撤销该会话全部路由;拆 TCP | Idle |
| 任意状态 | ManualStop(管理关闭) | 发 Cease NOTIFICATION;拆 TCP | Idle |
注:双方同时发起连接会产生两条并行 TCP——§6.8 连接冲突检测按 BGP Identifier 裁决,只保留一条。图中略去可选的 DelayOpen 特性与振荡抑制(DampPeerOscillations)细节。
§9.1 把决策形式化为三个阶段,每个阶段由不同事件触发:
| 阶段 | 输入 → 输出 | 干什么 |
|---|---|---|
| Phase 1 计算 preference | 每条新收到的路由 → preference 值或「不合格」 | 对从邻居收到的每条路由算「偏好度」:eBGP 路由按本地入策略计算(此值随后作为 LOCAL_PREF 随 iBGP 传播);不合格者直接淘汰,不进下一阶段。 |
| Phase 2 路由选择 | 同一目的地的所有候选 → 唯一最优 | 每个目的地只留一条:先取 preference 最大者,并列则按 6.2 的顺序逐级打破平局;胜者装入 Loc-RIB。前提是下一跳能被本地路由表解析(§9.1.2.1)。 |
| Phase 3 路由发布 | Loc-RIB → 各 Adj-RIB-Out | 按出策略把最优路由加工(改 NEXT_HOP、前置 AS_PATH、剥 LOCAL_PREF、打 Community/MED……)后装进各邻居的 Adj-RIB-Out,打包成 UPDATE 发出。 |
§9.1.2.2 的平局裁决链是各厂商实现的基础,厂商在最前面加了私有项、个别步骤细节略异。下表为从高到低的通用顺序(悬停行查看每步的实战注解):
| # | 规则(从高到低) | 要点 |
|---|---|---|
| 0 | Weight 最大(厂商私有) | 仅本地有效;Cisco 系最优先,华为对应 PrefVal。 |
| 1 | LOCAL_PREF 最大 | 出站首选;缺省通常 100,iBGP 内传递。 |
| 2 | 本地注入优先 | network / 聚合 / 重分发产生的路由打头。 |
| 3 | AS_PATH 最短 | AS_SET 按 1 计;prepend 的作用点。 |
| 4 | ORIGIN 最小 | IGP < EGP < INCOMPLETE。 |
| 5 | MED 最小 | 同邻居 AS 才比;缺省按 0。 |
| 6 | eBGP 优于 iBGP | 直连学来 > 内部转手。 |
| 7 | 到 NEXT_HOP 的 IGP 代价最小 | 热土豆:从最近出口甩出去。 |
| 8 | eBGP 最老者(厂商实现) | 最老 = 最稳定;非 RFC,可关闭。 |
| 9 | Router ID 最小 | RR 环境用 ORIGINATOR_ID 替代比较。 |
| 10 | 邻居 IP 最小 | 终极决胜,极少用到。 |
iBGP 的防环规则(RFC 4271 §9.2):从 iBGP 邻居学到的路由,不得再转发给其他 iBGP 邻居——因为 iBGP 不改 AS_PATH,没有环路信息可用,只能「只学一手」。后果是:要让每台路由器都拿到全量外部路由,AS 内所有 BGP 发言者必须两两建立 iBGP 会话:
每条会话都是一份 TCP 连接、一份配置、一份 UPDATE 复制——n 稍大即不可维护。RFC 4456 的解法:路由反射器(Route Reflector, RR)——特许少数路由器「打破」水平分割,把 iBGP 学到的路由反射给其他 iBGP 邻居。
RR 把邻居分为 Client(客户)与 Non-Client(非客户,含其他 RR)。Client 之间不用互联,Non-Client 之间仍须全互联。RR 对每条新最优路由按下表反射:
| 路由从哪学来 | 反射给 Client? | 反射给 Non-Client? |
|---|---|---|
| Non-Client iBGP 邻居 | ✔ 反射给全部 Client | ✘ 不反射 |
| Client 邻居 | ✔ 反射给其余 Client | ✔ 反射给全部 Non-Client |
| eBGP 邻居 | 照常发给所有 iBGP 邻居(非反射行为) | |
打破水平分割等于重新引入环路可能,4456 用两个可选不可传递属性兜底:
| 属性(Type Code) | 谁创建 | 防环机制 |
|---|---|---|
| ORIGINATOR_ID(9) | 首个反射该路由的 RR | 看到自己的 RID → 丢弃;始发者拒收回流路由。 |
| CLUSTER_LIST(10) | 每个经手的 RR 前置本 Cluster ID | 看到本 Cluster ID → 丢弃;防集群间环路。 |
COMMUNITIES 是可选可传递属性(Type Code 8),值为若干个 4 字节标签,惯例写法 AS:NN(高 2 字节 AS 号 + 低 2 字节自定义编号)——运营商对外公布自己的团体字典,如「65001:100 = 打 LOCAL_PREF 100」「65001:0 = 不要传给任何 eBGP 邻居」,客户只需在出方向贴标签即可远程定制策略。三个保留值具有全局语义:
| 知名团体值 | 十六进制 | 语义 |
|---|---|---|
| NO_EXPORT | 0xFFFFFF01 | 不出本 AS;只让直接邻居看到。 |
| NO_ADVERTISE | 0xFFFFFF02 | 不给任何邻居;本机自留。 |
| NO_EXPORT_SUBCONFED | 0xFFFFFF03 | 不出子联盟;联盟内部专用。 |
4 字节团体不够用(装不下 4 字节 ASN、没有类型字段),RFC 4360 定义 EXTENDED_COMMUNITIES 属性(Type Code 16,可选可传递):每条扩展团体 8 字节 = Type(1 或 2 字节)+ Value(其余字节)。Type 高字节的最高两位是标志:I 位(IANA 分配策略)与 T 位(0 = 跨 AS 可传递,1 = 不可传递),低 6 位指示结构。常用 Type 高位值:0x00/0x02 = 全局管理员为 2/4 字节 AS 号,0x01 = 全局管理员为 IPv4 地址。
最重要的两个子类型:
| 子类型 | 用途 |
|---|---|
| Route Target(RT,0x02) | VPN/EVPN 的「进出口通行证」:每个 VRF/EVI 配 import/export RT 集合,路由导出时贴上 export RT,对端只把 RT 匹配的路由导入对应 VPN 实例。EVPN 靠 RT 控制 MAC/IP 路由在租户间的分发(第 10 节)——同一个 EVI 的成员共享同一 RT。 |
| Route Origin / SoO(0x03) | 标记路由的「发源地」(Site of Origin):多宿主站点场景下,PE 把带本站点 SoO 的路由拒之门外,防止路由从同一 VPN 的另一个口绕回——站点级防环。 |
老的 4 字节 Community(AS:NN)在 4 字节 ASN 时代彻底不够用:前 2 字节装不下一个 4 字节 AS 号。RFC 8092 定义 BGP Large Communities(可选可传递,Type Code 32),每条 12 字节 = 3 个 4 字节整数,惯例写法 ASN:Function:Parameter——第一段放 4 字节全局管理员 AS 号,后两段自定义功能与参数。它不是 Extended Community 的替代(后者只 8 字节且带类型语义、多用于 VPN/RT),而是「大号版普通 Community」,专供运营商在 4 字节 ASN 网络里做策略标记。
65540:100:1 = 「AS65540 定义的:功能 100(如设 LOCAL_PREF),参数 1(如 = 客户路由)」
| 对比 | Community(RFC 1997) | Extended(RFC 4360) | Large(RFC 8092) |
|---|---|---|---|
| 长度 / Type | 4 字节 / Type 8 | 8 字节 / Type 16 | 12 字节 / Type 32 |
| 装得下 4 字节 ASN | ✘ 前段只 2 字节 | △ 部分子类型可 | ✔ 全局管理员整 4 字节 |
| 典型用途 | 运营商策略标签(AS:NN) | VPN/EVPN 的 RT/SoO | 4 字节 ASN 网络的策略标签 |
RFC 4271 的 UPDATE 本体只认识 IPv4 单播 NLRI。RFC 4760 的天才之处:不动协议本体,只新增两个属性 + 一个协商机制,就让 BGP 变成「任意地址族的运输船」——IPv6、VPNv4、标签路由、EVPN 全靠它。地址族用二元组标识:AFI(Address Family Identifier,2 字节,哪个网络层协议)+ SAFI(Subsequent AFI,1 字节,该协议下哪种用途)。常用组合(悬停行查看):
| AFI / SAFI | 地址族 | 说明 |
|---|---|---|
1 / 1 | IPv4 单播 | 默认地址族;可用原生编码或 MP 属性。 |
2 / 1 | IPv6 单播 | 联动 IPv6 详解页;下一跳 16 字节。 |
1 / 4 | IPv4 标签单播 | 前缀携带 MPLS 标签(RFC 3107)。 |
1 / 128 | VPNv4 | RD + IPv4 前缀;MPLS L3VPN 核心。 |
25 / 70 | L2VPN EVPN | EVPN 路由的家;本页第 10 节。 |
4760 把「多协议可达」与「多协议撤销」分别装进两个可选不可传递属性(结构见 RFC 4760 §3/§4):
<长度, 前缀> 编码,但「前缀」的格式由 AFI/SAFI 解释——IPv6 前缀、RD+IPv4、EVPN 路由皆可。两端怎么知道对方懂哪些地址族?OPEN 报文 Optional Parameters 里的能力参数(参数类型 2,RFC 3392):每条能力 = <能力码(1B), 长度(1B), 值>。多协议能力(能力码 1)的值就是 <AFI(2B), 保留(1B), SAFI(1B)>——每端在 OPEN 里列出自己支持的全部 AFI/SAFI。只有双方都声明了的地址族才能在该会话上使用;单方面宣布不算数,硬发会触发 NOTIFICATION 拆链(OPEN 错 / 子码 7 Unsupported Capability,RFC 5492)。其他常见能力:路由刷新(2,RFC 2918)、4 字节 ASN(65,RFC 6793)、Add-Path(69)、增强路由刷新(70)。
VXLAN 把二层帧封进 UDP 打隧道(24 位 VNI 标识租户网络),但 RFC 7348 原始方案靠数据面泛洪学 MAC——未知 MAC 一律组播/头端复制泛洪,规模一大就失控。EVPN(Ethernet VPN,RFC 7432)的答案:用 MP-BGP 当控制平面,VTEP 之间通过 BGP 主动分发「MAC 在哪个 VTEP 后面」,把「边炸边学」变成「先知道再转发」,顺带免费得到多宿主、快速收敛、ARP 抑制(RT-2 同时带 IP,可代答 ARP)与租户间三层互通。它跑在 AFI/SAFI = 25/70(第 9 节),NLRI 统一为:
| Type | 名称 | 干什么 |
|---|---|---|
1 | Ethernet Auto-Discovery(EAD) | 以太网段可达性;多宿主别名与快收敛。 |
2 | MAC/IP Advertisement | 主力:MAC(+IP)位置通告,替代泛洪学习。 |
3 | Inclusive Multicast Ethernet Tag(IMET) | BUM 组成员通告,搭建复制列表。 |
4 | Ethernet Segment(ES) | 多宿主发现与 DF 选举。 |
5 | IP Prefix(9136 新增) | 子网/前缀级三层可达性。 |
协议正确只是及格,「多久发现故障、多快切完、切的时候丢不丢包」才是生产网络的命门。这一节把 BGP 的定时器体系、以及围绕它的收敛与高可用技术一次讲透——RFC 4271 之外,这里大量依赖厂商实现。
前面见过 Hold Time 与 ConnectRetry,但完整的 BGP 定时器有五个,其中 MRAI(最小路由通告间隔)常被忽略,却直接决定收敛速度与稳定性的平衡:
| 定时器 | 典型默认 | 作用与调优 |
|---|---|---|
| ConnectRetry | 120 s | TCP 重连节拍;调小加快重连,过小则空转。 |
| Keepalive | 60 s | 心跳间隔,建议 Hold÷3。 |
| Hold Time | 180 s | 失联判死阈值;快切靠调小或挂 BFD。 |
| MRAI(通告间隔) | eBGP 30 s / iBGP 5 s | 同前缀重发的最小间隔;攒抖动,稳定 vs 收敛的旋钮。 |
| MinASOrigination | 15 s | 本地始发路由的最小通告间隔(存在感低)。 |
BGP 靠 Hold Timer 发现故障,最快也是秒级、默认更是 180 秒。BFD(双向转发检测)用极轻量的报文以毫秒级周期互探,一旦探测中断立即通知上层协议——把 BGP 邻居 down 的发现时间从「秒/分钟」压到「几十毫秒」。它是所有路由协议通用的「故障探针」,与 BGP 的关系是「BFD 负责喊『线断了』,BGP 负责『立刻撤路由、切备份』」。
检测时间 ≈ min_rx × multiplier。上例 300 ms × 3 = 900 ms 内感知故障——比 Hold 180 s 快 200 倍。
路由器控制平面重启(如主备倒换、进程重载)时,若邻居立刻判死拆链,会引发全网撤路由、大范围抖动。GR(优雅重启)的思路:重启方与邻居约定,控制平面重启期间,转发平面继续按老表转发,邻居把该会话的路由标为「陈旧(stale)」暂不删除、给一个宽限期(Restart Time)等它回来,回来后刷新、清 stale——控制面重启,数据面零丢包。
graceful-restart(router 模式);华为 graceful-restart(BGP 视图);H3C graceful-restart(BGP 实例视图)——三家命令名一致,参数(restart-time / stalepath-time)可调。传统 BGP 收敛慢的另一半原因:一条链路挂了,要逐条前缀重新下发转发表——互联网全表 90 万+条,逐条改要好几秒。BGP PIC(Prefix Independent Convergence)预先在转发表里为每个下一跳算好备份路径,主路径失效时只需切换「下一跳」这一个指针,所有依赖它的前缀一次性全切——收敛时间与前缀数量无关(这就是「前缀无关」的含义),从秒级降到毫秒级。
Route Flap Damping(路由抑制/阻尼):对反复 up/down 的「抖动前缀」累积惩罚值,超阈值就临时压制它一段时间(不再通告),抖动停止后惩罚指数衰减、恢复通告。本意是保护全网不被个别抖动链路拖垮。
bgp dampening、华为/H3C dampening(地址族视图)。BGP 是互联网的信任基石,却天生几乎没有安全机制——它默认相信邻居说的每一句话。历史上多次大规模断网都源于此(前缀劫持、路由泄露)。这一节按「保会话 → 防伪造 → 限规模 → 验真伪」四层讲加固。
BGP 跑在 TCP 上,攻击者若能注入伪造的 TCP 报文(RST 或假 UPDATE)就能搞垮或污染会话。TCP MD5 给每个 TCP 段加一个基于共享密钥的 MD5 摘要,对不上的段直接丢——这是最普及的 BGP 会话保护。TCP-AO 是它的现代替代:支持更强的 HMAC 算法、支持密钥滚动更换(keychain),逐步取代已显陈旧的 MD5。
生产强烈建议改用 keychain(华为/H3C 均支持)实现不断链的密钥轮换;纯 MD5 password 改密钥会瞬断会话。
直连 eBGP 邻居发来的报文 TTL 恒为 255(只跳一跳)。GTSM 反过来利用这点:配置本端只接受 TTL ≥ (255 − 允许跳数) 的 BGP 报文。攻击者若从远处(多跳外)伪造 BGP 报文,TTL 早被沿途路由器递减到很低,一到本端就因 TTL 不达标被丢——用一个 TTL 阈值挡住所有远程伪造,几乎零成本。
邻居(尤其是客户或对等体)一旦配错或被劫持,可能把几十万条本不该发的路由灌进来,瞬间打爆你的内存/CPU——这就是「路由泄露」。Maximum-Prefix 给每个邻居设一个前缀数上限,超限即告警或拆链,是防泄露最基本的护栏。
Cisco 语义:1000 = 上限,80 = 到 80% 告警,restart 30 = 拆链后 30 分钟重连。华为/H3C 用 route-limit,可选 alert-only(仅告警不拆链)。
bgp enforce-first-as、华为/H3C check-first-as,很多实现默认开启。前面的手段都在「防会话被打」和「防明显错误」,但挡不住一个根本问题:凭什么相信 AS64500 真的拥有它通告的那个前缀?历史上「AS 谎称自己拥有某前缀」造成过全球性劫持(如某次把 YouTube 全球流量吸走)。RPKI(资源公钥基础设施)给出密码学答案:
| 部件 | 作用 |
|---|---|
| ROA(Route Origin Authorization) | 地址持有者在 RPKI 里签发的声明:「前缀 P 只允许由 AS N 通告,最大长度 L」——一份密码学签名的「产权证」。 |
| RP / Validator(依赖方缓存) | 本地服务器同步全球 RPKI 数据,验证签名,生成「前缀→合法起源 AS」的有效载荷集(VRP)。 |
| RTR 协议(RFC 8210) | 路由器通过 RTR 会话从 Validator 拉取验证结果。 |
| 源验证结果(RFC 6811) | 每条 eBGP 路由被判为 Valid(ROA 匹配)/ Invalid(有 ROA 但起源 AS 或长度不符,典型劫持特征,应丢弃)/ NotFound(无 ROA,暂放行)。用 route-policy 据此调 LOCAL_PREF 或直接拒绝 Invalid。 |
rpki server、华为/H3C rpki session)。BGP 的生命力在于「不改船体、只加集装箱」。除了前面已展开的 4 字节 ASN(2.1)、MP-BGP(第 9 节)、Large Community(8.3),还有几个高频出现在配置和面试里的扩展,这里集中收口。
解决 iBGP 全互联平方灾难,除了路由反射(第 7 节),还有联盟:把一个大 AS 对内拆成若干「成员 AS(子联盟)」,成员之间跑一种特殊的 eBGP(叫 confederation eBGP),成员内部仍是 iBGP 全互联(或再套 RR)。对外,整个联盟仍表现为一个 AS 号,外界看不到内部拆分。
| 对比 | 路由反射(RFC 4456) | 联盟(RFC 5065) |
|---|---|---|
| 改造方式 | 加 RR 角色,配置改动小 | 拆分内部 AS,改动大、迁移复杂 |
| 防环机制 | ORIGINATOR_ID / CLUSTER_LIST | AS_CONFED_SEQUENCE/SET(对外不可见) |
| 典型使用者 | 绝大多数企业与 DC(主流) | 少数超大型运营商骨干(历史遗留居多) |
现网新建几乎都选路由反射;联盟主要出现在老牌运营商网络与考试里。知道它「是 RR 的替代方案、靠子 AS + confederation eBGP 实现」即可。
BGP 的一个「先天缺陷」:对每个前缀,一个会话只通告最优的那一条路径。这在 RR 场景尤其伤——RR 只反射自己选出的最优路径,客户端看不到备选路径,导致快速重路由(FRR)和负载分担缺料。Add-Path 给每条路径加一个 Path Identifier,允许同一前缀通告多条路径,让下游能预装备份、做 PIC/ECMP。RR + Add-Path 是现代 DC 常见组合。三家均以能力协商开启(如 Cisco additional-paths send/receive + advertise additional-paths)。
RFC 4271 的原始规定太「暴烈」:UPDATE 里任何一个属性有错,整个会话拆链重来(NOTIFICATION 3/x),一条畸形路由能把整个邻居打掉、连累所有正常路由。RFC 7606 把大量此类错误「软化」:
计划内维护(升级、割接)时直接关会话,会瞬间黑洞流量、等收敛。Graceful Shutdown 用一个知名 Community(GRACEFUL_SHUTDOWN = 65535:0)提前通告:「这条路我马上要停了,请你先切到备份」——邻居收到后把这些路由的 LOCAL_PREF 降到最低,流量在会话真正断开前就平滑切走,实现零丢包维护。配一条出方向 route-policy 打这个 Community 即可,是运营维护的良好实践。
前面全是「原理」,这一节给「手感」——一个贯穿始终的实验拓扑,从 eBGP 建邻一路配到 EVPN,Cisco NX-OS / 华为 VRP / H3C Comware 三列并排。命令语法核对自三家官方配置文档;华为部分以官方命令关键字为准补全。照着敲能通,是本页作为「可传递学习文档」的落点。
三家共同点:先建 BGP 进程/实例、配 RID、声明邻居 remote-as,再在地址族下激活邻居。差异:Cisco 用 address-family,华为用 ipv4-family,且华为/H3C 必须显式 peer x enable 激活地址族——忘了 enable 是华为/H3C 建邻的头号坑。
要点:① iBGP 邻居用 loopback 建邻(update-source / connect-interface),链路冗余时会话不随单条物理口抖动;② next-hop-self(华为/H3C 叫 next-hop-local)解决第 4.4 节的 iBGP 下一跳不可达;③ 把 R2/R3 设为 reflect-client,它们之间就免全互联。名词差异:Cisco route-reflector-client / next-hop-self,华为 H3C reflect-client / next-hop-local。
场景:R1 从 R4(ISP)学来的路由,入方向统一设 LOCAL_PREF=200(让本 AS 优先走这个 ISP 出站);同时出方向对某些路由 AS_PATH prepend 两次(让入站流量别走这条)。
核心差异一句话:Cisco 叫 route-map + set + in/out,华为 H3C 叫 route-policy + apply + import/export。匹配子句同理:Cisco match,华为/H3C if-match。记住这组「方言对照」,三家路由策略就通了。
这一段把第 11、12 节的护栏一次性落到 eBGP 邻居上:MD5 认证 + GTSM 防伪造 + BFD 快速探测 + Max-Prefix 防泄露 + GR 优雅重启——生产 eBGP 邻居的「标准安全基线」。
对应第 10 节:数据中心里在 l2vpn evpn 地址族上建 iBGP(常以 Spine 作 RR),Leaf 之间通过 EVPN 分发 MAC/IP。下面是 Leaf 侧启用 EVPN 地址族的骨架(各家 VXLAN/EVI 实例配置另在接口与 EVPN 实例下,此处只示意 BGP 侧):
EVPN 靠 扩展团体(RT)控制租户路由分发,所以必须 send-community extended(华为 advertise-ext-community)。地址族名:Cisco/H3C 用 l2vpn evpn,华为用 l2vpn-family evpn。完整 EVPN 还需配 VXLAN 隧道、L2/L3 VNI 与 EVPN 实例——超出本页 BGP 范畴,见第 10 节原理与厂商 VXLAN 配置指导。
识别特征:TCP 流里以 16 字节全 1(一串 ff)开场的报文即 BGP。抓包位置建议选在一侧路由器直连接口上;eBGP TTL=1 的习惯意味着中间设备上通常抓不到 eBGP 会话。
正常建联在抓包里是这样一条链(悬停各节点):
同一件事三家命令各说各话,下面按「目的 → Cisco / 华为 / H3C」三列并排,复制即用。华为与 H3C 同属中文阵营但语法并不互通,别混着敲。
| 目的 | Cisco IOS / IOS-XE | 华为 VRP | H3C Comware |
|---|---|---|---|
| 邻居 FSM 状态 / 概要 | show ip bgp summary | display bgp peer | display bgp peer |
| 邻居细节(能力、定时器、计数) | show ip bgp neighbors | display bgp peer verbose | display bgp peer verbose |
| BGP 路由表(Loc-RIB) | show ip bgp | display bgp routing-table | display bgp routing-table |
| 某邻居收到的路由 | show ip bgp neighbors X received-routes | display bgp routing-table peer X received-routes | display bgp routing-table peer X received-routes |
| 某邻居发出的路由 | show ip bgp neighbors X advertised-routes | display bgp routing-table peer X advertised-routes | display bgp routing-table peer X advertised-routes |
| EVPN 路由(L2VPN EVPN 地址族) | show bgp l2vpn evpn | display bgp evpn all routing-table | display bgp l2vpn evpn routing-table |
| 软刷新入方向(重发 route-refresh) | clear ip bgp X soft in | refresh bgp all import | refresh bgp ipv4 unicast all import |
| 按团体值查路由 | show ip bgp community 100:10 | display bgp routing-table community 100:10 | display bgp routing-table community 100:10 |
| 按 AS_PATH 正则查路由 | show ip bgp regexp ^65002$ | display bgp routing-table regular-expression ^65002$ | display bgp routing-table regular-expression ^65002$ |
| 对等体组 / Update 组 | show ip bgp update-group | display bgp update-peer-group | display bgp update-group |
| 路由抖动 / 抑制信息(dampening) | show ip bgp dampening flap-info | display bgp routing-table flap-info | display bgp routing-table flap-info |
| VPN/MPLS 标签分配 | show bgp vpnv4 unicast labels | display bgp vpnv4 all routing-table label | display bgp vpnv4 routing-table label |
| 硬重置会话(断开重连 TCP) | clear ip bgp X | reset bgp ipv4 unicast peer X | reset bgp ipv4 unicast peer X |
| 开调试(排障抓包) | debug ip bgp updates | debugging bgp update | debugging bgp packet update |
received-routes 看到全部内容,必须提前开 neighbor X soft-reconfiguration inbound(Cisco)/ peer X keep-all-routes(华为)/ peer X keep-all-routes(H3C),否则只能看到优选进 Loc-RIB 的那部分。软刷新(soft in)本质是对方重发一遍 OPEN + ROUTE-REFRESH,不会断连接;而硬重置(clear/reset)会真的断开 TCP 重连,慎用。| 现象 | 首要怀疑 | 处置 |
|---|---|---|
邻居卡 Idle | 本端未配置或被 shutdown | 核对 neighbor 配置与激活状态。 |
邻居卡 Active | TCP/179 不通或对端未监听 | ping/telnet 179;查 ACL、multihop、update-source。 |
| 拆链循环(有 NOTIFICATION) | OPEN 参数 / 能力不匹配 | 按子码 2/2、2/3、2/6、2/7 逐条核对。 |
| 会话正常但无路由 | 下一跳不可达 / 策略过滤 / 地址族未激活 | next-hop-self;查过滤;查 activate;查团体。 |
| 路由存在但非最优 | 水平分割 / 选路被压 / 出方向未发 | 按 6.2 顺序比对属性;查对端出策略。 |
| 周期性掉线(码 4) | 链路丢包 / 对端繁忙 / 半开连接 | 查丢包与对端负载;适当调大 Hold Time。 |
| 术语 | 含义 |
|---|---|
AS / ASN | 自治系统及其编号:单一管理域、统一策略的网络;ASN 16 位(RFC 4271)→ 32 位(RFC 6793),私有段 64512–65534(RFC 6996)。 |
eBGP / iBGP | 外部/内部 BGP 会话:跨 AS vs 同 AS;差异集中在 TTL、NEXT_HOP 改写与水平分割(2.2)。 |
NLRI | 网络层可达信息:路由的目的地,编码为 <长度, 前缀> 二元组(2.3)。 |
AFI / SAFI | 地址族二元组(2B + 1B):MP-BGP 用它们区分 IPv4/IPv6/VPNv4/EVPN 等货物(第 9 节)。 |
Adj-RIB-In / Loc-RIB / Adj-RIB-Out | 路由信息库三件套:原始入库 → 优选本机用 → 按邻居待发(2.4)。 |
OPEN / UPDATE / NOTIFICATION / KEEPALIVE | BGP 四种基本报文(Type 1–4);ROUTE-REFRESH(5)为 RFC 2918 增补。 |
Hold Time | 保活超时:OPEN 协商取双方较小值,0 或 ≥3;收不到报文超过它即拆链。 |
ConnectRetryTimer | 连接重试定时器:FSM 重发 TCP 的节拍器,初值实现自定(常见约 120 秒)。 |
ORIGIN | 路径属性(1):路由出身 IGP(0)/EGP(1)/INCOMPLETE(2),越小越优。 |
AS_PATH | 路径属性(2):经过的 AS 序列;防环 + 选路;prepend 可人为拉长。 |
NEXT_HOP | 路径属性(3):下一跳 IP;eBGP 改写、iBGP 保留,next-hop-self 治 iBGP 不可达。 |
LOCAL_PREF | 路径属性(5):AS 内优先级,越大越优,只传 iBGP,出站主旋钮。 |
MED | 路径属性(4,MULTI_EXIT_DISC):入站引导,越小越优,同邻居 AS 才比。 |
RR / Cluster | 路由反射器及其集群:免 iBGP 全互联;Client 免互联、Non-Client 仍须全互联(第 7 节)。 |
ORIGINATOR_ID / CLUSTER_LIST | RR 防环两属性(9/10):见自己 RID / 本 Cluster ID 即丢弃。 |
Community | 4 字节路由标签(AS:NN,Type 8);知名值 NO_EXPORT/NO_ADVERTISE/NO_EXPORT_SUBCONFED。 |
RT(Route Target) | 扩展团体子类型 0x02:VPN/EVPN 的导入导出标记,租户隔离的关键。 |
SoO(Site of Origin) | 扩展团体子类型 0x03:发源地标记,站点级防环。 |
EVPN / VNI / IRB | 以太网 VPN(25/70);VXLAN 24 位租户标识;集成路由桥接(同设备二三层打通)。 |
水平分割(iBGP) | iBGP 学到的路由不再转给 iBGP 邻居(§9.2)→ 全互联或 RR。 |
| 编号 | 内容 |
|---|---|
| RFC 4271 | A Border Gateway Protocol 4 (BGP-4),2006-01。本页主要依据:§4 报文格式、§5 路径属性、§6 错误处理、§8 FSM、§9 决策与 RIB。 |
| RFC 4760 | Multiprotocol Extensions for BGP-4,2007-01。第 9 节依据:AFI/SAFI、MP_REACH/MP_UNREACH_NLRI、能力协商。 |
| RFC 4456 | BGP Route Reflection,2006-04。第 7 节依据:Client/Non-Client 反射规则、ORIGINATOR_ID、CLUSTER_LIST(废止 RFC 2796/1966)。 |
| RFC 1997 | BGP Communities Attribute,1996-08。第 8.1 节依据:COMMUNITIES(Type 8)与三个知名团体值。 |
| RFC 4360 | BGP Extended Communities Attribute,2006-02。第 8.2 节依据:8 字节扩展团体(Type 16)、RT 与 Route Origin。 |
| RFC 7432 | BGP MPLS-Based Ethernet VPN,2015-02。第 10 节依据:EVPN 架构、EVPN NLRI 与 RT-1–RT-4、AFI 25/SAFI 70。 |
| RFC 8365 | A Network Virtualization Overlay Solution Using EVPN,2018-03。VXLAN 封装下 EVPN 路由的用法(VNI、标签字段复用)。 |
| RFC 9136 | IP Prefix Advertisement in EVPN,2021-09。RT-5 编码与对称 IRB 流程(IRB 模型见 RFC 9135)。 |
| RFC 7938 | Use of BGP for Routing in Large-Scale Data Centers,2016-08。Clos 拓扑 eBGP 通吃 Underlay/Overlay 的设计实践与 ASN 布局。 |
| RFC 2918 | Route Refresh Capability for BGP-4,2000-09。ROUTE-REFRESH(Type 5)软重置。 |
| RFC 3392 | Capabilities Advertisement with BGP-4,2002-11。OPEN 可选参数类型 2 能力协商框架(RFC 5492 修订并增补子码 7)。 |
| RFC 5065 | Autonomous System Confederations for BGP,2007-08。联盟:另一种 iBGP 扩展性方案(与 RR 互补)。 |
| RFC 6793 | BGP Support for Four-Octet AS Number Space,2012-12。4 字节 ASN 与 AS_TRANS/AS4_PATH 兼容机制。 |
| RFC 6996 | Autonomous System (AS) Reservation for Private Use,2013-07。私有 ASN 段(64512–65534、4200000000–4294967294)。 |