因特网路由:自治系统、OSPF与BGP基础
自治系统
4.8节和4.9节把整个网络看作一张图,所有路由器都运行同一个路由选择算法。在真实的因特网中,这种做法行不通:
- 规模问题。因特网有数以亿计的目的网络,如果每台路由器都要保存全网拓扑并向全网泛洪链路状态,存储和通信开销都无法承受;距离向量算法在这么大的网络中也永远无法收敛。
- 管理自治。因特网是由许多ISP组成的“网络的网络”,每个ISP都希望按自己的意愿运营网络,选择自己的路由算法,并对外隐藏内部结构。
解决办法是把路由器组织成自治系统(AS, Autonomous System):一个AS由同一个管理机构控制的一组路由器组成,通常是一个ISP或一个大型机构的网络,用全球唯一的AS号(ASN)标识。同一个AS内的路由器运行相同的AS内部路由选择协议;不同AS之间则统一使用AS间路由选择协议BGP。负责把本AS与其他AS连接起来的路由器称为网关路由器。
| AS内部路由 | AS之间路由 | |
|---|---|---|
| 协议 | 由各AS自行选择,例如OSPF、RIP | 全因特网统一使用BGP |
| 目标 | 在AS内找到开销最低的路径 | 在满足策略的前提下到达其他AS |
| 是否考虑商业策略 | 一般不考虑 | 策略往往比路径长短更重要 |
开放最短路径优先OSPF
OSPF(Open Shortest Path First)是使用最广泛的AS内部路由选择协议之一,它是一种链路状态协议:
- 每台路由器向本AS内的所有路由器泛洪链路状态通告,每台路由器都得到完整的拓扑,再在本地运行Dijkstra算法,得到以自己为根的最短路径树。
- 链路开销由网络管理员设置。例如把所有开销设为1,就得到最少跳数路由;也可以让开销与链路带宽成反比,使流量尽量走高带宽链路。
- 链路状态变化时立即泛洪,即使没有变化也会周期性地(至少每30分钟一次)重新通告。OSPF报文直接封装在IP数据报中,协议号为89。
- 支持报文鉴别,防止恶意路由器注入错误信息;支持多条开销相同的路径(等价多路径),分担流量。
- 支持层次结构:一个AS可以分成多个区域(area),链路状态通告只在区域内泛洪;一个特殊的主干区域(area 0)连接所有区域,区域边界路由器负责在区域之间汇总路由。
知识测验
边界网关协议BGP
BGP(Border Gateway Protocol)是因特网中唯一使用的AS间路由选择协议,被称为把数以万计的AS“粘合”在一起的协议。在BGP中,目的不是单台主机,而是CIDR形式的前缀,例如138.16.64.0/22。BGP为每台路由器提供两项功能:
- 从相邻AS获得前缀的可达性信息。BGP让每个子网都能向因特网的其余部分宣告:“我在这里。”
- 根据可达性信息和AS的策略,确定到达各个前缀的“最好”路由。
相邻AS的网关路由器之间通过TCP(端口179)建立外部BGP(eBGP)会话,同一AS内的路由器之间则通过内部BGP(iBGP)会话传播学到的路由。一条BGP路由由前缀和若干属性组成,其中两个重要属性是:
- AS-PATH:通告经过的AS列表。每当通告传入一个新的AS,该AS就把自己的AS号加到列表前面。如果路由器在AS-PATH中看到了自己的AS号,就拒绝这条通告,从而避免环路。
- NEXT-HOP:AS-PATH起点处那台路由器接口的IP地址,即离开本AS时要交给的那台路由器。
传播BGP路由,观察AS-PATH增长
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
热土豆路由与BGP选路
一台路由器往往会学到多条去往同一前缀的路由。如果这些路由只是经由不同的网关离开本AS,最简单的选择方法是热土豆路由(hot potato routing):选择在AS内部到达代价最小的那个网关(到NEXT-HOP的开销由AS内部路由协议算出),尽快把分组“扔”出本AS,而不关心它在AS外部还要走多远。
实际的BGP按以下顺序依次比较,直到只剩一条路由:
- 本地偏好(local preference)最高。本地偏好由AS的管理员根据策略设置。
- AS-PATH最短。
- 到NEXT-HOP的开销最小,即热土豆路由。
- 用BGP标识符(路由器标识)打破最后的平局。
BGP中策略往往比性能更重要。例如一个同时连接两家ISP的客户网络(多宿主网络)不愿意为两家ISP之间的流量提供转接,它就不应把从一家ISP学到的路由再通告给另一家;ISP通常也只愿意转接自己客户的流量,而不愿意免费为其他ISP承载流量。
选择出口:热土豆路由与BGP选路规则
解锁完整互动实验、进阶解析与精选参考答案。
应用BGP选路规则
AS100中的某台路由器有四条去往203.0.113.0/24的BGP路由:
| 路由 | 本地偏好 | AS-PATH | 到NEXT-HOP的内部开销 | 路由器标识 |
|---|---|---|---|---|
| R1 | 100 | AS200 AS300 | 5 | 10.0.0.1 |
| R2 | 150 | AS400 AS500 AS300 | 9 | 10.0.0.4 |
| R3 | 150 | AS600 AS300 | 7 | 10.0.0.6 |
| R4 | 150 | AS700 AS300 | 4 | 10.0.0.7 |
(a)选中哪条路由?由哪条规则决定?(b)如果R1的本地偏好变为200呢?(c)如果R4的内部开销变为7呢?
用Python排序键实现BGP选路
把下面四条路由表示成字典,只用一次min(..., key=...)编写best(candidates),按顺序应用规则:本地偏好最高、AS-PATH最短、到NEXT-HOP的内部开销最小、路由器标识最小。打印原始情形、R1本地偏好改为200、R4内部开销改为7三种情况下的胜者。
| 路由 | 本地偏好 | AS-PATH | 内部开销 | 路由器标识 |
|---|---|---|---|---|
| R1 | 100 | AS200 AS300 | 5 | 10.0.0.1 |
| R2 | 150 | AS400 AS500 AS300 | 9 | 10.0.0.4 |
| R3 | 150 | AS600 AS300 | 7 | 10.0.0.6 |
| R4 | 150 | AS700 AS300 | 4 | 10.0.0.7 |