动态路由协议进阶:OSPF 与 BGP 的选路逻辑、收敛与排障
静态路由能解决「我知道怎么去」的问题,动态路由解决的是「网络会变,怎么自动、快速、正确地重新找到路」。上一篇文章聊的是 IP 子网与 VLAN——那是「链路层到网络层怎么把包送到隔壁」;这一篇往上走一层,讲路由器之间如何交换「我能到达哪些网段」的信息,并各自独立地算出一条到达全网的最优路径。
一、为什么需要动态路由:收敛才是核心价值
动态路由协议存在的根本原因不是「省得手工配」,而是收敛(convergence)——网络拓扑发生变化(链路断了、设备挂了、新链路加进来)后,全网路由器在尽可能短的时间内重新达成一致的、无环路的路由表。衡量一个 IGP 好坏,收敛速度是最关键的指标之一:
| 协议 | 算法 | 收敛速度 | 适用规模 |
|---|---|---|---|
| RIP | 距离矢量(跳数) | 慢(最大 15 跳 + 定时刷新) | 小网络,已基本淘汰 |
| OSPF | 链路状态 + SPF(Dijkstra) | 快(增量更新) | 中大型企业网 |
| IS-IS | 链路状态 + SPF | 快,扩展性极强 | 运营商骨干 |
| BGP | 路径矢量(携带完整 AS 路径) | 较慢(策略驱动,不是速度优先) | AS 之间 / 大型数据中心 |
关键认知:距离矢量协议「传的是传闻」(我只告诉你我从邻居听来的方向),链路状态协议「发的是事实」(我把自己的链路状态洪泛给全网,各自算图)。传闻式的 RIP 之所以会数到无穷(count-to-infinity),根源就是它没有全网拓扑、只能靠跳数上限与水平分割硬扛;而 OSPF 每台路由器手里都有一张完整的 LSDB(链路状态数据库),算出来的路径天然无环。
二、OSPF:链路状态、LSA 与区域设计
OSPF 的三个核心概念——邻接关系、LSA(链路状态通告)、SPF 计算——对应三个问题:跟谁交换、交换什么、怎么算路。
1. 邻接关系:不是所有邻居都会交换 LSA
OSPF 邻居之间要先经历 Down → Init → 2-Way → Exstart → Exchange → Loading → Full 七种状态,最终进入 Full 才真正同步了 LSDB。广播网络上不是每两台邻居都交换信息,而是选举出 DR/BDR,其余路由器只和 DR 建立邻接——这是为了把 N² 的泛洪流量压成 O(N)。诊断时最常卡在这两个状态:
# 邻居一直卡在 2-Way / Exstart,先查这几点:
show ip ospf neighbor # 看状态是 Full 还是卡住
show ip ospf interface # 核对 Hello/Dead 定时器、区域 ID、MTU 是否一致
show ip ospf interface s1/0 | include MTU # MTU 不一致 → 卡 Exstart 的经典原因
建立邻接的四个必须一致:区域 ID、Hello/Dead 定时器、认证(类型与密钥)、(在部分实现里)网络掩码与 MTU。任何一个不一致,邻居就永远停在 2-Way。
2. LSA 类型:知道每种通告在说什么
| 类型 | 名称 | 由谁产生 | 作用 |
|---|---|---|---|
| Type 1 | Router LSA | 每台路由器 | 描述自己的直连链路与开销 |
| Type 2 | Network LSA | DR | 描述一个广播网段上有哪些路由器 |
| Type 3 | Summary LSA | ABR(区域边界路由器) | 把其他区域的路由汇总注入本区域 |
| Type 4 | ASBR Summary | ABR | 告诉区域「ASBR 在哪」 |
| Type 5 | External LSA | ASBR | 重发布进来的外部路由(如从 BGP 引入) |
| Type 7 | NSSA External | NSSA 区域内的 ASBR | NSSA 区域里的外部路由,出区域时转成 Type 5 |
一个实用技巧:看到路由表里 O IA(域间)、O E1/E2(域外)、O N1/N2(NSSA 域外)的前缀,就知道这条路由经过了怎样的区域穿越。E2 是默认的外部度量类型(度量不累加),E1 会把沿途开销也算进去——多 ASBR 出口选路时这两者差别很大。
3. 区域设计:为什么不能全塞一个 Area 0
OSPF 引入「区域」是为了限制 LSA 泛洪范围、缩小 SPF 计算规模、加快收敛。设计铁律:所有非骨干区域必须通过 ABR 直连 Area 0(骨干区),区域间路由永远绕不开骨干。骨干区的 LSDB 最小、SPF 最快,这是把高频变动隔离在边缘区域、把骨干做成「稳定快车道」的代价。
# 特殊区域类型,本质都是「在边缘区域里少发某类 LSA」
Stub # 不收 Type 5 外部路由,用一条默认路由代替
Totally Stub # 连 Type 3 域间汇总都不要,只剩一条默认
NSSA # 允许引入外部路由,但用 Type 7 承载(Stub 的增强版)
什么时候该上特殊区域?答案是:当一个区域里全是「末端」路由器、不需要感知外部世界细节时,把它做成 Stub/NSSA,能显著减小该区域的 LSDB 和内存开销。这是企业网 OSPF 调优里性价比最高的手段之一。
三、BGP:选路不是「最快」,而是「最符合策略」
BGP 与 IGP 有一个根本区别:IGP 追求客观最优(最短、最快),BGP 追求策略可控。BGP 的目标不是把包最快送到,而是让 AS 管理员能精确表达「我这条路由只发给谁、我从谁那里更愿意收」的商业与技术策略。
1. 路径属性与选路决策顺序
BGP 靠 路径属性(Path Attributes) 承载策略。收到同一条前缀的多条路径时,路由器按下面这个(简化后的)顺序逐级比较,选出最优:
- Weight(最高优先)——Cisco 私有,本路由器本地有效,越大越优先
- Local Preference(本地优先级)——在 AS 内传播,控制「出站」方向,越大越优先
- 本地始发优先——自己 network / 重发布的路由优先于从邻居学到的
- AS Path 最短优先——AS 路径越短越优先
- Origin——i(network)优于 e(EGP)优于 ?(重发布)
- MED——影响邻居「入站」方向,越小越优先(只在同邻居 AS 之间比较)
- eBGP 优于 iBGP、最近的 IGP 下一跳、最老的 eBGP 路由、最小的 Router-ID……
2. eBGP 与 iBGP 的环路防范差异
BGP 防环机制因对等关系类型而不同:
- eBGP(跨 AS):靠 AS Path 防环——收到路径里已包含自己的 AS 号就丢弃。
- iBGP(AS 内部):AS Path 在 AS 内不变,防不了环,于是靠两条规则:iBGP 邻居之间学到的路由不转发给其他 iBGP 邻居,以及全互联(full mesh)或路由反射器(RR)/联盟。
这就是为什么大型 AS 里要么 full mesh(规模小时),要么上 Route Reflector——RR 打破了「iBGP 不转发」的规则,允许把从 iBGP 邻居学来的路由反射给其他 iBGP 邻居,用 Originator ID 和 Cluster List 防止路由循环。理解这一点,才能看懂现代数据中心 CLOS 架构里 BGP 的部署形态。
四、排障:从「现象」反推「协议层」
1. 路由通不了,先分层定位
# 拓扑里一条路由不生效,按顺序追问:
show ip route 10.1.1.0/24 # 路由表里有没有?走哪条协议?
traceroute 10.1.1.1 # 包卡在哪一跳?
show ip ospf neighbor # OSPF 邻接 Full 了吗?
show ip bgp summary # BGP 对等 Established 了吗?
show ip bgp 10.1.1.0/24 # BGP 表里这条前缀最优吗?下一跳可达吗?
一个高频坑:BGP 下一跳不可达。eBGP 学到的路由下一跳是直连对端,天然可达;但 iBGP 场景下,路由的下一跳仍是外部 eBGP 对端地址,而 iBGP 邻居不一定会递归解析到这条下一跳——此时路由虽进 BGP 表,却因为下一跳不可达而装不进路由表。解决方法是 next-hop-self:让 ASBR 把下一跳改成自己。
2. 环路与路由震荡的常见诱因
IGP 侧最常见的是重发布环路:把 OSPF 重发布进 RIP、又同时把 RIP 重发布回 OSPF,两个域互相喂路由,极易成环。对策是严格的 route-map/tag 过滤与方向控制。BGP 侧则是路由震荡(route flap)——链路频繁 up/down 导致路由反复撤销/通告,用 dampening(路由衰减)惩罚不稳定的前缀,避免它们反复触发全网重计算。
五、选择建议:什么时候用 OSPF,什么时候上 BGP
| 场景 | 推荐 | 理由 |
|---|---|---|
| 企业园区网内部 | OSPF | 收敛快、无环、按区域扩展 |
| 数据中心 CLOS(Leaf-Spine) | BGP(eBGP) | 策略灵活、大规模易扩展、ECMP 友好 |
| 接多个运营商/互联网出口 | BGP | 唯一能表达跨 AS 策略的协议 |
| VPN / MPLS 骨干 | IS-IS + BGP | IS-IS 扩展性强,BGP 承载 VPNv4 路由 |
趋势值得注意:BGP 正在「下沉」到数据中心内部。传统上「IGP 跑网内、BGP 跑网间」的边界正在模糊,Leaf-Spine 架构大规模采用 eBGP 替代 OSPF/IS-IS,因为它把「路由策略」与「转发平面」解耦得更彻底,也更容易与自动化(如 Ansible、SDN 控制器)协同。