Skip to content

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 的路由器都不认得它;而转发表里能写的是下一跳。两者对不上,所以要翻译两次:

  1. 换起点:把"R1X"改写成"R2R1X"。R2 是本方与 R1 直连的边界路由器,它在本 AS 内,本 AS 的所有路由器都能把分组送到它。
  2. 查 IGP:由本 AS 的 IGP 算出"到 R2 的最佳路由中下一跳是谁",这个才是填进转发表的值。

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 = Ra
前缀 X,AS-PATH = AS4 AS7,NEXT-HOP = Rb
前缀 X,AS-PATH = AS2 AS5 AS6 AS7,NEXT-HOP = Rc

(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 为 Rb

⚠️ 这一问的限定在"只按 AS-PATH 长度"。真实选路第一优先级是 LOCAL_PREF:管理员若把 ① 的 LOCAL_PREF 设得更高(比如 AS3 是自家花钱买了带宽的合作方),BGP 会选 ①,尽管它更长。这正是"策略优先于长度"的具体样子。

(二)从一条 BGP 路由到一行转发表。 AS2 内的路由器 Rx 收到 BGP 路由「前缀 X,AS-PATH = AS1,NEXT-HOP = R1」,其中 R1AS1 内的边界路由器;AS2 内与 R1 直连的本方边界路由器是 R2;AS2 内部跑 OSPF,RxR2 的最短路第一跳是 R3

第一次递归:原路由是「R1X」,而起点 R1 并不在 AS2 中,AS2 的路由器都不能识别它。把起点改为 R1 的对等端 R2

R1XR2R1X

第二次递归Rx 查本 AS 的 OSPF 最短路,得知到 R2 的下一跳是 R3。于是转发表增加一行「前缀 X → 下一跳 R3」。

AS2 内每一台路由器都做同样两步,R3 也会算出它到 R2 的下一跳。于是目的为 X 的分组沿

RxR3R2R1X

一路走下去。

四、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:它不转发过路流量,甚至不会把经由一家的路由通告给另一家。这句话点出了一个关键:策略是在"路由通告"这一层执行的,不在转发层面。不通告,别人就不会把流量往这边送,根本不需要在转发时逐包过滤。

七、三大路由协议总对照

对比项RIPOSPFBGP
类别IGPIGPEGP
算法距离向量链路状态路径向量
交换什么整张路由表(距离)本机链路状态前缀 + AS-PATH + NEXT-HOP
封装UDP 520IP 协议号 89TCP 179
作用范围小型 AS 内中大型 AS 内AS 之间
规模上限15靠区域划分扩展整个互联网
选路依据跳数最少代价最小策略最优
防环上限 16 截断 + 水平分割LSDB 一致性AS-PATH 结构性防环
收敛慢,但对稳定性的要求高于速度

本节小结

  1. 域间不能沿用 IGP 的三条理由——规模、度量不可比、策略——共同给出 BGP 的口径:力求找到能到达目的前缀且不兜圈子的比较好的路由,而非最佳路由
  2. BGP 路由 = 前缀 + AS-PATH + NEXT-HOP,只记 AS 不记路由器,所以填转发表要两次递归查找(换起点 → 查 IGP 要下一跳);防环靠"AS-PATH 里出现自己就丢",挡得住任意长度的环。
  3. 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/25194.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——"这需要经过两次递归查找。首先,Rx 要把这条 BGP 路由的起点进行转换……路由的起点 R1 并不在 AS2 中。AS2 中的路由器都不能识别 R1……其次,Rx 要利用内部网关协议,找到从 RxR2 的最佳路由中的下一跳";同页说明转发表中"前缀匹配"用 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 路由协议网络层功能:路由、转发与异构网络互联

真题练习