计算机网络 12:跨自治系统为什么不只选最短路,BGP、策略、通告与撤回
同一个目的前缀,一条候选路径只经过一个自治系统,另一条经过两个,为什么仍可能选择后者?若物理连接一直存在,删除一条导出策略为什么又可能让某个邻居失去路由?这两个问题都不能只用链路成本解释。
第 11 篇在统一成本的小图上讨论内部选路。本篇引入独立管理的自治系统,以及各自决定接收、选择和通告哪些路径的策略。实验完全离线,不建立 BGP 会话,也不连接公网邻居。
先区分地址前缀与自治系统路径
IP 转发面对的是目的地址和前缀。BGP 通告在网络可达信息之外携带路径属性,AS_PATH 是其中之一。目的前缀回答哪些地址属于这条路由,AS_PATH 描述路径涉及的自治系统信息,二者不能互换。
RFC 4271 §5.1.2规定 AS_PATH 的形式与修改规则。本篇只使用有顺序的 AS_SEQUENCE,不处理聚合产生的其他形态。简化例子中,C 起源前缀并向外通告,邻居看到路径 [C];B 将从 C 学到的路径通告给 A 时,添加自己的 AS,A 看到 [B,C]。
这个列表不是 IP 报文逐跳携带的完整源路由,也不能直接换算成路由器跳数或物理距离。一个自治系统内部可能有多个转发节点。即使两个候选的 AS_PATH 长度不同,也不能由长度直接推算吞吐、时延或业务成功率。
模型使用 A=64512、B=64513、C=64514,目的前缀为 RFC 5737 §3 的文档示例地址 203.0.113.0/24。这些 ASN 位于 RFC 6996给出的私有用途范围内。私有 ASN 不是全球唯一身份,使用它们也不自动形成网络隔离;本实验的隔离来自程序根本不创建网络连接。
策略决定哪些候选有资格比较
导入策略作用于接收方向,导出策略作用于发送方向。B 允许从 C 接收某个前缀,不等于 B 也允许把它继续通告给 A。A 与 B 有连接,也不等于 A 必须接受 B 提供的所有前缀。
RFC 8212 §3给出 eBGP 缺少明确策略时的默认拒绝行为:没有相应导入策略,收到的路由不参与决策;没有相应导出策略,路由不进入对应的对外通告集合。规范允许提供改变默认行为的配置,因此不能把规范要求直接当成所有已部署版本的实际默认配置。
本篇模型只处理一个固定前缀,把允许该前缀通过的方向写成白名单,未配置就拒绝。这里仅表达明确许可这一机制,没有模拟设备配置语言。排查无路由时,必须区分根本没收到、收到后被过滤、进入候选后落选,以及选中后没有向某个邻居导出。
这种区别也说明为什么物理可达不足以证明控制面可达。线缆、邻居会话、前缀通告和本地选择分别是不同的条件。实验只处理后两者的离线状态,没有证明真实邻居会话已经建立。
较长路径怎样胜出
设 C 向 A 和 B 通告自己的前缀,B 也获准向 A 通告这条已学到的路径。A 因而有两个候选:直接从 C 学到 [C],以及从 B 学到 [B,C]。
A 的本地导入政策为直接候选赋优先值 100,为经 B 的候选赋 200。这里的数值是显式实验输入,可能对应管理者对出口的偏好,不是测得的链路质量,更不是由路径长度自动计算出来。
RFC 4271 §5.1.5说明 LOCAL_PREF 较高者优先;§9.1.1–9.1.2将本地优先程度与后续选择分开。因此在这些条件下,A 可以先因 200 大于 100 而选择 [B,C],不必让较短的 [C] 胜出。
LOCAL_PREF 通常在自治系统内部传播,不应当作普通 eBGP 对外传送的属性。本模型由接收方自己的导入政策赋值,通告内容只保留前缀和顺序 AS 路径,避免把 A 的偏好误写成 B 向 A 强制指定的偏好。
实际决策还涉及可用性和更多属性。RFC 4271 §9.1.2.1要求处理下一跳可解析性。一个优先值高但下一跳不可用的记录不能直接成为可用转发路径。本篇把候选下一跳可达作为输入前提,未实现下一跳递归解析,也没有复刻完整的 BGP 决策顺序。
撤回删除的是哪份信息
每个邻居对一个前缀提供的路径应分别保存。B 向 A 撤回该前缀时,应删除来自 B 的那份候选;来自 C 的候选仍可能有效。若实现把整个前缀从所有邻居的记录中删除,就会错误地丢掉可用的备用路径。
RFC 4271 §4.3说明 UPDATE 中的撤回信息。本例离线执行这段状态变化。先撤回来自 B 的候选,A 重新选择直接从 C 学到的 [C];再撤回来自 C 的候选,A 才没有可选路径。
“没有候选”描述本模型对这个前缀的结果。真实转发还可能命中覆盖它的更短前缀、默认路由或其他来源的路由,必须结合第 07 篇的最长前缀匹配继续检查,不能仅因一条 BGP 前缀撤回就断言任意报文一定被丢弃。
路径信息能排除什么环路
收到的 AS_PATH 中已经包含本 AS,说明该路径存在返回本 AS 的依赖,通常应将它排除出可用候选。本例另构造一条包含 A 的输入,检查 A 拒绝它,而不是因较高优先值继续选择。
这个检查依赖收到的属性,不能证明通告者有权起源该前缀,也不能验证路径上的每一个管理关系。来源验证、路由泄漏与完整路径安全属于后续 E02 的范围。单次拒绝构造路径的测试,不是互联网路由安全性验证。
复现三 AS 的策略变化
下载 离线程序、本次结果和 实验记录。程序需要 Python 3.11 或更新版本,只使用标准库,不读写设备配置:
1 | |
前两条用于查看参数和复现默认结果;第三条保持经 B 的优先值高于 100,应仍选择经 B。第四条应以状态码 2 拒绝,因为这个演示入口限定为“经 B 优先值更高”的场景。它不是说 BGP 禁止相等的 LOCAL_PREF。运行时不要加 -O,以保留内置验收断言。
允许导出的方向为 C→A、C→B、B→A;相应导入方向都明确允许。C→A 和 C→B 的接收方赋优先值 100,B→A 的接收方赋 200。所有方向都只涉及上述固定前缀,没有隐含的任意前缀许可。
2026 年 9 月 20 日实际运行得到以下状态。表中的列表是通告属性和候选选择,未发送业务报文。
| 事件 | A 保留的候选 | A 选中的路径 | 原因 |
|---|---|---|---|
| 两个邻居通告 | C 与 B 各一条 | [64513,64514] |
经 B 的本地优先值 200 更高 |
| 撤回 B→A | 仅 C | [64514] |
C 的候选未被误删 |
| 再撤回 C→A | 空 | 无 | 本模型没有其他路由来源 |
程序还分别检查缺少 B→A 导出政策、缺少 A 对 B 的导入政策,以及 A 收到 [64513,64512,64514] 的情况。前两种分别阻止发送和接收候选,第三种因包含本 AS 而拒绝。缺少 B 的导出政策时,A 仍选择直接 C,复现了“一个方向没有通告,不等于所有路径消失”的反例。
选择函数先比较接收方本地优先值,再比较顺序路径长度,最后用邻居 ASN 大小确定性打破平局。最后一项是教学约定,不能复制成真实设备的完整最佳路径规则。验收还核对重复运行的 JSON 内容、帮助入口和非法参数退出状态。
验证边界
已验证的是单前缀、三 AS、明确方向策略下的候选产生、过滤、选择与逐邻居撤回。没有实现 BGP 报文编码、TCP 会话、保持计时器、路由反射、联盟、下一跳递归解析、多前缀覆盖或真实数据转发。ASN 和前缀只是内存中的字段,没有配置到任何接口。
该实验不能给出真实设备收敛时间,也不能证明某段公网路径可用。尤其不能把程序中 selected 非空写成业务端到端成功:还需要内核或硬件安装、邻接解析和实际报文证据。本篇的“不可达”严格限于模型没有该前缀候选,不包含真实主机是否还有默认路由的判断。
练习
第一题:A 的两条路径分别为 [C] 和 [B,C],优先值分别为 100 和 200。把两个优先值都改为 100 后,能否继续引用本篇的原运行结果?
校验:不能。比较的前提发生变化,需要执行模型约定的后续规则并重新运行。实际设备还须检查其完整决策条件;本篇原结果只证明优先值不同的那组输入。
第二题:B 允许从 C 导入,但没有向 A 导出的政策,A 是否一定无路由?
校验:不一定。经 B 的通告缺失,但 A 仍可能保留直接从 C 学到的路径。导出限制的影响必须按接收方的其他候选逐项推导,不能把一个方向的过滤扩大成全网不可达。
参考资料
- RFC 4271 §4.3、§5.1.2、§5.1.5、§9.1:UPDATE、AS_PATH、LOCAL_PREF 与决策。
- RFC 8212 §3:无明确策略时的 eBGP 默认拒绝。
- RFC 6996 §4–5:私有用途 ASN 的操作要求与范围。




