Appearance
BGP 路由协议
2026 大纲 四(五)5 BGP,同时承载 四(五)1 自治系统在域间这一侧。AS 的定义、IGP/EGP 的划分、路径向量作为一类算法的定位在《路由算法》。
一、为什么 OSPF 拉大了用不行
RIP 和 OSPF 都只能在一个 AS 内部工作。没有 BGP,全世界数以万计的 AS 就是一个个没有联系的孤岛——正是有了 BGP 这种黏合剂,这么多孤岛才连成一个完整的互联网。
问题是:既然 OSPF 已经能算最短路,把它的区域再往上套一层不就行了吗?不行,有三条理由,而且每一条都指向同一个结论。
第一条是规模。 目前互联网主干网路由器的转发表项目数可达 50 万个网络前缀。用链路状态协议的话,每台路由器都得维持一个巨大的链路状态数据库,对这么大的图跑 Dijkstra,花的时间也太长。
第二条是度量不可比。 对某个 AS 来说,代价 1000 可能表示一条比较长但可用的路由;对另一个 AS,代价 1000 却可能表示不可接受的坏路由。度量口径根本不通约,比较合理的做法只能是在 AS 之间交换"可达性"信息。
第三条是策略。 AS 之间的路由选择必须考虑政治、安全或经济方面的因素——AS3 可能就是不愿意让 AS1 的数据报穿过自己。最短的路不一定是允许走的路。
三条合起来,直接定死了 BGP 的口径:它力求选出一条能够到达目的网络前缀且比较好(不兜圈子)的路由,而并非要计算出一条最佳路由。"BGP 找最短路"是个错误说法。
顺带说明一处边界:策略由网络管理人员在各路由器上配置,这些策略本身并不是自治系统之间的路由选择协议——协议只提供"能表达策略"的能力,具体表达什么由管理员决定。
二、BGP 路由长什么样,防环为什么是结构性的
一条 BGP 路由由三部分组成:前缀 + AS-PATH(所经过的 AS 序列)+ NEXT-HOP(这条路由的起点)。
AS-PATH 里装的是 AS 号,不是路由器。 BGP 路由只指出要通过哪些自治系统,不指出中途要经过哪些路由器——这个设计后面会带来一个必须处理的后果(第三节的两次递归查找)。
有了完整的 AS 序列,防环就变得非常简单:AS-PATH 里出现自己的 AS 号,就直接丢弃。
把它和 RIP 的水平分割放在一起,差别一目了然:
| 距离向量的水平分割 | 路径向量 | |
|---|---|---|
| 携带的信息 | 只有一个距离数值 | 完整的 AS 序列 |
| 能挡住 | 只有两点环 | 任意长度的环 |
| 为什么 | 只知道"从谁学来的",不知道更远处的来路 | 环必然使本 AS 号出现在路径里,一看便知 |
| 有没有上限 | 必须靠 16 这类约定截断 | 不需要上限 |
RIP 之所以要设 16 这个上限,本质上是因为它没有办法识别环,只能靠一个截断值让错误的循环停下来。路径向量把"怎么走的"也带上了,环路当场可判,上限就不需要了。
但 AS-PATH 长度不是第一优先级。 真实选路里 LOCAL_PREF(值越大越优先,是管理员表达商业策略的主要手柄)排在 AS_PATH 之前,再往后才是 NEXT_HOP 的 IGP 代价;MED 则用于影响外部 AS 选择进入本 AS 的入口。408 的要求止于"AS-PATH 最短优先",但要知道它上面还压着策略。
三、两次递归查找
BGP 给的 NEXT-HOP 是对方 AS 里的路由器,本 AS 的路由器都不认得它;而转发表里能写的是下一跳。两者对不上,所以要翻译两次:
- 换起点:把"
"改写成" "。 是本方与 直连的边界路由器,它在本 AS 内,本 AS 的所有路由器都能把分组送到它。 - 查 IGP:由本 AS 的 IGP 算出"到
的最佳路由中下一跳是谁",这个才是填进转发表的值。
BGP 管跨 AS 的方向,IGP 管本 AS 内的路,两者必须接力。 转发表中"前缀匹配"用 CIDR 记法;由于路由器有两个以上接口,"下一跳"用进入该路由器的接口的 IP 地址表示。
一个 AS 至少要有一个边界路由器与相邻 AS 的边界路由器直接相连,AS 之间才谈得上用 BGP 交换可达性信息。
两个 BGP 路由算例:环路检测选路、从一条路由填出转发表(想把 AS-PATH 与两次递归查找亲手走一遍时展开)
(一)环路检测与 AS-PATH 选路。 某边界路由器位于 AS5,就同一个目的前缀 X 收到三条 BGP 路由:
| 编号 | BGP 路由 |
|---|---|
| ① | 前缀 X,AS-PATH = AS2 AS3 AS7,NEXT-HOP = |
| ② | 前缀 X,AS-PATH = AS4 AS7,NEXT-HOP = |
| ③ | 前缀 X,AS-PATH = AS2 AS5 AS6 AS7,NEXT-HOP = |
(a)环路检测——逐条查 AS-PATH 里有没有本 AS 号 AS5:
| 编号 | AS-PATH | 含 AS5? | 处理 |
|---|---|---|---|
| ① | AS2 AS3 AS7 | 否 | 保留 |
| ② | AS4 AS7 | 否 | 保留 |
| ③ | AS2 AS5 AS6 AS7 ← 第二个就是 AS5 | 是 | 直接丢弃 |
环路路由是无效路由,留着参与选路只会污染结果,所以先滤环、再选优;顺序反过来可能选中一条根本走不通的路。③ 声称"经过 AS2 → AS5 → AS6 → AS7 可以到 X",而 AS5 就是我自己——采纳它,分组会在 AS5 和外面之间来回打转。
(b)若只按 AS-PATH 长度选:① 长度 3,② 长度 2 → 选 ②,NEXT-HOP 为
⚠️ 这一问的限定在"只按 AS-PATH 长度"。真实选路第一优先级是 LOCAL_PREF:管理员若把 ① 的 LOCAL_PREF 设得更高(比如 AS3 是自家花钱买了带宽的合作方),BGP 会选 ①,尽管它更长。这正是"策略优先于长度"的具体样子。
(二)从一条 BGP 路由到一行转发表。 AS2 内的路由器 AS1,NEXT-HOP =
第一次递归:原路由是「
第二次递归:
AS2 内每一台路由器都做同样两步,
一路走下去。
四、eBGP 与 iBGP
这两个不是两种协议。 它们使用同样的报文格式、同样的属性类型,遵循同一个 BGP;唯一的区别是发送路由通告时的规则不同。
| eBGP(外部 BGP) | iBGP(内部 BGP) | |
|---|---|---|
| 连接谁 | 不同 AS 的两个对等端 | 同一 AS 的两个对等端 |
| 是否要直连 | 通常直连 | 可以不直连(IGP 路由可达即可) |
| 从它学来的路由能转告给 iBGP 对等端吗 | ✅ 可以 | ❌ 不能转告给同 AS 内其他 iBGP 对等端 |
| 能转告给 eBGP 对等端吗 | ✅ 可以 | ✅ 可以 |
那条唯一的"不能"为什么必须存在:iBGP 对等端之间用不上 AS-PATH 防环——在同一个 AS 内部传递,AS 号根本不变化,环路检测失效。只能靠"只转一跳"这条规则挡住路由在 AS 内部循环通告。代价是AS 内所有跑 BGP 的路由器必须两两建立 iBGP 会话。
边界路由器还可以按本 AS 管理员规定的策略拒绝某些路由(收到后即删除),只在 iBGP 连接上转发符合策略的路由——策略生效的位置就在这里。
五、四种报文与封装
BGP 有四种报文:OPEN 建立连接并协商 AS 号与保持时间;UPDATE 通告或撤销路由,路由信息全靠它承载;KEEPALIVE 保活,兼作对 OPEN 的确认;NOTIFICATION 报错,并随后关闭连接。
BGP 报文作为 TCP 报文的数据部分传送(端口 179),四种类型具有同样的首部。
三个协议的封装要一起记,而且它们各有各的道理——本质上是"可靠性从哪来"的三个不同答案。RIP 封装在 UDP 520:它周期性重发完整路由表,丢了下一轮自然补上,不需要可靠。OSPF 直接封装在 IP 中(协议号 89):它自己用 LSAck 与序号实现了可靠,而且洪泛要跨多跳、发给"所有路由器"而非某个端口,用 TCP 反而不合适。BGP 封装在 TCP 179:它只在变化时增量通告且数据量大,一条 UPDATE 丢了不会自动重来,交给 TCP 就不必自己实现确认与重传。
六、三类 AS 讲的是钱
最后一节的内容表面看像术语表,实际讲的是互联网的商业结构。
末梢 AS(stub AS)只收发自己的分组、不转发过路流量,它必须向所连接的 AS 付费才能发送或接收分组。穿越 AS(transit AS)有高速干线、替别人转发流量,靠这个收费。对等 AS(peering AS)直接互连互换流量,彼此免费。
多归属 AS 仍然是末梢 AS。 同时连两家运营商只是增加连接的可靠性——一条断了还有另一条。它并不因此变成穿越 AS:它不转发过路流量,甚至不会把经由一家的路由通告给另一家。这句话点出了一个关键:策略是在"路由通告"这一层执行的,不在转发层面。不通告,别人就不会把流量往这边送,根本不需要在转发时逐包过滤。
七、三大路由协议总对照
| 对比项 | RIP | OSPF | BGP |
|---|---|---|---|
| 类别 | IGP | IGP | EGP |
| 算法 | 距离向量 | 链路状态 | 路径向量 |
| 交换什么 | 整张路由表(距离) | 本机链路状态 | 前缀 + AS-PATH + NEXT-HOP |
| 封装 | UDP 520 | IP 协议号 89 | TCP 179 |
| 作用范围 | 小型 AS 内 | 中大型 AS 内 | AS 之间 |
| 规模上限 | 15 | 靠区域划分扩展 | 整个互联网 |
| 选路依据 | 跳数最少 | 代价最小 | 策略最优 |
| 防环 | 上限 16 截断 + 水平分割 | LSDB 一致性 | AS-PATH 结构性防环 |
| 收敛 | 慢 | 快 | 慢,但对稳定性的要求高于速度 |
本节小结
- 域间不能沿用 IGP 的三条理由——规模、度量不可比、策略——共同给出 BGP 的口径:力求找到能到达目的前缀且不兜圈子的比较好的路由,而非最佳路由。
- BGP 路由 = 前缀 + AS-PATH + NEXT-HOP,只记 AS 不记路由器,所以填转发表要两次递归查找(换起点 → 查 IGP 要下一跳);防环靠"AS-PATH 里出现自己就丢",挡得住任意长度的环。
- eBGP 与 iBGP 是同一个协议,只有通告规则不同:从 iBGP 学来的不能再转告给同 AS 内其他 iBGP 对等端。报文四种、TCP 179。三类 AS 里,多归属末梢 AS 仍是末梢——策略在路由通告层面执行。
考点速记
BGP 在真题里被考过的形式有两种,都不考选路算法,只考"它是什么类别、跑在什么之上"。
① 三个路由协议分别封装在什么之上(cn-2017-37)。问"直接封装 RIP、OSPF、BGP 报文的协议分别是",答 D:UDP、IP、TCP。这道题只有一个考点,就是第五节那三行。别只背结论——记住那三个理由(RIP 周期性重发所以不需要可靠、OSPF 自己实现了可靠且要跨多跳洪泛、BGP 增量通告丢了不会自动重来),选项换个顺序也不会晃。
② 跨自治系统用什么协议交换路由、它封装在哪(cn-2013-47 的第 (3) 问,整题 9 分)。题面里 R1 属于 AS1、R2 属于 AS2,问它们之间用哪个路由协议、该协议报文封装到哪个协议的分组中。判据只有一句:跨 AS 就是外部网关协议,当前实际部署的是 BGP(BGP-4),封装在 TCP 里(端口 179)。
这道题前两问其实不在 BGP 上:第 (1) 问要写 R2 的路由表并做聚合,第 (2) 问考最长前缀匹配——而且埋了一个很值得看的坑。R2 为了让路由项最少,把 194.17.20.0/25 和 194.17.21.0/24 合成了一条 194.17.20.0/23 走 S1,可这条 /23 顺带覆盖了 E0 直连的 194.17.20.128/25。于是收到目的 194.17.20.200 时两条路由同时命中,靠最长前缀匹配取 /25 走 E0。"聚合出的粗路由盖住了自己的细路由,靠最长前缀匹配化解"是出题人故意埋的,这两个知识点讲在网络层功能。
本篇练习区里还会出现四道题,机制讲在别处:cn-2010-35 与 cn-2016-37 考 RIP 的距离更新,在 RIP;cn-2014-43 与 cn-2026-38 考 OSPF,在 OSPF;cn-2021-37 考距离向量的一轮计算,在路由算法。
其中 cn-2024-47 的后两问正好落在本篇,整题在 RIP 组织:第 (4) 问,R44(AS4)向 R13(AS1)通告路由是跨 AS,走 eBGP 会话,用 UPDATE 报文;R13 再把这个信息告诉同在 AS1 的 R14、R15,是同 AS 内部,走 iBGP 会话。第 (5) 问在无策略约束下比 AS-PATH 长度,R11 那条(AS2 AS8 AS19)和 R13 那条(AS4 AS10 AS19)都是 3、并列,于是落到下一条准则比 AS1 内部到下一跳的 IGP 距离:R14 直连 R11 选 R11,R15 直连 R13 选 R13。
易错:封装三条一起记——RIP → UDP 520,OSPF → 直接在 IP 上(协议号 89),BGP → TCP 179。
易错:BGP 求的是"可达且比较好、不兜圈子",不是最佳路由。 跨 AS 的代价没有可比性。
易错:AS-PATH 长度不是第一优先级,LOCAL_PREF 排在它前面。题面说"无策略约束"才轮到比长度。
易错:AS-PATH 长度并列时,比的是本 AS 内部到下一跳的 IGP 距离,不是随便挑一个。
易错:eBGP 与 iBGP 是同一个协议,只是通告规则不同;跨 AS 用 eBGP,AS 内同步用 iBGP。
易错:从 iBGP 学来的路由不能再转告给同 AS 内其他 iBGP 对等端,所以 AS 内 BGP 路由器要两两建会话。
易错:AS-PATH 里是 AS 号不是路由器,所以填转发表要做两次递归查找。
易错:多归属 AS 仍是末梢 AS。 连两家只增加可靠性,它不转发过路流量,策略在路由通告层面执行。
教材出处
- 谢希仁《计算机网络》(第 8 版)4.6.4 外部网关协议 BGP,印刷版 p168–p172:
- BGP 的必要性见 p168——"若没有协议 BGP,那么分布在全世界数以万计的 AS 都将是一个个没有联系的孤岛。正是由于有了 BGP 这种黏合剂,才使得这么多的 AS 孤岛能够连接成一个完整的互联网"。
- 不能用 IGP 的第一个原因(规模)在 p168——"目前在互联网的主干网路由器中,一个转发表的项目数甚至可达到 50 万个网络前缀。如果使用链路状态协议,则每一个路由器必须维持一个很大的链路状态数据库。对于这样大的主干网用 Dijkstra 算法计算最短路径时花费的时间也太长";度量不可比同页——"对某 AS 来说,代价为 1000 可能表示一条比较长的路由。但对另一 AS,代价为 1000 却可能表示不可接受的坏路由",并给出"比较合理的做法是在自治系统之间交换'可达性'信息"。
- 第二个原因(策略)在 p168——"自治系统 AS 之间的路由选择必须考虑有关策略……这些策略包括政治、安全或经济方面的考虑";AS3 不愿让 AS1 的数据报通过、以及"这些策略并不是自治系统之间的路由选择协议本身"同在此页。
- BGP 的口径见 p169——"边界网关协议 BGP 只能是力求选择出一条能够到达目的网络前缀且比较好的路由(不能兜圈子),而并非要计算出一条最佳路由";"BGP 采用了路径向量(path vector)路由选择协议,它与距离向量协议(如 RIP)和链路状态协议(如 OSPF)都有很大的区别"。边界路由器与内部路由器的区分、"一个 AS 至少要有一个边界路由器"也在此页。
- eBGP / iBGP 的关系与转告规则见 p170——"eBGP 和 iBGP 并不是两个不同的协议……在这两种不同连接上传送的 BGP 报文,都遵循同样的协议 BGP,使用同样的报文格式和具有同样的属性类型。唯一的不同点就是在发送 BGP 路由通告时的规则有所不同";"从 eBGP 对等端收到的 BGP 路由,可通过 iBGP 告诉同 AS 内的对等端。反过来也是可以的……但是,从 iBGP 对等端收到 BGP 路由,不能转告给同一个 AS 内不同 iBGP 的对等端"。同页给出边界路由器"可以拒绝某些路由(收到这种路由后即删除掉)"。
- BGP 路由格式见 p170——"BGP 路由 = '前缀,BGP 属性' = '前缀, AS-PATH, NEXT-HOP'";"'BGP 路由'必须指出通过哪些自治系统 AS,但不指出路由中途要通过哪些路由器"。
- 两次递归查找见 p171——"这需要经过两次递归查找。首先,
要把这条 BGP 路由的起点进行转换……路由的起点 并不在 AS2 中。AS2 中的路由器都不能识别 ……其次, 要利用内部网关协议,找到从 到 的最佳路由中的下一跳";同页说明转发表中"前缀匹配"用 CIDR 记法、"下一跳"用进入该路由器的接口的 IP 地址表示。 - 三类 AS 与多归属 AS 见 p171–p172——"可以把 AS 划分为……末梢 AS(stub AS)、穿越 AS(transit AS)和对等 AS(peering AS)";"末梢 AS 必须向所连接的 AS 付费才能发送或接收分组";"多归属 AS 可以增加连接的可靠性,因为若有一条连接出现故障,那么还有另一条连接可用";关键的一句——"末梢 AS 不是穿越 AS,它不允许分组穿越自己的自治系统。末梢 AS5 也不能把(AS5-AS2-AS4)这样的 BGP 路由信息通告给 AS3"。
- BGP 报文的封装见 p175——"BGP 报文是作为 TCP 报文的数据部分来传送的……四种类型的 BGP 报文具有同样的首部"。
- ⚠️ 本篇未引教材的部分:BGP 选路属性的优先级顺序(LOCAL_PREF > AS_PATH > NEXT_HOP,以及 MED 的作用)、KEEPALIVE 的默认周期,谢希仁书中没有给出完整表述,出自 BGP-4 的协议规范,属于了解性内容。408 的要求止于"AS-PATH 最短优先"这一条。
相关知识
路由算法:距离向量 vs 链路状态|RIP 路由协议|OSPF 路由协议|网络层功能:路由、转发与异构网络互联