技术指南
互联网路由变更验收:分离 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 的事实,而不是全球收敛或用户路径声明。
控制面查询必须带前缀、视角和时间窗
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,并使用目标侧请求日志、入口区域或供应商遥测补充,而不是镜像去程。
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.exampleLinux `ip route get` 返回内核按当前转发表解析出的实际本地路由结果,不会发送数据包。它适合证明源地址、接口、下一跳和策略路由选择,但不能证明网关之后的路径。把原始输出保留给精确回滚,不要只截取一行标签。
路由追踪是一条采样路径,不是拓扑数据库
RFC 7276 指出 traceroute 通过递增 TTL/Hop Limit 发现路径,但负载均衡可能让不同探针经过不同下一跳。静默 hop、地址不回复或中间设备限制 ICMP 也不等于转发失败。对真实业务端口可补充 TCP 模式 MTR,但中间 hop 的响应优先级和限速仍会污染结果,终点业务指标必须独立测量。
# 可选观察器;先确认本机 mtr 版本和权限行为。
mtr -4 -T -P 443 -n -r -c 20 service.example
mtr -6 -T -P 443 -n -r -c 20 service.example用业务探针决定用户影响
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 | 阈值来自本服务基线,不来自通用表 |
变更前后使用同一矩阵多次采样
- 至少覆盖业务高峰与非高峰,保存每次样本而不只保留均值。
- 相同观测点分别测 IPv4、IPv6 和真实应用端口。
- 变更前、候选生效、稳定观察和回滚后使用相同命令与请求。
- 并行记录发布、DNS、证书、缓存和容量事件,防止混杂。
- 将未覆盖区域、运营商、协议、回程和时间窗写入 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。
- 变更前后矩阵、采样时段和负载可比,混杂发布事件已记录。
- 停止条件与精确回滚已执行或演练,恢复后同一矩阵重新通过。