Skip to content

数据格式与互操作资料

收录日期:2026-10-01(Asia/Shanghai)。本页服务于 设计文档 中的 JSON 读取器、RTR 和验证实现。规范原文仍见 RFC / IANA 镜像,Python 架构参考见 实现参考库。

2026-10-01 初次收录的资料共 51 个文件,约 535 KB:31 个上游源码、文档或许可证文件,16 个上游 JSON / JSONExt 预期输出,以及 4 个真实响应、导出子集、版本证据或派生向量文件。本机另存一份约 106 MB 的完整 rpki-client 导出,见下文。上游片段用于阅读与对照,不是完整构建树,也不增加运行时依赖。资料收录本身不代表实现验收;当前公开入口见源码生成参考,独立服务器观察和执行方式见互操作说明。

Context7 文档覆盖

以下项目已通过本次会话的 Context7 MCP 实际完成库解析和文档查询,不再另行下载库文档:

内容 本次查询的 Context7 ID 实际返回的内容
AnyIO /agronholm/anyio/4.11.0 任务组取消、取消后的资源清理、shielded cleanup;含指向 4.11.0/docs/cancellation.rst 的原文来源
DuckDB /duckdb/duckdb-web Python 连接、默认全局连接、线程局部连接与只读多进程示例
Python 3.11 API,包括 SQLite Python 接口 /python/cpython/v3.11.14 sqlite3.connect、isolation_level、commit / rollback 和连接上下文管理器;含指向 v3.11.14/Doc/library/sqlite3.rst 的原文来源

SQLite 的覆盖本次确认到 Python 标准库 sqlite3 接口,未单独验证 SQLite 内核 WAL / 锁机制文档在 Context7 中的覆盖;需要时继续查询,或访问设计已经引用的 SQLite WAL 官方文档。这不影响本次不下载库文档的决定。

Context7 提供联网检索,不是本地离线副本。本次即使选择固定版本,也观察到部分结果混入 main 分支源码;使用时应检查每段的来源 URL。特别是 Python 3.11 事务接口不能套用后续版本新增的 autocommit 参数。此处记录的 AnyIO 文档版本不是依赖版本决策;DuckDB 示例也不改变本项目既定的单一拥有者限制。

固定的上游来源

项目 版本或快照 本地入口 用途与许可
Routinator v0.15.2,0cf9104efa730ebc2de6bbd880e9bcee50de10d9 输出格式文档、JSON 输出实现及测试、RTR 服务说明 生产者格式与上游输出样例;BSD-3-Clause
rpki-client 官方 9.9 发布归档 JSON 输出实现、手册源文件 从归档按成员原样提取;许可及文件头声明
rpki-rs v0.19.3,56d3811d3ee44a7b93eab33e5b1853cbcd4dee70 PDU 与字节测试、客户端、会话状态、载荷接口 RTR 实现对照;BSD-3-Clause
RTRlib master 在收录时固定为 de65985c782ee747bf21a250f9565f019b70d766 PDU 定义、报文处理、会话 报文、错误与生命周期对照;MIT
OpenBSD / OpenBGPD master 在收录时固定为 a5d3ee8e660b7269f17fcd507a49e1e10ce52d58 ASPA 测试、ASPA 实现、RTR 实现 独立实现及测试;保留每个文件的版权和许可声明

所有 GitHub 文件的下载 URL 都固定到 commit,master 只表示选取来源,不是浮动更新地址。rpki-client 归档的 URL、SHA-256 和提取路径在 manifest 中;Git 仓库提供的是 portable 构建框架,发布归档中的 src/output-json.c 才是本次需要的生产者实现。

JSON 样本与格式差异

样本目录为 tests/fixtures/;JSON 测试、RTR 编解码测试及验证测试区分字段、语义与时效。样本存在本身不表示测试通过,实际结果随提交和执行报告记录。来源入口见 样本索引。

样本 性质 用法与限制
Routinator 000.json 到 111.json,及对应 JSONExt 上游预期输出,原始字节 8 种载荷开关组合;三位分别对应 ROA、Router Key、ASPA。用于测试字段是否存在及格式差异;不是生产导出
Routinator 真实响应 官方演示服务按 AS3333 过滤后的原始 HTTP 响应 13 条 ROA,Router Key / ASPA 为显式空数组;不是全局完整快照
Routinator 版本证据 状态响应中版本和时间字段的摘录 报告 routinator/0.15.2;与数据响应来自不同请求,不视为原子观察
rpki-client 真实导出子集 官方 Console 导出的确定性抽样 4 条 ROA(IPv4 / IPv6 各 2)、2 条 Router Key、3 条 ASPA、3 条非正常 CA;保留原记录与 metadata

rpki-client 原始导出为 105,953,312 字节,保存在下述 Git 忽略的本地目录中。manifest 保存完整响应的 SHA-256、下载时间、HTTP 元数据、原始数组数量及逐数组抽样下标。子集中的 metadata 计数和 CCR 哈希仍描述完整原始数据,不与子集重新配平;因此该样本不能当作完整、校验一致的在线快照。生产 JSON 未报告软件版本,不能因为同时收录了 9.9 源码,就将该导出认定为 9.9。

本机完整导出

仓库根目录下的 .local-data/rpki-client/2026-10-01T151848Z/ 保存此次抽样的完整原始响应;整个 .local-data/ 已由根目录 .gitignore 排除,不会随 Git clone 提供。

文件 内容
vrps.json 原始 HTTP 响应,105,953,312 字节(约 106 MB / 101 MiB),未重新序列化
vrps.json.meta.json 来源 URL、下载时间、HTTP 响应头、字节数及 SHA-256
SHA256SUMS 同目录原始响应与下载元数据的校验清单

来源为 https://console.rpki-client.org/vrps.json,下载时间为 2026-10-01T15:18:48+00:00。完整响应包含 1,016,911 条 ROA、2 条 Router Key、3,355 条 ASPA 和 119 条非正常 CA 记录,其 SHA-256 为 8ce84c95bcb18bbcd953262cf562f48735a7d1b5d6ec7b1f68b10115a5eb7fc5,与 manifest 中子集的 source_sha256 一致。

在仓库根目录验证本机文件:

(cd .local-data/rpki-client/2026-10-01T151848Z && sha256sum -c SHA256SUMS)

完整导出供本机解析、内存占用分析和显式离线验证使用,常规测试与 CI 使用纳入版本控制的小样本。保留原始时间和有效期;需要历史语义验证时显式指定离线参考时间。后续下载使用新的时间目录,保留与已收录子集对应的原始文件。这里的 SHA-256 校验仅确认下载副本一致,未验证生产者的 CCR 或 RPKI 语义。

格式差异

已观察到的格式差异如下,供适配器输入契约使用,不代表已经完成兼容性验证:

内容 Routinator 样本 rpki-client 样本
ASN "AS1234" 等字符串 整数
导出时间 metadata.generated / generatedTime metadata.buildtime
单条有效期 JSON 样本没有 expires;JSONExt 提供来源时间字段 ROA、Router Key、ASPA 均有 expires
Router Key 集合 routerKeys bgpsec_keys
密钥字段 SKI / routerPublicKey ski / pubkey
ASPA customer customer,ASN 字符串 customer_asid,整数
缺失与空集合 000.json 不含三种载荷字段;真实响应有空 aspas 禁用 ASPA 的输出行为需结合源码确认,不能从本次含 ASPA 的样本推断所有格式

Routinator 0.15.2 的格式文档仍展示带 afi 的 ASPA 示例,但同一 tag 的 src/output.rs 和上游预期输出已经没有该字段。保存两者是为了明确文档与实际输出的差异;不能把文档示例直接当作当前输出 schema 或自动删除旧样本的 afi。

上游预期输出还故意包含重复记录、全零 SKI、占位公钥和 Unix epoch 时间。它们可证明序列化形状,不能证明密钥有效、数据新鲜或符合本项目的完整输入契约。读取历史样本时使用显式离线参考时间;禁止通过修改时间使旧数据在在线查询中重新有效。

RTR 字节向量与 ASPA 测试

7 组 RTR 字节向量 从 rpki-rs 的测试数组逐字节提取,不调用本项目编码器生成。包含 v1 的 Serial Notify、Serial Query、Reset Query、Cache Response、End of Data、Cache Reset,以及一条 v2 ASPA announcement。

每条向量记录原函数、行号、hex、预期字段和对应 RFC / 草案章节。已按独立的字段读取检查长度、版本、类型、session、serial、定时器及 ASPA ASN 列表,并对照原文布局。这些是单个 PDU 的字段向量,不是有效完整事务,也不覆盖分包、取消、错误、撤销或全部 v2 行为。ASPA 向量只核对了 8210bis-27 §5.12 的该条布局,不代表 rpki-rs 全部 v2 实现符合该草案。

进一步编写边界与故障测试时,可查阅:

本批原始资料收录时没有运行上游 C / Rust 测试或进行 RTR 服务器互操作。后续验证测试已将标注的 OpenBGPD 向量按拓扑、路径顺序、邻居角色和固定 aspa-verification-28 核对;不能据此声称整个上游测试集已移植。实际 RTR 产品与独立服务端的运行、版本差异和失败观察见互操作说明。新增移植继续固定拓扑、角色、可用数据与草案版本,再确认预期结果。出现差异时回到固定规范,不通过调整本项目断言迎合另一实现。

完整性与后续补充

manifest.json 列出每个资料文件的来源、版本或 commit、表示方式、许可、字节数和 SHA-256。这里的 path 相对于仓库根目录,与 RFC 镜像中相对于 docs/rfc/ 的路径基准不同。

在仓库根目录检查:

sha256sum -c docs/references/SHA256SUMS
(cd docs/rfc && sha256sum -c SHA256SUMS)
rg -n 'test_|assert_|VERIFY_AS_PATH' docs/references/upstream/rtrlib/tests/
rg -n 'aspa_test|expected_result|ROLE_' docs/references/upstream/openbsd/regress/

上游原文不修改空白、换行或源码;本地说明和派生数据分别存放。新增或升级资料时记录确切版本,验证 Git blob / 下载哈希及样本可解析性;更新索引、manifest 和 SHA256SUMS。现场服务内容会变化,来源 URL 只能说明出处,不能保证以后再次下载得到同一响应。

畸形输入、断线、重连、超时、旧文件重读、来源撤销及原子发布由行为验收及对应测试覆盖,预期行为来自设计和固定规范;实际检查结果在关联 Issues 和执行报告中维护。大型生产快照、完整源码仓库和构建产物不随这批小型参考资料提交。