一、为什么路由必须分层
第 20 讲的算法有一个隐含假设:网络是一张扁平的图,所有路由器地位平等。
这在真实互联网上完全不可行,两个原因:
1️⃣ 规模(Scale)
全球有约 10 亿台以上的联网设备、几十万条 BGP 前缀
⭐ 若用扁平的链路状态算法:
- 每台路由器要存储全球拓扑 → 内存爆炸
- 链路状态泛洪的报文量 → 链路被路由报文淹没
- Dijkstra 的计算量 → CPU 跑不动
2️⃣ 管理自治(Administrative Autonomy)
⭐ 这个理由同样重要,甚至更重要。
中国电信、AT&T、Google 各自的网络:
- 想用自己选择的路由协议
- 不想向外部暴露内部拓扑(这是商业机密)
- 要按【商业合同】而不是【最短路径】来选路
互联网不是一个网络,而是几万个独立管理的网络的集合。
自治系统(AS)
AS = 处于同一管理控制之下的一组路由器
每个 AS 有一个全球唯一的 ASN(Autonomous System Number,32 位)
两级路由:
| 域内路由(Intra-AS) | 域间路由(Inter-AS) | |
|---|---|---|
| 范围 | 一个 AS 内部 | AS 之间 |
| 目标 | ⭐ 性能(最短路径) | ⭐ 策略(商业关系) |
| 协议 | OSPF、IS-IS、RIP、EIGRP | ⭐ BGP(唯一) |
| 拓扑可见性 | 内部完全可见 | 只见 AS 级路径 |
| 管理 | 单一管理者,可统一决策 | 多方,需要协商 |
📌 记住这个对比的核心:
域内追求「最快」,域间追求「符合合同」。
二、OSPF(Open Shortest Path First)
2.1 基本特征
- ⭐ 链路状态算法(第 20 讲的 Dijkstra)
- 链路状态通告(LSA)向整个 AS 泛洪
- 每台路由器构建完整的 AS 拓扑图,各自运行 Dijkstra
- ⭐ 直接跑在 IP 之上(协议号 89),不用 TCP 或 UDP——它自己实现可靠泛洪
- “Open” 指的是开放标准(对比 Cisco 私有的 EIGRP)
2.2 相对 RIP 的优势
| 特性 | 说明 |
|---|---|
| 安全 | ⭐ OSPF 报文可认证(防止恶意路由器注入虚假路由) |
| 等价多路径(ECMP) | 多条同开销路径可同时使用,做负载均衡 |
| 对不同 ToS 用不同开销 | 可为不同业务计算不同的最短路径树 |
| 集成单播与多播 | MOSPF |
| ⭐ 支持分层 | 见下节 |
| 快速收敛 | 事件驱动泛洪,秒级 |
2.3 分层的 OSPF:区域(Area)⭐
即使在一个 AS 内部,链路状态泛洪在大型网络上依然太重。OSPF 的解法是再分一层:
┌──────────────────────────┐
│ 骨干区域 Area 0 │
│ ⭐ 所有区域必须与它相连 │
└───┬──────────┬───────┬───┘
区域边界│ 区域边界│ │区域边界
路由器 │ 路由器 │ │路由器
┌────────▼─┐ ┌───────▼──┐ ┌──▼───────┐
│ Area 1 │ │ Area 2 │ │ Area 3 │
└──────────┘ └──────────┘ └──────────┘
四类路由器:
| 类型 | 职责 |
|---|---|
| 内部路由器 | 只在一个区域内,只知道本区域拓扑 |
| 区域边界路由器(ABR) | ⭐ 属于多个区域,汇总本区域的路由通告给骨干 |
| 骨干路由器 | 在 Area 0 内做区域间路由 |
| AS 边界路由器(ASBR) | ⭐ 连接其他 AS,运行 BGP |
⭐ 关键收益:
链路状态泛洪【只在区域内部】进行
区域之间只交换【汇总后的路由信息】
→ 泛洪流量、拓扑数据库、Dijkstra 计算量都被限制在区域规模
📌 注意这与第 18 讲的 CIDR 地址聚合是同一个思想:层次化 + 汇总 = 可扩展性。这条原则在网络里反复出现。
三、BGP:把互联网粘在一起的协议
⭐ **BGP 是互联网上唯一的域间路由协议。**没有替代品,没有竞争者。它是互联网真正意义上的「粘合剂」。
3.1 BGP 提供什么
对每个 AS,BGP 让它能:
- 从相邻 AS 获得前缀可达性信息
- 向 AS 内部所有路由器传播这些信息
- ⭐ 基于策略决定到每个前缀走"好"路径
3.2 两种 BGP 会话
AS1 AS2
┌──────────────┐ ┌──────────────┐
│ 1a ─── 1b │ │ 2a ─── 2b │
│ │ iBGP │ │ │ │ iBGP │ │
│ 1c ─── 1d ──┼──── eBGP ──┼── 2c │
└──────────────┘ └──────────────┘
| eBGP | iBGP | |
|---|---|---|
| 谁和谁 | 不同 AS 的边界路由器之间 | 同一 AS 内部的路由器之间 |
| 作用 | 交换前缀可达性 | 把从外部学到的路由分发到 AS 内部 |
| 传输 | ⭐ TCP 179 端口(半永久连接) | 同左 |
⚠️ 为什么 BGP 用 TCP?因为路由信息必须可靠传输——丢一条路由撤销消息可能导致长期的黑洞。BGP 直接复用 TCP 的可靠性,不自己造轮子。
3.3 路径属性
BGP 通告的每条路由包含前缀 + 属性。两个最重要的属性:
1️⃣ AS_PATH ⭐
前缀 203.0.113.0/24 的 AS_PATH: [AS7 AS22 AS45]
含义:这条路由依次经过了 AS7 → AS22 → AS45 才到达该前缀
两个作用:
- 防环路 ⭐:若一个 AS 在收到的路由中看到自己的 ASN,立即丢弃该路由
- 策略依据:可以按路径长度或是否经过某个 AS 来做决策
📌 这就是 BGP 被称为「路径向量」(path-vector)协议的原因。回顾第 20 讲:DV 的无穷计数问题源于只传距离、丢失路径。BGP 通过携带完整的 AS 路径,从根本上消除了环路问题。
2️⃣ NEXT_HOP
到达该前缀的下一跳路由器的 IP 地址。用于把 BGP 路由和内部的 IGP 路由拼接起来。
其他常用属性:
| 属性 | 作用 | 范围 |
|---|---|---|
| LOCAL_PREF | ⭐ 本 AS 内部对多条路由的偏好(越大越优) | 仅 AS 内部 |
| MED | 建议邻居 AS 从哪个入口进来(越小越优) | 相邻 AS |
| COMMUNITY | 打标签,用于灵活的策略传递 | 可跨 AS |
3.4 路由通告与策略过滤 ⭐
关键点:AS 可以选择不通告某些路由。
┌───────┐ ┌───────┐ ┌───────┐
│ X │─────────│ B │────────│ A │
└───────┘ └───────┘ └───────┘
│
┌───────┐
│ C │
└───────┘
假设 X 是双宿主(同时接了 B 和 C)的末梢 AS(stub AS,不为别人转发)。
⭐ X 会通告什么?
X 向 B 通告:「我可以到达 X 的前缀」
X 向 C 通告:「我可以到达 X 的前缀」
⚠️ X 【不会】向 B 通告「我可以到达 C」
也【不会】向 C 通告「我可以到达 B」
**为什么?因为 X 不想成为 B 和 C 之间的过境(transit)**流量通道——为别人转发流量要花钱,而没有收入。
🎯 这就是 BGP 与所有其他路由协议的根本差异:路由通告是一个商业决策,不是技术决策。
四、BGP 路由选择算法
一个路由器可能收到到同一前缀的多条路由。按以下优先级依次判断,直到分出胜负:
① LOCAL_PREF 最大者胜 ⭐ 本 AS 的策略偏好,凌驾一切
② AS_PATH 最短者胜 ⭐ 才轮到"性能"
③ 最近的 NEXT_HOP(IGP 开销最小) ⭐ 热土豆路由
④ 其他附加准则(router ID 等)
⚠️ 注意第 ① 条排在最前面。
⭐ 策略优先于性能。这一条决定了互联网上的流量实际怎么走。
这解释了一个常见现象:从北京访问某个香港的网站,数据包可能绕道美国。不是因为那样更快,而是因为沿途某个 AS 的商业策略如此。
热土豆路由(Hot Potato Routing)⭐
第 ③ 条的具体含义:
AS1 AS2 (目的地在这边)
┌──────────────┐
│ 1b ── 1c ────┼─── 出口 A ──▶
│ │ │ │
│ 1a ── 1d ────┼─── 出口 B ──▶
└──────────────┘
若两条路由的 LOCAL_PREF 和 AS_PATH 都相同,
⭐ 路由器选择【离自己最近的出口】,把分组尽快甩出本 AS
名字的由来:像扔烫手山芋一样,尽快把流量甩给别人。
动机很直白:
- 分组在自己网络里多走一米,就多消耗一分自己的带宽和成本
- 出了自己的网络,成本就是别人的了
⚠️ 后果:这导致路径不对称。A→B 的路径和 B→A 的路径经常完全不同,因为两边各自在做热土豆。这给网络排障带来了极大困难(traceroute 只能看到单向路径)。
五、策略:Gao-Rexford 规则
AS 之间的关系有三类(第 1 讲的 ISP 层级):
提供商(provider) ──── 我付钱给它
对等方(peer) ──── 互不付费
客户(customer) ──── 它付钱给我
Gao-Rexford 规则(描述了实际的商业逻辑):
规则 1:路由通告规则 ⭐
从【客户】学到的路由 → 通告给【所有人】 (越多人用我的客户,我赚越多)
从【对等方】学到的路由 → ⭐ 只通告给【客户】
从【提供商】学到的路由 → ⭐ 只通告给【客户】
核心逻辑:只有转发能带来收入的流量才转发。
若我把从提供商学到的路由通告给对等方,
→ 对等方的流量会经过我去往我的提供商
→ ⭐ 我要向提供商付费,却从对等方收不到钱
→ 纯亏损,绝不这么做
规则 2:路由选择偏好
客户路由 > 对等方路由 > 提供商路由
(有收入) (免费) (要付费)
这通过设置 LOCAL_PREF 实现——现在你明白为什么 LOCAL_PREF 排在选路算法的第一位了。
📌 Gao-Rexford 规则的一个重要理论结果:如果所有 AS 都遵守这两条规则,BGP 保证收敛(不会永久震荡)。如果有 AS 采用了任意的策略,BGP 可能永不收敛——这是一个已被证明的结论。
🎯 互联网的稳定性,部分地建立在「所有人都按同一套商业逻辑行事」这个假设之上。
六、BGP 的安全问题 ⭐
6.1 根本缺陷
⚠️ BGP 没有任何机制验证一个 AS 是否真的有权通告某个前缀。
这是第 4 讲说的「诞生于相互信任的环境」在域间路由上的体现,而且后果最严重。
6.2 BGP 劫持(Hijacking)
攻击方式:某个 AS 通告一个不属于自己的前缀。由于最长前缀匹配(第 17 讲),通告更具体的前缀会吸引全球流量。
真实持有者通告: 203.0.113.0/24
攻击者通告: 203.0.113.0/25 和 203.0.113.128/25
⭐ /25 比 /24 更长 → 全球流量被吸引到攻击者
真实案例:
| 年份 | 事件 |
|---|---|
| 2008 | 巴基斯坦电信为屏蔽 YouTube 通告了更具体的前缀,意外泄漏到全球,导致 YouTube 全球中断约 2 小时 |
| 2018 | 攻击者劫持了 Amazon Route 53 的 DNS 前缀,配合伪造证书,从 MyEtherWallet 用户处窃取约 15 万美元的加密货币 |
| 多次 | 大流量被短暂绕经不该经过的国家,引发监听担忧 |
注意 2008 年那次的性质:它不是攻击,是配置错误意外泄漏。BGP 的脆弱性在于,一次误操作和一次攻击的效果完全一样。
6.3 防御
RPKI(Resource Public Key Infrastructure)
地址分配机构为每个前缀签发 ROA(Route Origin Authorization):
「AS 64500 有权通告 203.0.113.0/24」
路由器验证收到的路由的【起源 AS】是否匹配 ROA
匹配 → valid
不匹配 → ⭐ invalid,丢弃
⚠️ RPKI 的局限(必须理解):
RPKI 只验证路径的【起点】,不验证路径本身。
攻击者可以伪造 AS_PATH,声称:
「我是 AS999,我经由 AS64500 到达 203.0.113.0/24」
起源 AS 是正确的 → ⭐ RPKI 检查通过
但整条路径是编造的 → 流量仍被劫持
BGPsec:对整条 AS_PATH 逐跳签名,能解决上述问题。
⚠️ 但部署几乎为零,原因:
- 每跳都要做密码学签名/验证,性能开销大
- 要求路径上所有 AS 都部署才有效——又一个全有全无的协同问题
- 与 IPv6 一样的激励错配
📌 现状:RPKI 起源验证在近几年快速普及(大型 ISP 和 IXP 广泛部署),已经能挡住大部分误配置和简单攻击;但针对路径的攻击仍然可行。
🎯 这是本课程中最值得记住的一个安全结论: 互联网的路由系统,至今仍建立在「相信别人说的话」之上。
七、例题(Worked Example)
题目:AS 拓扑如下,箭头表示商业关系(→ 表示"是……的提供商"):
AS1 ────peer──── AS2
│ │
provider provider
↓ ↓
AS3 ────peer──── AS4
│
provider
↓
AS5 (持有前缀 P = 198.51.100.0/24)
(a) AS5 通告前缀 P。按 Gao-Rexford 规则,这条路由会被通告到哪些 AS?
(b) AS2 会不会收到到 P 的路由?路径是什么?
(c) 若 AS3 同时从 AS5(客户)和 AS4(对等方)收到到 P 的路由,它会选哪条?
(d) 若 AS4 恶意通告 198.51.100.0/25,会发生什么?RPKI 能挡住吗?
解答:
(a) 路由传播
AS5 → AS3 (客户向提供商通告自己的前缀)✓
AS3 收到的是【客户路由】→ ⭐ 通告给所有人:
AS3 → AS1(提供商)✓
AS3 → AS4(对等方)✓
AS1 收到的是【客户路由(AS3 是 AS1 的客户)】→ 通告给所有人:
AS1 → AS2(对等方)✓
AS4 收到的是【对等方路由(AS3 是 AS4 的对等方)】→ ⭐ 只通告给客户
AS4 没有客户 → 不再传播
AS2 收到的是【对等方路由】→ 只通告给客户 → 无客户,不再传播
结论:P 的路由传播到了 AS1、AS2、AS3、AS4,即全部 AS。
(b) AS2 收到的路径
AS_PATH = [AS1, AS3, AS5]
⚠️ 注意 AS2 收不到经由 AS4 的路径——因为 AS4 从对等方 AS3 学到的路由,按规则只通告给客户,而 AS2 是 AS4 的提供商,不是客户。
(c) AS3 的选择
按 BGP 选路算法第 ① 条 LOCAL_PREF,按 Gao-Rexford 规则 2:
客户路由(来自 AS5) > 对等方路由(来自 AS4)
⭐ 选择经 AS5 的路由
理由是商业的,不是技术的:经 AS5 的流量是客户流量(AS5 付钱给 AS3),而经 AS4 的对等路由不产生收入。即使经 AS4 的路径 AS_PATH 更短,也选 AS5——因为 LOCAL_PREF 的优先级高于 AS_PATH 长度。
(d) 劫持与 RPKI
AS4 通告 198.51.100.0/25 和 198.51.100.128/25
⭐ /25 比 AS5 通告的 /24 更长
→ 由最长前缀匹配,所有收到这些路由的 AS 都会把流量送往 AS4
→ 劫持成功
RPKI 能否挡住?
⭐ **能挡住这一种。**因为 ROA 会声明「AS5 有权通告 198.51.100.0/24,最大长度 /24」。AS4 通告的 /25 存在两个问题:起源 AS 是 AS4(不是 AS5),且前缀长度超出 ROA 允许的 maxLength。两条都不匹配,路由被判定为 invalid 并丢弃。
⚠️ 但如果 AS4 伪造 AS_PATH,声称 [AS4, AS5](即"我从 AS5 学到的"),起源 AS 显示为 AS5,RPKI 的起源验证就通过了(前缀长度问题仍会被 maxLength 拦住,但若 AS4 只劫持 /24 则完全通过)。这需要 BGPsec 才能防御,而 BGPsec 基本未部署。
八、随堂自测
- 路由分层的两个理由是什么?哪一个是纯技术的,哪一个不是?
- 域内路由和域间路由的目标有什么根本差异?
- OSPF 的区域结构解决了什么问题?它与 CIDR 地址聚合的共同思想是什么?
- eBGP 和 iBGP 的区别是什么?BGP 为什么用 TCP?
- AS_PATH 的两个作用是什么?它如何解决了 DV 的环路问题?
- 写出 BGP 路由选择的优先级顺序。为什么 LOCAL_PREF 排第一?
- 什么是热土豆路由?它导致了什么现象?
- 陈述 Gao-Rexford 的路由通告规则,并解释「从提供商学到的路由不通告给对等方」的商业逻辑。
- RPKI 验证什么,不验证什么?为什么 BGPsec 没有被部署?
九、本讲要点回顾
- 路由分层的两个理由:规模(技术)与管理自治(非技术)。
- ⭐ 域内追求最快,域间追求符合合同。
- OSPF 是链路状态协议,用区域限制泛洪范围;Area 0 是骨干,所有区域必须连到它。
- ⭐ BGP 是互联网唯一的域间路由协议,跑在 TCP 179 上。
- AS_PATH 既防环路(看到自己就丢弃)又是策略依据 → BGP 是路径向量协议。
- 选路顺序:LOCAL_PREF → AS_PATH 长度 → 热土豆 → 其他。⭐ 策略优先于性能。
- 热土豆路由让流量尽快离开本 AS,导致路径不对称。
- Gao-Rexford:只通告能带来收入的路由;客户路由 > 对等 > 提供商。所有人遵守时 BGP 才保证收敛。
- ⚠️ BGP 不验证前缀所有权。RPKI 只验证起源,不验证路径;BGPsec 能验证路径但基本未部署。
十、自测答案
1. ① 规模:扁平路由要求每台路由器存储全球拓扑、参与全网泛洪、计算全网最短路径,在几十万条前缀的规模下完全不可行。② 管理自治:各 ISP 想自主选择内部协议、不愿暴露内部拓扑(商业机密)、要按商业合同而非最短路径选路。第一条是纯技术的,第二条是商业与治理的——而后者往往是更硬的约束。
2. 域内路由的目标是性能(找最短/最快路径),因为整个 AS 由一个管理者控制,可以统一优化。域间路由的目标是策略(按商业关系选路),因为跨越多个互相独立、有商业竞争关系的组织,“最优"的定义因人而异且涉及金钱。
3. 解决了链路状态泛洪与拓扑数据库在大型 AS 内规模过大的问题:泛洪只在区域内进行,区域之间只交换汇总路由,因而泛洪流量、内存和 Dijkstra 计算量都被限制在区域规模。与 CIDR 地址聚合的共同思想是层次化 + 汇总:在层次的边界上把细节压缩成摘要,用信息隐藏换取可扩展性。
4. eBGP 在不同 AS 的边界路由器之间运行,用于交换前缀可达性;iBGP 在同一 AS 内部的路由器之间运行,用于把从外部学到的路由分发给 AS 内所有路由器。两者都跑在 TCP 179 上。用 TCP 是因为路由信息必须可靠、有序地传输——丢失一条路由撤销消息会造成长期的流量黑洞,而 TCP 已经提供了现成的可靠性,无需重新实现。
5. ① 防环路:一个 AS 收到路由时若在 AS_PATH 中看到自己的 ASN,说明这条路由绕回来了,立即丢弃。② 策略依据:可按路径长度或是否经过某个特定 AS 来做选路决策。它解决 DV 环路问题的方式是携带完整路径信息——第 20 讲指出无穷计数的根因正是 DV 只传距离数字、丢失了路径,无法判断"这条路是不是绕过我自己”;BGP 把路径本身也传过去,环路一眼可辨。
6. ① LOCAL_PREF 最大者胜;② AS_PATH 最短者胜;③ NEXT_HOP 的 IGP 开销最小者胜(热土豆);④ 其他附加准则(如 router ID 最小)。LOCAL_PREF 排第一,是因为它编码了本 AS 的商业策略——按 Gao-Rexford 规则 2,客户路由要优于对等方路由、对等方路由要优于提供商路由,这个偏好必须凌驾于任何性能考量之上,否则 AS 会为不产生收入的流量付费。
7. 当多条路由的 LOCAL_PREF 和 AS_PATH 都相同时,路由器选择离自己最近的出口(IGP 开销最小的 NEXT_HOP),把分组尽快甩出本 AS,因为分组在自己网络中每多走一段就多消耗一分自己的资源。它导致了路径不对称:A→B 与 B→A 走完全不同的路径,因为两端各自在做热土豆。这使得单向 traceroute 无法反映真实的往返路径,给网络排障带来很大困难。
8. 通告规则:从客户学到的路由通告给所有人;从对等方学到的路由只通告给客户;从提供商学到的路由只通告给客户。「从提供商学到的路由不通告给对等方」的逻辑:若通告了,对等方的流量就会经过我去往我的提供商——我需要向提供商付费来转发这些流量,却无法从对等方收取任何费用(peering 是免费的)。这是纯粹的亏损,因此绝不这样做。
9. RPKI 通过 ROA 验证**「某个前缀的起源 AS 是否有权通告它」(以及前缀长度是否超出授权的 maxLength)。它不验证 AS_PATH 的真实性**——攻击者可以伪造路径,声称自己是从合法的起源 AS 学到的,只要起源 AS 字段填对,RPKI 就会放行。BGPsec 通过对整条 AS_PATH 逐跳签名解决这个问题,但未被部署,原因是:① 每跳的密码学运算带来显著性能开销;② 只有当路径上所有 AS 都部署才有效,是一个全有全无的协同问题;③ 部署者承担成本而收益扩散到整个生态(与 IPv6 相同的激励错配)。