技术指南

互联网路由变更验收:分离 BGP 视图、路径与业务影响

把 BGP 可见性、实际路径与业务指标分开记录,用带方向、时间和回滚证据的矩阵验收路由变更。

路由变更是否成功,不能只看 BGP 宣告、路由追踪或一次延迟数字。先固定用户视角、时间、地址族、协议和业务请求,再把控制面、实际数据路径与应用结果放进同一证据矩阵;三个平面分别成立,才能判断变更是否真正改善交付。

来源解释路由概念,本文把它改写为验收契约

归档来源对 BGP 策略、Anycast、去程与回程不对称及分时段测量的解释可以保留。固定延迟、价格和丢包表,运营商绝对排名,对 CN2、CMIN2、AS9929 等产品标签的保证,以及用一个前缀或 ASN 代表整项服务质量的结论都不进入本文。验收只处理在指定观测点实际取得的证据。

先冻结一次可重放的观测坐标

字段必须记录避免的误判
时间UTC 起止、持续时间、变更窗口把不同拥塞时段直接比较
观测点网络/ASN、区域、主机或 RIPE Atlas probe把一个入口外推到所有用户
目标主机名、解析 IP、前缀、端口DNS 或 Anycast 节点变化未被发现
协议IPv4/IPv6、ICMP/UDP/TCP、应用协议把一种探测报文当成真实业务
业务版本发布 ID、配置摘要、请求 ID同时发布的应用变更被归因于路由

基线与候选必须使用相同矩阵、采样间隔和业务负载。若目标服务会暴露 colo、server 或 deployment 标识,一并保存;它只是服务端观察到的节点身份,不是地理或运营商质量保证。

把控制面、数据路径和服务结果分开

证据平面可回答不能单独回答
BGP 控制面某前缀在特定 collector/peer/time 的 origin、AS path 与可见性具体用户包走哪条路、延迟或可用性
数据路径某观测点、协议和时刻收到的一条 hop 序列所有 ECMP 分支、完整回程或每跳拥塞
本地转发该主机当前对目标选择的源地址、网关和接口互联网后续路径
应用结果DNS、连接、TLS、TTFB、总时长、状态与内容完整性变化一定由 BGP 或某个 hop 导致

RFC 4271 把 BGP 路由描述为前缀及路径属性,并允许本地策略参与选择。RIPE RIS 的 collector 只接收其 peers 提供的路由;RIPEstat Routing History 也基于这些 RIS 视角和请求时间窗。因此“控制面已变”应写成带 collector/peer 的事实,而不是全球收敛或用户路径声明。

控制面查询必须带前缀、视角和时间窗

使用实际获准前缀和受控输出目录;数据量可能很大,保存原始响应摘要与查询参数,不把 RIS 可见性当成全球真相
prefix=203.0.113.0/24
start=2026-08-18T00:00:00Z
end=2026-08-18T01:00:00Z

curl --fail --silent --show-error --get \
  --data-urlencode "resource=$prefix" \
  --data-urlencode "starttime=$start" \
  --data-urlencode "endtime=$end" \
  https://stat.ripe.net/data/routing-history/data.json \
  | jq '{status, query_id, data: {resource: .data.resource, by_origin: .data.by_origin}}'
  • 记录 exact prefix,不以域名或单个地址模糊替代。
  • 保存 collector/peer 或 API 数据源、查询时间和返回状态。
  • 分别核对 origin、AS path 与可见性;变化和撤回是不同事件。
  • 没有覆盖目标用户网络的视角时明确写 unknown。
  • 控制面结果只进入控制面列,不直接通过性能门禁。

Anycast 节点由路由选择,节点身份可能漂移

RFC 4786 说明 Anycast 使用相同服务地址从多个节点宣告,路由系统选择一个节点;路由变化可能使客户端转到另一节点,稳定性与监控因此是设计要求。客户端地理距离不能保证节点选择,DNS 结果不变也不能证明服务节点未变。验收时记录服务返回的节点标识、证书、响应摘要和时间。

去程与回程分别取证,不补写看不到的半程

客户端 traceroute 通常只观察探测报文的去程及各跳返回的控制报文,不能还原服务响应的完整回程。能控制两端时,从客户端到服务端、服务端到客户端分别测;不能控制远端时,把回程写成 unknown,并使用目标侧请求日志、入口区域或供应商遥测补充,而不是镜像去程。

示例地址不可直接用于生产;在真实发起业务请求的主机执行,分别保存 IPv4 与 IPv6,命令失败也保留退出码
date --utc --iso-8601=seconds
getent ahosts service.example
ip -4 route get 203.0.113.10
ip -6 route get 2001:db8::10
tracepath -4 -n service.example
tracepath -6 -n service.example

Linux `ip route get` 返回内核按当前转发表解析出的实际本地路由结果,不会发送数据包。它适合证明源地址、接口、下一跳和策略路由选择,但不能证明网关之后的路径。把原始输出保留给精确回滚,不要只截取一行标签。

路由追踪是一条采样路径,不是拓扑数据库

RFC 7276 指出 traceroute 通过递增 TTL/Hop Limit 发现路径,但负载均衡可能让不同探针经过不同下一跳。静默 hop、地址不回复或中间设备限制 ICMP 也不等于转发失败。对真实业务端口可补充 TCP 模式 MTR,但中间 hop 的响应优先级和限速仍会污染结果,终点业务指标必须独立测量。

不要把某个中间 hop 的 loss% 自动解释为转发丢包;实现或权限异常时保留错误并退出该观察器,不得阻塞核心验收
# 可选观察器;先确认本机 mtr 版本和权限行为。
mtr -4 -T -P 443 -n -r -c 20 service.example
mtr -6 -T -P 443 -n -r -c 20 service.example

用业务探针决定用户影响

只使用获准的无副作用端点;固定 IP 的探针绕过 DNS 负载选择,必须与正常解析路径分别记录,响应中不得包含个人数据或秘密
target_ip=203.0.113.10
curl --silent --show-error --output response.body \
  --dump-header response.headers \
  --resolve service.example:443:$target_ip \
  --connect-timeout 5 --max-time 20 \
  --write-out 'remote=%{remote_ip} dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total} status=%{response_code}\n' \
  https://service.example/health
sha256sum response.body
指标判定方式边界
可用性退出码、可信 HTTP 状态、请求 ID单次 2xx 不是持续可用
阶段耗时DNS/connect/TLS/TTFB/total 分开客户端时钟和负载需稳定
内容允许字段或合成响应的摘要动态内容不能直接比较整包
错误超时、重置、TLS、5xx 分开计数不把所有失败合并为丢包
服务目标窗口内分位数、错误率与 SLO阈值来自本服务基线,不来自通用表

变更前后使用同一矩阵多次采样

  1. 至少覆盖业务高峰与非高峰,保存每次样本而不只保留均值。
  2. 相同观测点分别测 IPv4、IPv6 和真实应用端口。
  3. 变更前、候选生效、稳定观察和回滚后使用相同命令与请求。
  4. 并行记录发布、DNS、证书、缓存和容量事件,防止混杂。
  5. 将未覆盖区域、运营商、协议、回程和时间窗写入 unknown 列。

先分类观测,再判断是否接受

组合当前结论下一步
控制面变、路径未变目标观测点尚无数据路径证据等待或检查视角、策略与缓存
路径变、业务不变该样本未见用户影响保持观察,不宣称性能改善
业务变、路径未变存在其他变量或未观测分支查 DNS、发布、容量、TLS 与回程
路径与业务同时改善相关性成立,因果仍需对照扩大同矩阵观测并检查回归
不同观测点相反效果具有视角依赖按用户权重决策,不求单一全球结论

把接受、停止与回滚条件写在变更前

  • 目标前缀在指定控制面视角出现预期变化,未知视角已列明。
  • 目标用户观测点的数据路径发生预期变化,地址族和协议没有混用。
  • 业务错误率、分位耗时或既定 SLO 达到预先写明的门槛。
  • 未出现其他区域、地址族、节点身份、证书或内容完整性回归。
  • 观察窗口覆盖计划时段,样本与原始摘要可复查。
  • 任一停止条件触发时执行精确回滚,并重复同一基线矩阵。

回滚的是明确策略,不是屏幕上的路径图

变更前保存路由策略、前缀、社区、优先级、DNS/Anycast 配置和发布版本的规范化摘要。回滚后要证明控制面撤回或恢复、本地 FIB 返回原选择、目标观测点路径回到预期状态,并且业务探针重新满足基线。路径未完全相同但业务恢复时,应记录为新的已知状态,而不是伪造“完全复原”。

隔离演练验证了方向分离、业务门禁与精确恢复

VPScope 在四个一次性 IPv4 network namespace 中建立客户端、两个路由器和服务端。变更前去程经 10.35.1.2,回程经 10.35.4.1,证明两个方向不能互相代替;去程候选切到 10.35.3.2。受控 80 ms netem 使 HTTP TTFB 从 0.161922 秒降到 0.001550 秒,切换前后响应 SHA-256 完全一致。

演练恢复了客户端原始 `ip route get` 输出,删除延迟后基线探针为 0.001198 秒;服务进程、四个 namespace 和临时目录全部清理。MTR 0.95 在该 namespace 场景触发 buffer overflow,因此被移出自动通过条件,仅保留为可选观察器。演练没有运行 BGP daemon、IPv6、Anycast、ECMP、公网或生产流量,不能证明真实运营商策略、全球收敛或 SLA。

路由变更验收的可复查清单

  • UTC 时间、观测点、目标 IP/前缀、地址族、协议、端口和发布版本已冻结。
  • BGP 控制面、实际数据路径、本地转发与业务结果分别记录。
  • RIS/RIPEstat 的 collector、peer 和时间窗边界没有被写成全球结论。
  • Anycast 节点身份单独保存,地理距离没有被当作路由保证。
  • 去程和回程分别取证;看不到的方向明确标为 unknown。
  • traceroute/MTR 的 ECMP、静默 hop 和限速边界已说明,中间跳丢包不直接归因。
  • IPv4、IPv6、TCP 与其他探测协议没有互相外推。
  • 业务门禁使用错误、阶段耗时、SLO 和内容完整性,而不是线路标签或单个 hop。
  • 变更前后矩阵、采样时段和负载可比,混杂发布事件已记录。
  • 停止条件与精确回滚已执行或演练,恢复后同一矩阵重新通过。

返回知识库