一、为什么路由必须分层

第 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 让它能:

  1. 从相邻 AS 获得前缀可达性信息
  2. 向 AS 内部所有路由器传播这些信息
  3. 基于策略决定到每个前缀走"好"路径

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 基本未部署。


八、随堂自测

  1. 路由分层的两个理由是什么?哪一个是纯技术的,哪一个不是?
  2. 域内路由和域间路由的目标有什么根本差异?
  3. OSPF 的区域结构解决了什么问题?它与 CIDR 地址聚合的共同思想是什么?
  4. eBGP 和 iBGP 的区别是什么?BGP 为什么用 TCP?
  5. AS_PATH 的两个作用是什么?它如何解决了 DV 的环路问题?
  6. 写出 BGP 路由选择的优先级顺序。为什么 LOCAL_PREF 排第一?
  7. 什么是热土豆路由?它导致了什么现象?
  8. 陈述 Gao-Rexford 的路由通告规则,并解释「从提供商学到的路由不通告给对等方」的商业逻辑。
  9. 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 相同的激励错配)。