
你在浏览器里输入一个网址,数据包可能经过本地运营商、骨干网络、跨境线路和云服务商,最终到达目标服务器。
问题是:全球没有一台保存完整互联网地图的“总路由器”,这些彼此独立的网络,怎么知道目标 IP 应该往哪里送?
答案就是 BGP,Border Gateway Protocol,边界网关协议。
BGP 不负责为全球计算一条统一的最短路线。它做的事情更像一场持续进行的邻里信息交换:每个网络告诉邻居“哪些 IP 前缀可以通过我到达”,再根据自己的商业关系、网络策略和路由属性,决定接受哪条路线、使用哪个出口,以及还要把哪些路线告诉下一位邻居。
互联网并不是一张由同一个组织管理的大网,而是大量独立网络互相连接形成的“网络之网”。
运营商、云平台、大型内容网络、大学或企业,都可以管理自己的路由策略。为了把这些管理边界表达出来,互联网引入了自治系统,也就是 AS,Autonomous System。
一个 AS 不是一台路由器,而是一组由同一组织管理、执行相对一致路由策略的网络和设备。每个 AS 使用一个 ASN,也就是自治系统编号来标识自己。

在一个 AS 内部,通常由 OSPF、IS-IS 等 IGP 协议维护内部可达性;不同 AS 之间,则使用 BGP 交换路由。
可以把两者的分工理解为:
BGP 属于路径向量协议。它不要求每台路由器掌握全球完整拓扑,而是传播 IP 前缀、AS_PATH 和其他属性,让每个网络独立做出本地决策。
❝欢迎大家支持我的付费文章:
❞
14.9 元,【3万字长文 70图】一文详解《数据结构(严蔚敏)》 11.9 元,【3万字长文 90+图】一文详解《操作系统教程(骆斌)》 11.9 元,【万字长文】一文详解《计算机组成原理(唐朔飞)》 9.9元,【万字长文58张图】一文详解《计算机网络(谢希仁)》
假设 AS64496 拥有前缀203.0.113.0/24。它会向 BGP 邻居发送 UPDATE,表达这样的信息:这个前缀可以通过我到达。
当 AS64497 把这条路由继续通告给 AS64498 时,会在AS_PATH左侧加上自己的 ASN:
64497 64496
AS64498 再向外通告时,又会把自己放在最前面:
64498 64497 64496

AS_PATH有两个重要作用。
第一,它记录这条通告经过了哪些自治系统。这里记录的是控制面的传播路径,不保证和每个数据包实际经过的设备序列完全一致。
第二,它帮助阻止路由环路。如果 AS64497 收到一条路由,发现AS_PATH中已经包含 64497,就知道这条路线曾经经过自己,应当拒绝它。
但AS_PATH不是安全证明。BGP 邻居可以错误配置甚至伪造路径属性,单凭它无法证明整条路线真实可信。
如果 AS64496 不再能够提供这个前缀,它会发送 Withdraw 撤销通告。邻居删除失效路线,重新检查是否还有其他候选路径,再把变化继续传播出去。
BGP 会话运行在 TCP 之上,通常使用 TCP 179 端口。
按照邻居所在位置,可以分成两类:
边界路由器通过 eBGP 学到外部前缀后,不能只把信息留在自己身上。AS 内其他可能承载流量的路由器,也需要知道应该选择哪个出口。

小规模网络可以让 iBGP 路由器建立全互联会话。规模扩大以后,会话数量快速增长,运营商通常会使用 Route Reflector,也就是路由反射器,减少全互联带来的连接和配置压力。
路由反射器解决的是控制面传播规模问题,它不是全网中央控制器,也不负责替数据包完成转发。
iBGP 也不能取代 IGP。BGP 告诉路由器“最佳出口的 NEXT_HOP 是谁”,IGP 则负责让内部路由器真正能够到达这个 NEXT_HOP。两者配合后,选中的 BGP 路线才会被写入转发表,供数据包使用。
同一个前缀可能从多个邻居到达。
例如,某路由器同时收到两条去往203.0.113.0/24的路线:一条 AS_PATH 较短,另一条来自更重要的客户链路。BGP 不会简单地把“跳数少”当成唯一答案,而是按本地策略和属性逐层比较。

常见实现的判断逻辑大致包括:
LOCAL_PREF。AS_PATH长度、ORIGIN、MED、eBGP 或 iBGP 来源、到 NEXT_HOP 的 IGP 代价等。这里必须注意几个边界。
LOCAL_PREF是 AS 内部使用的偏好值,数值越高通常越优先。它不会作为普通 eBGP 路由属性传给外部 AS,通常由导入策略设置,再通过 iBGP 在本 AS 内传播。
MED用于表达“如果要进入我的 AS,希望你从哪个入口进来”,常见实现通常只在来自同一相邻 AS 的可比路径间比较,具体行为还会受配置影响。
不同厂商、软件版本和策略配置,可能改变详细顺序,因此不存在一份适用于所有网络的绝对统一清单。
还有一个经常混淆的地方:路由器转发数据包时,会先做最长前缀匹配。例如/25比/24更具体,会优先匹配/25。BGP 最佳路径比较,则是在同一个前缀的多条候选路线之间选出一条或多条可安装路径。这是两个不同层次的判断。
为什么一条 AS_PATH 较长的路线,反而可能被选中?
因为互联网互联不是单纯的技术连接,还带有商业关系。常见关系包括:
运营商常通过LOCAL_PREF把客户路线设置为更高优先级,其次是 Peer,最后才是需要付费的 Provider。这样既能控制成本,也能兑现双方的互联协议。

路由的导出范围也受到关系约束。典型的商业互联网中:
如果把从一家 Provider 学到的全网路由再免费转给另一家 Provider,本 AS 就可能意外变成两家网络之间的免费中转通道。
这种“网络山谷”策略是常见运营模型,不是 BGP 协议强制写死的规则。私有互联、内容分发、流量工程和合同约定,都可能形成不同策略。
这也解释了为什么去程和回程经常不对称:通信两端所在的 AS 分别做本地决策,它们看到的候选路线、成本和政策并不相同。
当链路故障、邻居会话断开或前缀被撤销时,相关路线会失效。
路由器需要删除失效候选,重新比较剩余路线,更新 Loc-RIB 和 FIB,再把新的可达性结果告诉邻居。邻居收到变化后,又会执行自己的策略和选路。

这是一个分布式传播过程,不会让全球路由器在同一时刻完成切换。
在收敛期间,不同 AS 可能暂时看到不同结果。有些路由器会先尝试一条替代路径,随后又收到新的撤销或更优通告,这种现象叫路径探索。对应的数据包可能暂时丢失、绕行,甚至经历短时环路或黑洞。
因此,BGP 收敛没有一个适用于所有故障的固定时长。拓扑规模、路由策略、会话检测、定时器、候选路径数量和设备实现都会影响结果。
运营商通常会通过冗余链路、合理的故障检测、聚合路由、策略约束和稳定的变更流程,缩小故障影响,而不是期待所有变化瞬间同步。
BGP 最初建立在网络之间相互信任的环境里,协议本身不会自动证明每条通告都经过授权。配置错误或恶意通告,可能把流量带到错误网络。
路由劫持通常指未获授权的 AS 起源了别人的前缀。攻击者还可能通告一个更具体的前缀,利用最长前缀匹配,让更多流量优先进入错误路径。
路由泄漏则不同:前缀的起源 AS 可能完全合法,但中间网络把本来只该通告给客户的路线,错误地发给 Peer 或 Provider,破坏了预期的导出范围。

RPKI 为起源验证提供了一道重要防线。前缀持有者可以创建 ROA,声明哪些 ASN 有权起源该前缀,以及允许通告到多具体的前缀长度。启用 ROV 的网络会把收到的路由判断为 Valid、Invalid 或 NotFound,并可拒绝 Invalid 路由。
但 RPKI 起源验证只回答一个问题:前缀与起源 AS 的组合是否被授权。
它不验证完整AS_PATH,也不能发现所有路由泄漏。一次泄漏可能保留合法起源,因此仍然是 RPKI Valid。
实际防护还需要组合使用前缀过滤、客户路由清单、IRR 数据、max-prefix 限制、严格的导入与导出策略,以及持续监控异常通告。

BGP 的工作过程可以归纳成一条控制链:
LOCAL_PREF等本地属性。BGP 交换的是前缀可达性和策略信号。它没有全球统一总地图,也不保证选出地理距离最短的路线。每个 AS 在自己的管理边界内独立决策,商业关系、流量工程、安全策略和路由属性共同塑造了今天的互联网路径。
❝觉得这篇文章对你有帮助吗?
点个 「在看」,「关注」 我们,加个 「星标」,我们一起用最有趣的方式,读懂最硬核的技术!
你的 「支持」 对我非常重要,是我坚持更新的 「唯一动力」。
关注我们,回复 C++ 免费获取 243 节高质量C++课程。
❞