DOCUMENTARY RESEARCH / EN-IE7 EVIDENCE RUNS · PUBLIC EVIDENCE REVIEWED
AXIALPROOF / RESEARCH LAB

MEASUREMENT SPECIFICATION

可用性与延迟基准

用地理与 ASN 分层的多探针、开环固定间隔主动探测,测量中心化加密交易平台各公开服务面的可用状态与响应延迟分布,产出按功能面拆分、带显式计数口径与 95% 区间的可用性估计和分位数延迟,并同时给出该观测窗口在统计上能排除与不能排除什么。

METRIC ID
AXP-AVAIL-v1
PROCEDURES
9
RECORDED FIELDS
154
DATASET
NOT COLLECTED
DATASET / NOT COLLECTED

This page publishes a measurement specification, not results. No figure on it was produced by running the protocol against any venue. When a dataset exists it will be released separately, versioned against the metric identifier above, with the raw responses and their checksums attached.

RATIONALE

WHY THIS NEEDS A STANDARD

现有的"uptime 数字"几乎都不可复算。①平台自报的 SLA 与状态页是自述证据:口径不公开、事件时刻可事后编辑、未公告的事件在数据上等价于沉默。②第三方监控站的"99.9%"通常来自单点或少数数据中心探针,没有 ASN 分层、没有 WAF 挑战页与真实故障的分类规则、没有置信区间,把"平台在防爬"、"我们被限流"和"平台故障"混成同一个数。③普遍报均值延迟,而延迟分布重尾,均值既不代表典型体验也不代表最差体验。④普遍把 30 天窗口线性年化——而 30 天在统计上根本无法区分"三个 9"和"四个 9",也无法把年事故率上界压到有意义的水平。⑤单一 up/down 布尔值抹掉了真实世界最常见的降级形态:"能下单但行情延迟"、"交易正常但提现关闭"。对欧盟读者还多一层语境:MiCA 授权的 CASP 通常同时落入 DORA 的 ICT 风险管理与事件报告框架,因此"服务何时、以何种方式不可用"是有监管语境的事实问题;也正因如此,公开发布的可用性数字更需要一个只讲测量口径、不做法律定性的规范。本基准的产出不是"某平台可靠性排名",而是一套别人能照着重做的测法:口径、参数、分类树、统计处理与不确定度全部前置公开。

OUTPUT

WHAT GETS PUBLISHED

发布两件绑定在同一版本号上的产物。(1)方法页 axialproof.com/methodology/axp-avail-v1:范围与 F1–F7 功能面定义;三种计数口径(A_strict / A_human / A_censored)及其适用场景;分类树与签名表说明;开环采样、事件重建与共因排除规则;延迟分层与分位数报告纪律;不确定度方法与「本窗口能排除什么」的推断力声明(含反向功效计算脚本);法律与伦理红线清单;「本基准不能确立什么」专章;变更日志与版本对照表;单命令复现说明;正文中印出 MANIFEST.json 的 SHA-256。(2)开放数据集(归档服务发布并取得 DOI):probes.csv、endpoints.csv、samples.parquet 与 CSV 镜像、states.csv、events.csv、announcements.csv、latency_ecdf.csv、summary.csv、signatures.json、preregistration.md 及其公开时间戳、raw/ 原始响应归档、MANIFEST.json、数据字典与复现镜像 digest。数据 CC BY 4.0,代码 MIT。首版发布 30 天主窗口;长期哨兵序列累积 6–12 个月后作为年度补编单独发布,版本号递增而非覆盖。

PREREQUISITES

What must exist before a single measurement is taken.

A benchmark that skips these produces numbers, not evidence. Every item is a precondition of the protocol, not a recommendation.

P-01

≥6 台探针主机,按 ASN 类型分层:EU 数据中心 ×3(如都柏林/法兰克福/巴黎,分属 ≥3 家不同 IaaS,且必须落在 ≥3 个不同自治系统)、北美数据中心 ×1、亚太数据中心 ×1、EU 真实住宅宽带 ×1(团队成员自有线路,知情同意)。全部为主机真实所在地,禁止 VPN/代理/住宅代理池伪装地区。

REQUIRED
P-02

第 7 台自建 canary 主机(第七个区域),运行返回 128 字节固定文本、Cache-Control: no-store 的静态 HTTP 端点与一个 WebSocket echo 服务,作为仪器噪声底。

REQUIRED
P-03

每台探针:Linux、chrony 锁定同一组已登记的公开 NTP 源、curl(主计时实现)、Python 3.11+ 与 httpx(副实现,用于工具偏差核验)、systemd timer 或独立进程池实现开环调度;2 台探针额外装 Playwright/Chromium 作浏览器探针。

REQUIRED
P-04

离线 IP→ASN 数据集(如 GeoLite2 ASN 或等价的公开 BGP 派生数据集),记录版本,避免逐次调用第三方 API 引入外部依赖与限流。

REQUIRED
P-05

中心汇聚主机 + 对象存储:保存每个样本的响应头、正文前 8 KB 与全文 SHA-256,按日分包并逐包哈希。

REQUIRED
P-06

窗口前预注册文件:窗口起止(UTC)、端点普查表、成功判据、全部阈值、签名表 v0、分析计划与随机种子,在窗口开始前 ≥72 小时公开发布并对文件哈希做公开时间戳。

REQUIRED
P-07

各平台公开 API 速率限制文档的存档快照(含 URL 与 SHA-256),据此把我方速率设为该限额的 ≤10%;各域 robots.txt 快照与哈希。

REQUIRED
P-08

自识别 User-Agent(形如 AxialProofBot/1.0 (+https://axialproof.com/bot; AXP-AVAIL-v1))与一个说明本基准与联系方式的公开页面;全窗不得更换 UA、不得轮换 IP。

REQUIRED
P-09

可选的 F6 下单面模块:每个平台一个团队自有实名账户(不得使用他人账户或他人银行账户),余额仅为满足最小下单额。

REQUIRED
P-10

人力:≥2 名可独立编码分类的成员 + 1 名未参与采集的复算员(角色可轮换,但同一样本不得自编自审)。

REQUIRED
P-11

预算量级:探针与存储 8 周约 €150–250;可选下单模块每平台 €50–100 账户余额;时间戳/归档服务约 €10。

REQUIRED

PROTOCOL

9 procedures, each with its own evidence boundary.

Every procedure states what its output can support and what it cannot. The second of those is the one that keeps a measurement honest.

AVAIL-01

探针台架、时钟纪律与噪声底标定

  1. 按 ASN 类型分层部署 ≥6 台探针(DC-EU ×3、DC-NA ×1、DC-APAC ×1、RES-EU ×1),逐台登记 provider、ASN、国家、IP 地址族、内核/curl/TLS 库版本与容器镜像 digest。
  2. 每台安装 chrony 并锁定同一组已登记 NTP 源;每次采样同时执行 chronyc tracking,记录 clock_offset_ms 与 clock_rms_ms;|offset| > 5 ms 的样本置 clock_suspect=true。该标记只影响 staleness 类指标,不影响 RTT/TTFB 类指标——往返计时在单机上完成,对时钟偏移免疫,只有单向新鲜度暴露于偏移。
  3. 部署两套独立计时实现:curl --no-keepalive -w(主)与 Python httpx(副)。副实现按 1:10 频率对同一端点并行采样,用于量化工具偏差。
  4. 在第七区域自建 canary 静态端点,并选取 ≥2 个稳定的第三方公开静态对象作为对照端点;所有探针在同一调度槽同时探测被测平台、canary 与对照端点。
  5. 运行 ≥7 天空载标定期,对每条(探针→canary)路径计算成功率与延迟分位数,得到该探针的 floor_availability 与 floor_latency_p50/p99。
  6. 对 127.0.0.1 上的本地 nginx 做 1,000 次同样计时,取 p50 为 harness_overhead_ms,作为该探针延迟分辨率的下限。
  7. 固定自识别 User-Agent,全窗不更换、不轮换 IP、不伪装浏览器 UA;采集前保存各域 robots.txt 快照与哈希。
  8. 设定速率上限为平台公布公共端点限额的 ≤10%;收到 429 或文档化限流响应,立即对该(探针,平台)暂停 ≥15 分钟并指数退避,暂停期计为 RATE_LIMITED 而非平台故障。
Quantity measured
floor_availability(probe) = N_OK(canary) / N_total(canary);任何平台可用性估计的可分辨上限 ≤ floor_availability(probe)——估计值优于噪声底时只可表述为「不低于噪声底」。
Fixed parameters
标定期 7 天;连接超时 5 s / TLS 5 s / 总超时 15 s(REST)、30 s(HTML);canary 响应体固定 128 B 且 no-store 以排除缓存干扰;工具偏差抽样比 1:10;时钟可疑阈值 5 ms。
Sample size
探针 ≥6(DC 5 + RES 1),跨 ≥3 家 IaaS 与 ≥4 个 ASN;标定期 ≥7 天连续;canary 与对照端点获得与被测平台完全相同的采样密度(60 s 档 = 每探针 10,080 样本/7 天);工具偏差核验配对样本 ≥2,000。
Control
canary 与第三方对照端点在同一调度槽与被测平台并行测量;对照端点与平台端点同槽同时失败 → 归 PROBE_FAULT,退出平台可用性计算。
Statistical treatment
噪声底以 Wilson 区间报告;延迟底以分位数与阶次统计量区间报告;工具偏差用配对差值的中位数与 IQR,不用均值。
Reproducibility check
probes.csv 公布全部探针属性、NTP 源、UA、脚本 Git 提交与镜像 digest。第三方在任意区域自建一台探针,用同一 digest 的镜像运行 7 天,其 canary 噪声底应落入我们公布的区间;若显著更差,说明其路径而非我们的方法有问题——这一判定规则本身也写进方法页。
Known pitfalls
所谓「不同城市」的 VPS 常属同一 ASN 与同一上游,会伪装成独立探针(必须按 ASN 而非城市去重);住宅探针受家庭路由器重启与 CGNAT 影响,须单独标注;容器时钟在宿主挂起或迁移后会跳变,chrony 日志必须留存。
Risk
禁止住宅代理池、VPN 出口或借用他人网络冒充地理位置;住宅探针须为团队成员自有线路并知情同意;不得在受雇主或学校网络策略约束的线路上运行长期探测。

SUPPORTS / 建立「这台仪器能分辨到什么程度」的可公开量化边界:噪声底、时钟纪律、工具偏差、脚本开销。任何平台侧结论都能先减去仪器自身的误差,读者也拿到了衡量我们的尺子。

DOES NOT SUPPORT / 不能确立探针路径与普通用户路径等价——数据中心 ASN 与住宅 ASN 在 CDN/WAF 策略下常被区别对待,这正是必须分层而非平均的原因。也不能确立平台没有对我们的自识别 UA 做特殊处理。任何供应商的 SLA 文档、网络质量白皮书或状态页在此完全无用:它们描述承诺与意图,不能给出我们这条链路在这一槽的实际分辨率。

EVIDENCE RETAINED / probes.csv 探针注册表 · 容器镜像 digest 与采集脚本 Git 提交哈希 · chrony tracking 日志摘要 · canary 标定期全量原始样本 · 各域 robots.txt 快照与哈希
RECORDED FIELDS (15)
  • probe_id / / 稳定标识,形如 dc-eu-dub-01
  • probe_asn / / ASN 号与组织名,来自离线 IP→ASN 数据集;记录数据集版本
  • probe_class / enum / DC / RES / MOBILE
  • probe_country / ISO 3166-1 alpha-2 / 主机真实所在地,非声称地
  • ip_family / enum / v4 / v6;主序列为 v4,v6 为次要序列
  • clock_offset_ms / ms / chronyc tracking 的 System time 偏移,带符号
  • clock_rms_ms / ms / RMS 偏移,用于判定时钟纪律是否成立
  • harness_overhead_ms / ms / 本地回环 1,000 次计时的 p50,延迟分辨率下限
  • floor_availability_ratio / ratio / canary 路径成功率(0–1),仪器噪声底
  • floor_latency_p50_ms / ms / canary 路径 p50
  • floor_latency_p99_ms / ms / canary 路径 p99
  • tool_bias_ttfb_median_ms / ms / curl 与 httpx 同槽 TTFB 配对差值的中位数
  • image_digest / / 容器镜像 digest,复现的锚点
  • robots_txt_sha256 / SHA-256 hex / 每域一条,采集前快照
  • user_agent / / 全窗固定的自识别串
SPECIFICATION
AVAIL-02

端点普查与成功判据形式化(窗口前预注册)

  1. 逐平台列出无需登录即可探测的公开端点,按功能面归类:F1 web 前端首页、F2 行情 REST、F3 行情 WebSocket、F4 交易元数据(交易对/精度/交易状态)、F5 登录页可达性(仅 GET)、F6 下单面(可选,需自有账户)、F7 充提开关状态(若平台提供公开资产状态端点)。
  2. 每个端点写死:URL(含查询串)、方法、HTTP 版本、地址族、是否复用连接(主序列一律不复用)、超时、可接受状态码集合、内容断言(JSONPath / 正则 / DOM 选择器)、新鲜度字段名与 stale_ms、降级阈值 slow_ms、采样档(A=60 s、B=300 s、C=900 s、D=每日 4 次)。
  3. 把成功判据形式化为一个布尔式并公开:OK ⇔ transport_ok ∧ status ∈ OK_SET ∧ content_assert ∧ (staleness ≤ stale_ms) ∧ latency_total ≤ timeout_ms。单看 HTTP 200 不构成 OK——200 空体与 200 错误体是最常见的假阳性来源。
  4. 为每个端点在窗口开始前固定 slow_ms(如公共 REST 2,000 ms、HTML 首屏 8,000 ms)与 stale_ms(如行情 5,000 ms);窗口内不得修改。
  5. 端点等价性对齐:跨平台比较只在同一功能面内进行,并逐平台记录该面所用端点的差异(深度档位数、页面重量、响应体字节数量级)。禁止把 A 平台的轻量 ticker 与 B 平台的重量级聚合端点直接比延迟。
  6. 每次请求记录解析得到的 IP、其 ASN/组织、TLS 证书颁发者与 SAN、server / via / x-cache 等边缘标识头,供后续共因判定与 PoP 归属使用。
  7. 把窗口起止、端点普查表、成功判据、全部阈值、签名表 v0、分析计划与随机种子写入 preregistration.md,在窗口开始前 ≥72 小时发布并对哈希做公开时间戳;窗口开始后任何变更只能新增版本并全窗重跑,不得静默修改。
Quantity measured
OK ⇔ transport_ok ∧ status ∈ OK_SET ∧ content_assert ∧ (staleness ≤ stale_ms) ∧ latency_total ≤ timeout_ms;DEGRADED_SLOW ⇔ 其余条件成立 ∧ latency_total > slow_ms;DEGRADED_STALE ⇔ 其余条件成立 ∧ staleness > stale_ms。
Fixed parameters
阈值见步骤 4;主序列每样本重建 TCP+TLS(不复用连接),因此测得的是「冷连接延迟」,是持久连接客户端体验的上界,必须在报告中声明;预注册提前量 ≥72 h。
Sample size
每平台 ≥6 个端点、覆盖 ≥5 个功能面;5 平台合计 ≥30 条端点定义;预注册文件在窗口开始前 ≥72 小时发布。
Control
每个平台至少纳入一个「静态且极简」的端点(如 robots.txt 或纯静态资源)作为平台侧对照,用以区分「整站不可达」与「某业务端点故障」。
Statistical treatment
本步不产出统计量,但阈值的前置固定是后续所有区间有效性的前提——事后调阈值等同于事后选择假设。
Reproducibility check
第三方拿到 endpoints.csv 与 signatures.json 后,对我们发布的任意一条原始响应归档重跑分类器,输出必须与已发布的 samples 表逐字段一致:分类器被设计为(原始响应, 签名表, 参数)→ 类别 的纯函数。
Known pitfalls
内容断言写太松(只看 200)会把维护页记成可用;写太紧(依赖具体数值或易变 DOM)会因平台正常改版而误报故障——优先用稳定语义字符串,并在预注册中记录备选断言与启用条件。
Risk
F5 只做 GET,绝不提交任何凭据组合;不做凭据填充、爆破或任何渗透测试;不探测非公开或需授权的管理端点;不绕过任何访问控制。

SUPPORTS / 让「可用」这个词有一个逐端点、可执行、可被第三方在同一原始数据上重跑的定义,并把跨平台比较限制在功能面与响应体量级对齐的范围内。

DOES NOT SUPPORT / 端点普查不能确立平台的完整服务面——我们只看得到公开可探测的那一部分。账户内的风控拦截、KYC 挂起、提现审核队列对用户可用性影响巨大,却不在本普查范围内。因此任何「平台可用」的表述都必须带功能面限定词。平台的 API 文档在此只能确立「平台声称提供哪些端点及其限额」,无法确立这些端点在窗口内的实际行为,也无法确立文档未列出的降级路径不存在。

EVIDENCE RETAINED / endpoints.csv 端点普查表 · preregistration.md 及其公开时间戳 · 平台限额文档与 robots.txt 快照 · 标定期用于确定 slow_ms/stale_ms 的基线样本
RECORDED FIELDS (15)
  • endpoint_id / / 稳定标识,跨版本不复用
  • platform / / 被测平台标识
  • facet / enum / F1–F7 功能面
  • url / / 含查询串的完整 URL
  • http_version / enum / 1.1 / 2 / 3,固定不变
  • reuse_conn / bool / 主序列 false;对照序列 true
  • timeout_ms / ms / 总超时,窗口内不可变
  • ok_status_set / / 可接受状态码集合,如 {200}
  • content_assert / / JSONPath / 正则 / DOM 选择器原文
  • freshness_field / / 响应体中平台自报事件时间戳的字段路径;无则空
  • stale_ms / ms / 新鲜度阈值
  • slow_ms / ms / 降级阈值,绝对值,前置固定
  • tier / enum / A/B/C/D 采样档
  • resp_bytes_expected / bytes / 标定期观测到的响应体量级,用于跨平台可比性说明
  • rate_limit_doc_sha256 / SHA-256 hex / 平台限额文档快照哈希
SPECIFICATION
AVAIL-03

开环采样、事件重建与共因排除

  1. 调度:每个(探针, 端点)的采样时刻 slot_t = t0 + kΔ + offset,offset 在窗口开始前一次性抽自 U(0, Δ) 并写入注册表,窗口内不再变化;不同探针 offset 互不相同,避免同相位对短故障形成系统性盲区。不加逐样本抖动,以保持调度可审计。
  2. 开环执行:到点即发,不等待上一次请求返回。禁止「上次没回来就跳过本次」——那会在平台最慢的时候系统性少采样(coordinated omission),把分位数压低。同时记录 slot_ts(计划时刻)与 send_ts(实际发出),差值 schedule_lag_ms 全量发布,>1,000 ms 的样本标 sched_suspect。
  3. 零重试:可用性序列内绝不重试,失败样本就是失败样本,下一个调度槽即天然重试。另设「确认探测」:任一非 OK 样本触发一次 5 s 后的确认请求,结果写入独立列 confirm_*,仅用于事件裁定,绝不进入可用性分子或分母。
  4. 超时按右删失记录:latency_total_ms = timeout_ms 且 censored = true。删失样本既不得丢弃也不得当作缺失。
  5. 事件重建(facet 级):起点 = (a) ≥2 个分属不同 ASN 的探针在同一槽对同一 facet 记录非 OK,或 (b) 同一探针连续 ≥2 槽非 OK 且其 canary 与对照端点在这些槽均 OK;终点 = 连续 ≥2 槽全部恢复 OK。持续时间 d = (末次非 OK 槽 − 首次非 OK 槽) + Δ,不确定度 ±Δ,为均匀界而非高斯。
  6. 共因排除:若同一探针在同一槽对 ≥2 个不同平台、但共享同一边缘 ASN / 证书颁发者 / server 标识的端点同时失败,该槽标 SUSPECT_COMMON_CAUSE,从各平台的平台侧事件计数中剔除,但完整发布在 common_cause 表中。
  7. 探针故障排除:某探针在某槽对全部对照端点与 canary 同时失败 → 该探针该槽全部样本标 PROBE_FAULT,从分子与分母同时剔除,并计入该 facet 的 coverage 损失。
  8. 覆盖率闸门:任一(平台, facet)的 coverage < 95% 时不进入主表数字,只在附表报告并注明覆盖不足;不得用空白暗示正常。
Quantity measured
A_sample = N_OK / (N_OK + N_FAIL)(分母含哪些类由计数口径决定,见 AVAIL-04);A_time = 1 − Σ_e d_e / (T − T_excluded);coverage = 有效观测槽 / 计划槽;短故障检出概率 P_detect(d) = 1 − (1 − min(1, d/Δ))^m,m 为相位去相关的探针数。
Fixed parameters
Δ 分档:A=60 s、B=300 s、C=900 s、D=每日 4 次固定 UTC 时刻;确认探测延迟 5 s;事件确认阈 2 槽或 2 个不同 ASN;恢复确认阈 2 槽;覆盖率闸门 95%;窗口 T=30 天(UTC 对齐,预注册)。
Sample size
A 档 Δ=60 s、T=30 天 → 每探针每端点 43,200 槽,6 探针合计 259,200;B 档 8,640/探针;C 档 2,880/探针;D 档 120/探针。全窗全平台样本量级 10^6–10^7 行。检出功效(设计推导,非实测;团队须按自身 m、Δ 重算并随方法页发布曲线):m=6、Δ=60 s 时,d=10 s → 0.67,d=20 s → 0.91,d=30 s → 0.98;短于 Δ 的抖动系统性不可见。
Control
canary 与第三方对照端点同槽并行;同一探针对多平台的并行观测用于共因判定;确认探测与主样本在数据表中物理分列,杜绝混入。
Statistical treatment
A_sample 的区间见 AVAIL-08(移动块自助法);事件持续时间按 ±Δ 均匀界报告,禁止把 d 报到比 Δ 更细的精度;事件计数用泊松精确区间;coverage 与删失比例作为强制随附列。
Reproducibility check
分类与事件重建实现为对(原始归档, signatures.json, 参数文件)的纯函数;由未参与采集的成员在另一台机器上重跑,产出的 events.csv 必须与发布版逐行一致。发布脚本 Git 提交哈希与运行日志一并公布,README 给出各派生表的预期 SHA-256。
Known pitfalls
闭环调度是最常见的隐性错误;用系统 cron 的整分对齐会让所有探针同相位、同时错过短故障;把确认探测计入分子会系统性抬高可用性;把单探针单样本的抖动直接当成平台故障。
Risk
确认探测对每个非 OK 样本仅一次,不得在同槽内对同一端点连发;出现 429 立即停止该(探针, 平台)全部探测并退避,不得换 IP、不得降低 UA 可识别性继续。

SUPPORTS / 一个不受漏采样与重试污染的观测序列,加一套确定性、可在原始归档上重跑的事件重建规则;把「平台侧」与「我方/传输侧」分离到可审计的程度,并把采样间隔对短故障的盲区量化成一条可发布的检出概率曲线。

DOES NOT SUPPORT / 不能确立故障的原因或责任方——共因标记只排除明显的上游共同故障,不能证明某次故障发生在平台自有基础设施内。不能确立短于 Δ 的故障数量。不能确立事件的精确起止时刻(分辨率被 Δ 硬性限制)。平台事后发布的事故复盘文档也不能补上这一点:复盘确立的是平台对事件的叙述,其时刻与范围无法被我们独立验证,只能与我们的观测并列呈现。

EVIDENCE RETAINED / samples.parquet 逐样本表 · events.csv 事件表与重建规则版本 · common_cause.csv · coverage 报表 · 原始响应归档 raw/
RECORDED FIELDS (19)
  • sample_id / / 主键
  • probe_id / / 外键至 probes.csv
  • endpoint_id / / 外键至 endpoints.csv
  • slot_ts / ISO8601 UTC ms / 计划采样时刻
  • send_ts / ISO8601 UTC ms / 实际发出时刻
  • schedule_lag_ms / ms / send_ts − slot_ts,开环调度的自证据
  • http_status / count / 状态码;传输层失败时为空
  • transport_error / enum / DNS_FAIL / TCP_FAIL / TLS_FAIL / TIMEOUT / 空
  • latency_total_ms / ms / 超时样本取 timeout_ms
  • censored / bool / 是否右删失
  • observation_class / enum / 见 AVAIL-04 分类树
  • confirm_class / enum / 5 s 确认探测的分类;仅用于事件裁定,可空
  • resolved_ip / / 本次解析到的 IP
  • resolved_asn / / 该 IP 的 ASN,用于 PoP 与共因判定
  • body_sha256 / SHA-256 hex / 完整响应体哈希
  • body_head_bytes / bytes / 归档保留的正文前 8 KB 长度
  • probe_fault / bool / 本槽是否判为探针侧故障
  • common_cause_flag / bool / 是否判为上游共因
  • event_id / / 事件重建后回填,可空
SPECIFICATION
AVAIL-04

响应分类树:WAF 挑战 / 限流 / 地域 / 维护 / 真实故障

  1. 建立带自身版本号的 signatures.json,每条签名含 id、目标类别、匹配位置(状态码 / 响应头名与值正则 / 正文正则 / 重定向目标)、来源说明。签名只写公开可观察特征(如挑战响应头、挑战页固定资源路径、Retry-After、451、维护页固定文案),绝不写入任何绕过手段。
  2. 分类按固定优先级自上而下判定,第一个命中即定类以保证确定性:① PROBE_FAULT(本探针同槽对照全败)→ 剔除;② RATE_LIMITED(429 / Retry-After / 平台文档化的限流码与文案)→ 计入「自致与访问性」表,不计平台故障;③ CHALLENGE_INTERACTIVE 或 CHALLENGE_TRANSPARENT(命中挑战签名,二者区分由浏览器探针回填);④ GEO_BLOCKED(451 或稳定的地域限制页/跳转,且需该探针连续 ≥24 h 一致、同期至少一个其它地区探针正常);⑤ MAINTENANCE_ANNOUNCED 或 MAINTENANCE_UNANNOUNCED(命中维护页签名,按 AVAIL-07 的公告重叠判定);⑥ HTTP_5XX / HTTP_4XX_OTHER / TIMEOUT / TLS_FAIL / TCP_FAIL / DNS_FAIL;⑦ 皆不命中 → 按成功判据评为 OK / DEGRADED_STALE / DEGRADED_SLOW。
  3. 挑战页与真实故障的分界(本基准最易做错的一处):挑战页常返回 403/503 并携带厂商特征,只看状态码会把「平台在防爬」错报成「平台宕机」。因此状态码永远不单独定类,必须状态码 + 头/体签名共同命中;未命中任何签名的 403/503 一律进入人工裁定队列,不得默认归入任一类。
  4. 浏览器探针(Chromium,C 档 900 s,仅 2 台探针,每次全新用户目录、无持久化存储、无反检测插件):加载 F1 首页,记录是否出现挑战、是否在 ≤15 s 内无任何人工交互地自动通过、通过后是否命中内容断言,据此把挑战样本回填为 CHALLENGE_TRANSPARENT 或 CHALLENGE_INTERACTIVE。任何需要解验证码的情形一律记为 CHALLENGE_INTERACTIVE 并立即结束该会话——绝不解验证码、绝不绕过机器人检测。
  5. 三种计数口径并列发布,每个可用性数字必须注明口径:A_strict(挑战计为不可用,机器客户端视角,API 客户端无法通过挑战);A_human(CHALLENGE_TRANSPARENT 计为可用、CHALLENGE_INTERACTIVE 计为不可用,须有同期浏览器探针支持,否则该口径不出数);A_censored(挑战样本从分子分母同时删失,并强制公布删失比例)。挑战率 CR 本身作为一等指标,按探针 ASN 类别(DC/RES)分层发布。
  6. 人工裁定:未命中签名的样本进入队列,两名成员依据同一裁定手册独立编码,计算 Cohen's κ 及其 95% 区间;κ < 0.80 则修订签名表、bump 版本号、对全窗重跑,并在变更日志记录。裁定手册与分歧样本(脱敏后的响应头与正文前 8 KB)随数据集发布。
  7. 地域封锁不计入平台全局可用性,而作为独立的「可达性」指标按地区发布——同一平台对 IE/DE/FR 与对第三国的可达性可能不同,这对欧盟读者尤其重要。
Quantity measured
CR(probe_class) = N_CHALLENGE / N_total;A_strict = N_OK / (N_total − N_excluded),N_excluded = PROBE_FAULT + RATE_LIMITED + GEO_BLOCKED + COMMON_CAUSE;A_human 把 CHALLENGE_TRANSPARENT 移入分子;A_censored 把全部 CHALLENGE_* 同时移出分子与分母,并报告 censored_share。
Fixed parameters
挑战自动通过阈值 15 s;地域封锁一致性阈值 24 h;κ 合格阈 0.80;未命中签名样本 100% 进入裁定,若超过 1,000 条则分层随机抽 1,000 条并公布抽样框与随机种子;浏览器探针每次全新 profile。
Sample size
签名表 ≥20 条覆盖 5 个平台;κ 至少在 200 条重叠编码样本上计算;浏览器探针 2 台 × 2,880 次/30 天 = 5,760 次/平台;挑战率按 DC/RES 分层各自报告,不合并。
Control
同槽的 canary 与第三方对照端点必须未被挑战,否则该槽归 PROBE_FAULT;DC 与 RES 探针的同槽对照使「是否针对数据中心 IP」成为可观测的分层差而非猜测。
Statistical treatment
κ 及其 95% 区间必须发布;三种口径的可用性一并列表,禁止只报最有利的一种;挑战率按 DC/RES 分层并给出分层差的自助法区间;限流样本单列「自致与访问性事件」表,既不计入平台故障,也不许藏起来。
Reproducibility check
分类器是(原始响应, signatures.json)→ 类别 的纯函数;第三方在发布的原始归档上重跑必须得到完全相同的类别序列。κ 计算脚本与双人编码原始表一并发布。
Known pitfalls
用「页面含 captcha 字样」这类脆弱规则匹配;把 403 一律当封锁;浏览器探针带上了上次的 cookie 从而跳过挑战;使用无头浏览器反检测插件——那属于绕过机器人检测,禁止。
Risk
绝不解验证码、绝不使用指纹伪装或反检测插件、绝不轮换 IP 或 UA 以绕过拦截、绝不使用住宅代理池。被挡住就如实记录被挡住——这本身就是本基准的一项观测结果。

SUPPORTS / 把「平台故障」与「平台在防爬」「我们被限流」「该地区不提供服务」分开,且分类规则公开、确定、可复算;使挑战率本身成为一等可比观测量,并让计数口径的选择从隐藏判断变成三种并列公布的显式口径。

DOES NOT SUPPORT / 不能确立平台是否「针对我们」——我们无法区分普适机器人策略与针对特定 ASN/UA 的策略,只能报告分层后的差异。不能确立挑战页背后的服务是否健康:挑战是边缘层行为,边缘正常时源站可能已故障,反之亦然。平台的爬虫政策、机器人条款、安全白皮书在此完全无能为力——它们说明策略意图,不说明我们这一槽实际遇到了什么,也不能反推某次 403 属于哪一类。

EVIDENCE RETAINED / signatures.json(带版本) · 裁定手册与双人编码表 · 浏览器探针会话日志与截图哈希 · 按 DC/RES 分层的挑战率表 · 自致与访问性事件表
RECORDED FIELDS (13)
  • observation_class / enum / 分类树输出,唯一且确定
  • signature_id / / 命中的签名;未命中为空并进入裁定
  • signature_table_version / / 分类所用签名表版本,复现的必要条件
  • challenge_vendor_hint / / 仅记录公开可见的厂商特征字符串,不作归因
  • challenge_auto_passed / bool / 浏览器探针回填;无浏览器覆盖时为空
  • challenge_resolve_ms / ms / 自动通过耗时;未通过为空
  • retry_after_s / s / 限流响应头值
  • adjudicated / bool / 是否经人工裁定
  • coder_a_class / enum / 编码员 A 独立结果
  • coder_b_class / enum / 编码员 B 独立结果
  • adjudication_kappa / 系数 / 表级 Cohen's κ 与 95% 区间
  • counting_convention / enum / strict / human / censored
  • censored_share_ratio / ratio / 该序列被删失的样本占比(0–1)
SPECIFICATION
AVAIL-05

部分降级的状态向量编码

  1. 每槽为每个平台生成状态向量 V(t) = (s_F1 … s_F7),s ∈ {OK, DEGRADED, DOWN, NA}。facet 状态由该面下所有端点的跨探针共识决定:≥2 个不同 ASN 的探针一致才采纳;仅 1 个探针支持时标 single_probe=true,降为观察值,不进入 facet 主状态。
  2. 定义派生总态:FULL_SERVICE(全部已测面 OK)、PARTIAL_DEGRADATION(≥1 非 OK 且 ≥1 OK)、FULL_OUTAGE(全部已测面 DOWN)、UNKNOWN(覆盖不足)。主表每行一个 facet;任何单一的「平台可用率 X%」必须写明它指哪个 facet 与哪个口径,禁止把 7 个面折叠成一个头条数字。
  3. 行情新鲜度与服务可用分离:staleness = t_recv − t_payload_event(取响应体自带时间戳)。staleness > stale_ms 而其它判据通过 → DEGRADED_STALE,即「接口活着但数据不新」。这是「能下单但行情延迟」唯一能把事实说清的编码。
  4. F3 WebSocket:每 900 s 建一次会话,订阅固定标的的最优买卖/成交流,记录 connect_ms、subscribe_ack_ms、首条消息延迟、会话内消息间隔 p50/p95/max、是否被服务端中断及关闭码;会话固定 120 s 后主动关闭。gap_max_ms 是「行情断流」的直接证据,判定规则:gap_max > 5 × gap_p95 记为断流候选。
  5. F7 充提开关:若平台提供公开资产状态端点,逐资产每 300 s 记录 deposit_enabled / withdraw_enabled 与变更时刻。这能捕捉「交易正常但提现关闭」——对用户影响最大、却被任何单一 uptime 数字完全抹掉的状态。平台不提供公开端点时 F7 记 NA,并在正文显式写明「该面不可观测」,不得用空白暗示正常。
  6. F6 下单面(可选,仅在拥有自有实名账户的平台运行):每日 4 次固定 UTC 时刻,用 post-only 限价单、价格偏离中间价 ≥20%(买单向下、卖单向上),下单后立即撤单;记录下单 ack 延迟、撤单 ack 延迟与订单最终状态。任何一次出现成交立即停止该模块并全量披露。
  7. 事件叙述规则:events.csv 记录事件期间 facet 组合的变化序列(如 F2:DEGRADED_STALE → F2:DOWN,F4:DOWN → 恢复),使「部分降级」在数据层面可查询,而不是只靠正文描述。
Quantity measured
staleness = t_recv − t_payload_event;PARTIAL_TIME_ratio = (处于 PARTIAL_DEGRADATION 的槽数 × Δ) / T;facet 可用率 A(facet) 按 AVAIL-03/04 口径分别计算;断流候选判据 gap_max > 5 × gap_p95。
Fixed parameters
WS 会话时长 120 s、间隔 900 s、订阅标的固定;F6 每日 4 次、偏离 ≥20%、post-only、立即撤单;F7 快照 300 s;共识阈 2 个不同 ASN。
Sample size
状态向量按 60 s 槽生成,30 天 = 43,200 个向量/平台;F3 会话 2,880 次/探针,2 台探针 → 5,760 次/平台;F7 逐资产每 300 s 快照,资产全量;F6 若启用为 120 次/平台/探针(n 小,只报 p50 与全距)。
Control
F3 每次同时对自建 canary 的 WebSocket echo 服务做一次会话,用于区分「我方 WS 栈问题」与「平台断流」;F6 的 ack 延迟与同槽 REST 延迟并列,避免把网络抖动当成撮合系统响应。
Statistical treatment
各 facet 独立报告可用率与分位数;派生总态的时间占比用块自助法给区间;F6 样本量小(n≈120),只报 p50 与全距,不报 p95 以上分位数;F7 为布尔时间序列,报告状态切换次数与各状态时长,不做分位数。
Reproducibility check
状态向量由 samples 表经公开规则生成,第三方从 samples 重算 states.csv 必须完全一致;WS 原始会话的时间戳序列(不含任何账户信息)随数据集发布。
Known pitfalls
把 NA 当 OK;把单探针抖动当 facet 降级;WS 会话过长会触碰平台连接数/订阅数限制;F6 用市价单或贴近盘口的限价单会真实成交并产生费用与市场影响;F7 只读到「平台自报的开关」,与实际能否提现是两回事。
Risk
F6 涉及真实资金:建议每平台账户余额 €50–100,仅为满足最小下单额;单笔名义额取平台最小下单额(通常 €5–20 等值)。post-only + 偏离 ≥20% + 立即撤单可把成交概率压到极低但不为零,须接受小额损失风险。不构成投资建议。绝不跨账户对敲、绝不自成交、绝不使用他人账户或他人银行账户。

SUPPORTS / 把「可用」从布尔值升级为有结构的状态向量,使「下单可用但行情延迟」「交易正常但提现关闭」这类真实世界最常见的降级形态可被编码、检索与跨平台比较,并让部分降级的时间占比成为可发布的量。

DOES NOT SUPPORT / 状态向量不能确立用户实际受损程度——同样是 F2 DEGRADED_STALE,对做市者是致命的,对定投用户几乎无感。不能确立平台内部的降级范围,我们只看到边缘暴露的那部分。F7 为 NA 不等于提现正常,只等于不可观测。staleness 依赖平台自报时间戳,只能给出「含平台时钟误差在内」的上界,不能确立平台时钟正确。平台的架构文档、状态页组件划分与产品公告都无法替代这些观测:它们描述平台如何切分自己的服务,不描述某一槽各面的实际状态。

EVIDENCE RETAINED / states.csv 状态向量表 · WS 会话时间戳序列 · F7 开关变更时间线 · F6 下单/撤单 ack 记录(脱敏) · canary WS echo 对照会话
RECORDED FIELDS (20)
  • ts / ISO8601 UTC / 槽时刻
  • platform / / 被测平台
  • facet / enum / F1–F7
  • facet_state / enum / OK / DEGRADED / DOWN / NA;NA 表示不可观测,不等于正常
  • consensus_asn_count / count / 支持该状态的不同 ASN 数
  • single_probe / bool / 仅单探针支持,降为观察值
  • composite_state / enum / FULL_SERVICE / PARTIAL_DEGRADATION / FULL_OUTAGE / UNKNOWN
  • staleness_ms / ms / 含平台自报时间戳误差在内的上界,非平台内部延迟
  • ws_connect_ms / ms / WebSocket 建连耗时
  • ws_sub_ack_ms / ms / 订阅确认耗时
  • ws_first_msg_ms / ms / 订阅后首条消息延迟
  • ws_gap_p95_ms / ms / 会话内消息间隔 p95
  • ws_gap_max_ms / ms / 会话内最大间隔,断流的直接证据
  • ws_server_close_code / count / 服务端关闭码;正常自闭为空
  • asset_symbol / / F7 资产标识
  • deposit_enabled / bool / 平台自报的充值开关
  • withdraw_enabled / bool / 平台自报的提现开关
  • order_ack_ms / ms / F6 下单确认延迟
  • cancel_ack_ms / ms / F6 撤单确认延迟
  • order_final_state / enum / CANCELLED / REJECTED / FILLED(FILLED 触发模块停止与披露)
SPECIFICATION
AVAIL-06

延迟的分层测量与分位数报告

  1. 每样本用 curl 的 -w 计时变量分层记录 time_namelookup、time_connect、time_appconnect、time_starttransfer、time_total(秒,转 ms 存储保留 3 位小数),派生 t_dns、t_tcp = connect − namelookup、t_tls = appconnect − connect、t_wait = starttransfer − appconnect、t_body = total − starttransfer。
  2. 网络 RTT 估计取 RTT_est = t_tcp(TCP 握手中客户端观测到的一个往返);服务端处理估计 t_server ≈ t_wait − RTT_est,可能为负(路径抖动、TLS 会话差异、协议差异),负值记 0 并置 t_server_clipped=true,公布 clipped 比例。t_server 必须以「估计」字样发布,不得作为平台内部耗时。
  3. 分位数而非均值:每条(平台, facet, 端点, 探针)序列报告 n、min、p50、p75、p90、p95、p99、p99.9、max。均值与标准差可作附列,禁止出现在头条与对比表。
  4. 分位数支持规则:只发布满足 n ≥ 10/(1−q) 的分位数。n = 43,200 支持到 p99.9;n = 2,880 只支持到 p99;n = 120 只支持到 p50 与全距。不满足者留空并注明「样本量不支持」,不得外推。
  5. 分位数区间用无分布假设的阶次统计量法:给定 n 与 q,j = ⌈nq − z√(n q (1−q))⌉、k = ⌈nq + z√(n q (1−q))⌉ + 1(z=1.96,钳制到 [1, n]),区间取排序样本的 x_(j) 与 x_(k)。该法对同一数据确定,可被第三方逐位复算。
  6. 删失处理:超时样本以 timeout_ms 计入排序序列并标 censored;若删失比例为 c,则所有 q > 1 − c 的分位数只能作为下界发布,写作「≥ timeout_ms」。绝不把超时样本从延迟分布中删除——删除会让最差的体验凭空消失。
  7. 失败与延迟分离:延迟分位数只在 OK(含 DEGRADED_SLOW)样本上计算,且必须与同期失败率并列发布——一个快速返回 5xx 的平台在只看延迟时会显得很快。
  8. 跨探针聚合规则:禁止把各探针原始样本混池后算全局分位数(那是在按样本量给不同网络路径加权)。规范做法是先算每探针分位数,再报告跨探针中位数与 min–max 包络,并逐探针公布明细;混池数字若发布必须明确标注为次要口径。
  9. 冷连接声明:主序列每次重建连接,测得的是冷连接延迟,系统性高于使用连接池的真实客户端;另设一条 C 档复用连接序列作对照,公布两者差值,让读者知道这个偏差有多大。
  10. 按 UTC 小时分箱(24 箱)报告 p50/p95,暴露日内规律(地区高峰、平台批处理窗口);这一分层比一个全窗数字信息量大得多。
Quantity measured
t_server_est = (time_starttransfer − time_appconnect) − (time_connect − time_namelookup);分位数区间的 j/k 见步骤 5;分位数支持规则 n ≥ 10/(1−q);尾部粗描述量 tail_ratio = p99/p50。
Fixed parameters
z = 1.96;超时 15 s(REST)/ 30 s(HTML);分位数集合 {50, 75, 90, 95, 99, 99.9};UTC 小时分箱 24;主序列不复用连接、固定 HTTP 版本与地址族。
Sample size
A 档每探针每端点 43,200 样本、6 探针合计 259,200;每条序列的 n 必须与分位数同时发布;UTC 小时分箱后每箱 1,800 样本/探针,支持到 p99。
Control
同槽对 canary 做同样计时,给出该探针该时刻的路径基线;平台延迟必须与 canary 延迟并列呈现,读者可自行扣除路径成分。复用连接对照序列用于量化冷连接偏差。
Statistical treatment
阶次统计量区间为主;跨探针用中位数与包络而非平均;分布形态以 ECDF 发布(附 1,000 个等分位点的原始数据),不用箱线图掩盖尾部;重尾比较用 p99/p50;不对重尾延迟用 t 检验或均值差。
Reproducibility check
发布每条序列的 ECDF 采样点(≥1,000 等分位点),第三方可对任意分位数与区间逐位复算;curl 版本、TLS 库版本、内核版本随 probes.csv 发布,因为握手耗时对这些敏感。
Known pitfalls
用均值或「平均响应时间」;跨探针混池;剔除超时样本;把 t_server 当平台内部耗时公布;忽略响应体大小差异直接比 t_total;忽视 DNS 本地缓存使 t_dns 在多数样本上接近 0。
Risk
提高采样频率能改善分位数精度,但会逼近平台限额;速率上限(≤ 公布限额的 10%)优先于统计精度,宁可少测也不越限。

SUPPORTS / 一个把网络路径、握手、服务端等待与传输体积分开的延迟画像,以及一套只发布样本量能支撑的分位数、每个分位数都带无分布假设区间、并与同期失败率强制并列的报告纪律。

DOES NOT SUPPORT / 不能确立撮合速度或成交质量——我们测的是公开端点的响应时间,不是订单进入撮合引擎后的排队与成交延迟(那属于执行质量基准)。不能确立平台内部处理耗时(t_server 是含排队与协议差异的估计量)。不能确立普通用户的体验延迟(探针在数据中心、冷连接、无浏览器渲染与前端 JS 开销)。也不能把跨平台延迟差异归因于工程优劣——端点重量、响应体大小与 PoP 位置的差异往往大于平台差异。平台公布的「低延迟」「毫秒级撮合」等文档表述在此无任何证据价值:它们既无测量口径也无样本量,无法与本序列对齐比较。

EVIDENCE RETAINED / latency_ecdf.csv 各序列 ECDF 采样点 · summary.csv 分位数与区间 · 冷连接 vs 复用连接对照序列 · canary 同槽路径基线 · UTC 小时分箱表
RECORDED FIELDS (20)
  • t_dns_ms / ms / 受本地解析缓存影响,须单列并声明缓存策略
  • t_tcp_ms / ms / TCP 握手,约等于一个网络 RTT
  • t_tls_ms / ms / TLS 握手耗时
  • t_wait_ms / ms / 握手完成到首字节,含服务端处理与一个 RTT
  • t_body_ms / ms / 首字节到传输完成
  • t_total_ms / ms / 端到端总耗时
  • rtt_est_ms / ms / = t_tcp_ms,网络往返估计
  • t_server_est_ms / ms / 估计量而非测量量;含排队与协议差异
  • t_server_clipped / bool / 估计为负被截断到 0
  • resp_bytes / bytes / 响应体大小,用于区分「慢」与「大」
  • reuse_conn / bool / 主序列 false,对照序列 true
  • n / count / 汇总表:该序列样本数
  • p50_ms / ms / 汇总表:中位数
  • p95_ms / ms / 汇总表
  • p99_ms / ms / 汇总表;n < 1,000 时留空
  • p999_ms / ms / 汇总表;n < 10,000 时留空
  • ci_lo_ms / ms / 阶次统计量区间下端
  • ci_hi_ms / ms / 阶次统计量区间上端
  • quantile_supported / bool / 是否满足 n ≥ 10/(1−q)
  • utc_hour_bin / count / 0–23 分箱
SPECIFICATION
AVAIL-07

状态页与公告对账:文档证据能确立什么

  1. 逐平台登记公开的状态页、公告渠道与不需登录的应用内通知,以 300 s 间隔抓取快照,保存 HTML 与 SHA-256,并解析出结构化条目:组件名、状态、开始时间、结束时间、公告发布时间、正文。
  2. 时间口径统一为 UTC;平台以本地时区或相对时间(如「2 hours ago」)表述的,记录原文并标 time_inferred=true。
  3. 计算三个对账量:公告覆盖率 announced_coverage = |我方判定不可用时间 ∩ 平台已公告时间| / |我方判定不可用时间|;公告提前量 lead_time = 公告发布时刻 − 事件开始时刻(负值即事后补告,单独统计其占比);影子公告率 phantom_rate = |平台公告受影响但我方观测全 OK 的时间| / |平台公告受影响时间|。
  4. 计划维护的处理(规范立场,必须在报告中显式声明):计划维护不从可用性分母中扣除——用户在维护期同样无法使用服务,SLA 排除维护是合同口径而非可用性事实。同时并列发布 A_excl_maintenance(仅扣除事前公告的维护)以便与平台自报口径对话;仅当 lead_time > 0 才算事前公告,事后补告不得据此扣减。
  5. 把状态页本身作为一个 F1 类被测端点纳入观测——状态页在事故中不可用,是一个可测且有意义的观测量。
  6. 对账结果以「平台说了什么 vs 我们观测到什么」的双时间轴呈现;冲突处不做动机推断,只陈述差异与各自证据来源,并同时给出我们的快照哈希与平台当前页面的差异。
  7. 状态页组件粒度与我们的 facet 通常不对齐(平台的「Trading」可能同时含 F2/F4),须显式建立并公布映射表;映射不确定处标 mapping_uncertain=true 并排除出定量对账。
Quantity measured
announced_coverage、lead_time、phantom_rate 见步骤 3;A_excl_maintenance = 1 − (Σ d_e − Σ d_e∩事前公告维护) / (T − Σ 事前公告维护时长)。
Fixed parameters
快照间隔 300 s;事前公告判据 lead_time > 0;对账时间容差 ±Δ(与采样粒度一致),容差内的错位不计为不一致;只抓公开页面,遵守 robots.txt,429 即停。
Sample size
5 平台 × 30 天 × 288 次/日 = 43,200 次状态页快照;公告条目全量结构化;对账在 facet 级与事件级各做一遍。
Control
状态页抓取同样接受 canary/对照端点的同槽校验;状态页常由第三方服务托管,须单独记录其 ASN,避免把状态页的可用性混入平台可用性。
Statistical treatment
覆盖率与影子率按比例的 Wilson 区间报告,且以事件为单位而非以槽为单位,避免自相关放大;lead_time 报中位数与四分位数,不报均值——补告的负值会把均值拖成无意义的数。
Reproducibility check
全部状态页快照与哈希随数据集发布;第三方可对同一快照集重跑解析与对账脚本;解析规则(选择器/正则)随 signatures.json 发布并版本化,映射表单独发布。
Known pitfalls
状态页的「已解决」时间常被回填或编辑,只信当时快照;组件粒度与 facet 不对齐却强行对账;抓取频率过高触发状态页服务限流;把「平台未公告」直接叙述为「平台隐瞒」——数据只支持「未见公告」。
Risk
只抓取公开页面,遵守 robots.txt,429 即停;不抓取需登录的应用内通知;不对平台工单或客服系统做任何自动化访问。

SUPPORTS / 量化「平台的自述」与「独立观测」之间的差距,给出可复算的公告覆盖率、提前量与影子公告率;并把计划维护的处理方式从隐含假设变成显式声明、双口径并列的选择。

DOES NOT SUPPORT / 状态页与 SLA 文档不能确立实际可用性——它们确立的只是「平台在某时刻对外说了什么」。文档类证据无法确立:事件的真实起止(平台可事后编辑,我们只能凭快照哈希证明看到过某个版本)、受影响用户比例、故障根因,以及未被公告的事件是否存在(不公告在数据上等价于沉默,不能反推为无事故)。反向同样成立:我们的观测不能证明平台公告有误,只能证明二者不一致,并把两份证据并列摆出。任何把「平台承诺 99.9%」当作可用性证据的做法,都是把承诺误当测量。

EVIDENCE RETAINED / announcements.csv 结构化公告表 · 状态页快照与逐份哈希 · 组件→facet 映射表 · 双时间轴对账图的底层数据 · 状态页自身可用性序列
RECORDED FIELDS (17)
  • platform / / 被测平台
  • status_source_url / / 状态页/公告渠道 URL
  • snapshot_ts / ISO8601 UTC / 抓取时刻
  • snapshot_sha256 / SHA-256 hex / 该次快照 HTML 的哈希,用于证明我们看到过的版本
  • component / / 平台自定义组件名
  • component_facet_map / / 组件到 F1–F7 的映射;不确定处标记并排除
  • announced_state / enum / 平台自报状态原文归一化后的枚举
  • announced_start_ts / ISO8601 UTC / 平台声称的开始时刻
  • announced_end_ts / ISO8601 UTC / 平台声称的结束时刻
  • announced_publish_ts / ISO8601 UTC / 公告发布时刻,决定 lead_time 正负
  • time_inferred / bool / 时刻由相对时间换算而来
  • raw_time_text / / 平台原始时间表述,保留以便复算
  • announced_coverage_ratio / ratio / 事件级;0–1
  • lead_time_min / min / 带符号;负值为事后补告
  • phantom_rate_ratio / ratio / 0–1
  • maintenance_prior_announced / bool / lead_time > 0 才为 true
  • statuspage_self_availability_ratio / ratio / 状态页自身的可用率(0–1)
SPECIFICATION
AVAIL-08

不确定度、自相关与 30 天窗口的推断力

  1. 计算朴素二项区间(Wilson,95%)作为参照但不作头条:区间 = (p̂ + z²/2n ± z√(p̂(1−p̂)/n + z²/4n²)) / (1 + z²/n)。
  2. 估计自相关:对 facet 级 0/1 失败序列算自相关函数 ρ_k;块长 L 取「ACF 首次跌破 0.1 的滞后」与「事件时长 p95 的 2 倍」的较大者,且不小于 3,600 s。块长与 ACF 图随数据集发布。
  3. 头条区间用移动块自助法:块长 L、重采样 10,000 次、固定并公布随机种子,取 2.5%/97.5% 分位数为 95% 区间;同时公布设计效应 DEFF = Var_block / Var_binomial 与有效样本量 n_eff = n / DEFF。DEFF 通常远大于 1,这就是朴素区间失效的量化证据。
  4. 零故障情形不写「100% 可用」:按块级三法则给单侧 95% 上界,不可用比例 ≤ 3 / n_blocks。设计推导示例(非实测):30 天、1 小时块 → n_blocks = 720,上界 0.417%,即「可用性 ≥ 99.58%(95% 单侧)」;而朴素按分钟样本(n = 43,200)算得 ≥ 99.9931%。二者相差恰好 60 倍,必须并列公布以展示自相关的代价。
  5. 事件率区间:以泊松处理事件计数 k 与暴露时长 T,用 Garwood 精确区间;k = 0 时单侧 95% 上界 λ ≤ 3/T。设计推导示例(非实测):T = 30 天 = 0.0822 年 → λ ≤ 36.5 次/年。结论必须写进方法页:一个完全干净的 30 天窗口,与「每年多达约 36 次事故」在 95% 置信下并不矛盾。
  6. 反向功效计算,每次发布必须给出:零事故时若要把年事故率上界压到 λ ≤ 4 次/年,需 T ≥ 3/4 年 ≈ 9 个月连续观测;若要把可用性区间收窄到能区分 99.9% 与 99.99%(半宽 0.045 个百分点),在小时块近似独立的假设下需 n ≥ z²p(1−p)/w² ≈ 18,950 个小时块 ≈ 2.16 年。因此:30 天窗口在统计上无法区分「三个 9」与「四个 9」,任何由 30 天数据推出的年化可用性等级都是修辞而非测量。
  7. 窗口代表性:窗口须在开始前预注册;报告必须给出窗口期的市场波动协变量(用与被测平台无关的公开参考价格序列计算的已实现波动率,记录来源 URL、抓取时间与哈希),并给出该窗口波动率在过去 12 个月中的百分位。故障与波动高度相关,窗口不是年的随机样本,这一事实必须让读者看到。
  8. 长期哨兵:主窗口结束后保留一条 Δ = 300 s 的低频序列长期运行(约每月 €10 量级),累积 6–12 个月后发布年度补编。这是唯一能真正改善年化推断的手段,不是统计技巧。
  9. 精度纪律:有效数字不得超过区间支撑的位数。若区间半宽 0.4 个百分点,写「99.6%(95% CI 99.2–100%)」,不得写「99.5738%」;禁止「N 个 9」式表述。
Quantity measured
Wilson 见步骤 1;DEFF = Var_block/Var_binomial;n_eff = n/DEFF;零故障块级上界 = 3/n_blocks;泊松单侧上界 λ ≤ 3/T;功效反算 n ≥ z²p(1−p)/w²。
Fixed parameters
z = 1.96;块长下限 3,600 s;自助 10,000 次并公布种子;主窗口 30 天(UTC 对齐、预注册);哨兵 Δ = 300 s、目标 ≥180 天;所有区间为 95%。
Sample size
主窗口 30 天;块长 ≥3,600 s → n_blocks ≤ 720;自助重采样 10,000 次;哨兵目标 ≥180 天。步骤 4–6 的全部数值均为基于所述假设的设计推导,不是任何平台的实测结果。
Control
对 canary 序列做完全相同的统计处理——canary 的区间就是「在一个完美平台上我们能得到的最好结果」,为读者提供衡量本基准分辨率的尺子。
Statistical treatment
比例类用移动块自助法(头条)+ Wilson(参照);计数类用 Garwood 泊松精确区间;分位数用阶次统计量区间;跨 5 平台 × 多 facet 若做显著性表述,须用 Holm 校正并公布原始 p 值,未校正时必须声明未校正。
Reproducibility check
统计脚本、随机种子、块长选择规则与 ACF 原始数据全部发布;第三方在发布的 samples/events 表上重跑必须复现同样的区间到最后一位;功效计算作为一个独立的小脚本发布,读者可代入自己的窗口长度重算。
Known pitfalls
用朴素二项区间做头条;把 30 天数字乘以 12 得年化;把「未观测到事故」写成「没有事故」;看过数据后调整窗口或阈值(预注册正是为了防这个);对重尾延迟用 t 检验;把多平台比较的显著性当作可靠性排名。
Risk
统计口径的选择本身会影响结论,因此口径必须在看数据之前固定并公开;窗口内任何口径变更都要求全窗重跑并 bump 版本号,旧版本永久保留。

SUPPORTS / 让每个可用性数字都带上一个考虑了故障成簇的诚实区间;并把「这个窗口能排除什么、不能排除什么」变成可计算、可发布、可被读者代入自己参数重算的陈述。

DOES NOT SUPPORT / 不能确立年化可用性,不能支持任何 SLA 等级判定,不能支持「平台 A 比平台 B 更可靠」的一般性结论——只能支持「在本窗口、本 facet、本口径下二者的观测差异及其区间」。不能确立未来表现:过去 30 天对下一次事故没有预测力,尤其当事故由发版、迁移或极端行情触发。平台公布的 SLA、可用性承诺与年度可靠性报告在这里同样无能为力:承诺不是测量,年报是自述且口径不可复算,二者都无法用来收窄我们的区间,也无法被我们的区间证伪。

EVIDENCE RETAINED / ACF 图与块长选择记录 · 自助法脚本与随机种子 · 功效计算脚本及其输出 · 波动协变量序列与来源哈希 · 预注册文件与其公开时间戳
RECORDED FIELDS (20)
  • window_start_ts / ISO8601 UTC / 预注册的窗口起点
  • window_end_ts / ISO8601 UTC / 预注册的窗口终点
  • n_samples / count / 名义样本数
  • n_blocks / count / 块数
  • block_len_s / s / 块长及其选择依据
  • a_sample_ratio / ratio / 样本口径可用率(0–1)
  • ci_lo_ratio / ratio / 块自助法 95% 下端(头条口径)
  • ci_hi_ratio / ratio / 块自助法 95% 上端(头条口径)
  • wilson_lo_ratio / ratio / 朴素二项区间下端,仅作参照
  • wilson_hi_ratio / ratio / 朴素二项区间上端,仅作参照
  • deff / 系数 / 设计效应;>1 即朴素区间过窄
  • n_eff / count / 有效样本量 = n/DEFF
  • incident_count / count / 窗口内确认事件数
  • exposure_days / d / 泊松暴露时长
  • lambda_hi_per_year / 次/年 / 事件率单侧 95% 上界
  • zero_failure_bound_ratio / ratio / 零故障时的块级三法则上界
  • vol_covariate_source / / 独立参考价格序列的 URL 与哈希
  • vol_percentile_12m / 百分位 / 窗口波动率在过去 12 个月中的位置
  • bootstrap_seed / count / 随机种子,复现必需
  • acf_lag_threshold_s / s / ACF 跌破 0.1 的滞后
SPECIFICATION
AVAIL-09

数据集打包、校验与发布

  1. 按固定目录结构产出(全部 UTF-8、UTC、ISO 8601 毫秒精度):probes.csv、endpoints.csv、samples.parquet + samples.csv.gz、states.csv、events.csv、announcements.csv、latency_ecdf.csv、summary.csv、signatures.json、preregistration.md、raw/(响应头 + 正文前 8 KB,按日打包并逐包哈希)、MANIFEST.json。文件名统一前缀 axp-avail-v1_。
  2. MANIFEST.json 记录:规范版本 AXP-AVAIL-v1.<minor>.<patch>、窗口起止、每个文件的 SHA-256 与字节数与行数、采集工具版本与容器镜像 digest、签名表版本、随机种子、许可证、生成时刻与生成脚本 Git 提交哈希。MANIFEST 自身的 SHA-256 印在方法页正文中,并可对该哈希做公开时间戳锚定。
  3. 缺失值约定(须在数据字典中逐列重申):CSV 空串 = 未采集/未尝试;NA = 已尝试但无法归类;NR = 因红线规则主动不测(如需要解验证码的场景)。数值列不得用 0 或 −1 表示缺失;布尔列取 true/false,不得用 1/0。
  4. 单位以列名后缀显式给出:_ms、_s、_min、_bytes、_ts(ISO 8601 UTC)、_ratio(0–1 小数)、_count。百分比只出现在展示层,数据层一律用 _ratio。
  5. 隐私与最小化:只采集公开端点;原始归档中对 Set-Cookie、Authorization 及任何会话标识做不可逆哈希替换;F6 的账户标识与订单号按窗口盐值哈希;不发布住宅探针的 IP,只发布 ASN 与国家。
  6. 许可与引用:数据集 CC BY 4.0,采集与分析代码 MIT,方法页 CC BY 4.0;给出建议引用格式,并在归档服务(如 Zenodo)取得 DOI。
  7. 版本策略:patch = 分类规则或脚本修复并全窗重跑;minor = 新增字段或新增 facet,向后兼容;major = 口径变更导致历史数据不可比。旧版本永久保留可访问,变更日志逐条说明「改了什么、为什么、影响了哪些已发布数字」。
  8. 复现包:提供单命令复现路径(拉取固定 digest 的镜像、挂载 endpoints.csv 与 signatures.json、指定窗口,对发布的 raw/ 归档重跑出全部派生表),README 中给出各派生表的预期 SHA-256。发布前由未参与采集的成员从零走一遍并比对哈希。
  9. raw/ 体量控制:若超出存储预算,按「全部非 OK 样本 100% 保留 + OK 样本 1/50 分层抽样」压缩,抽样规则与种子写入 MANIFEST;绝不对稀有事件抽样。
Fixed parameters
正文截断 8 KB;raw 分层抽样比 1/50(仅对 OK 样本);哈希算法 SHA-256;时间精度毫秒;比例列值域 [0,1]。
Sample size
单窗口 samples 行数量级 10^6–10^7,Parquet 压缩后约数百 MB;raw/ 按日分包,8 KB 截断下每日数 GB 上限,必要时按步骤 9 抽样;ECDF 每序列 ≥1,000 等分位点。
Control
发布前的独立复算:由未参与采集的成员按 README 从零复现一次,比对每张派生表的输出哈希;不一致即阻断发布。
Statistical treatment
raw 分层抽样必须保证所有非 OK 样本 100% 保留,避免抽样把稀有事件抽没;抽样比例作为已知设计参数写入 MANIFEST,任何基于 raw 的重算须按该比例还原权重。
Reproducibility check
见步骤 8:单命令从 raw/ 重跑全部派生表,逐表比对 README 中给出的预期 SHA-256;第三方无需联系我们即可完成全流程。
Known pitfalls
用 Excel 打开 CSV 会破坏长数字与时间戳(以 Parquet 为准、CSV 为镜像,并在数据字典中警告);比例与百分比混用;发布时忘记同步 signatures.json 版本导致分类不可复现;把 raw 抽样规则写在正文而不写进 MANIFEST。
Risk
发布前必须完成脱敏审查;F6 相关记录若无法充分脱敏,宁可不发布原始行,只发布聚合量并说明原因;不得发布任何可定位到团队成员住宅线路的标识。

SUPPORTS / 一个第三方无需联系我们即可下载、校验、重跑并逐位复算的开放数据集,以及一条从原始响应到发布数字的完整可审计链路。

DOES NOT SUPPORT / 数据集本身不能确立我们采集时诚实——校验和只能证明发布后未被篡改,不能证明发布前未被挑选。对抗这一点的手段是窗口前预注册、非 OK 样本 100% 全量归档、以及第三方用同一镜像自行采集一个平行窗口;这些手段的存在与各自的局限都必须写进方法页,而不是靠「我们公开了数据」一句话带过。DOI、许可证与哈希都属于文档类证据:它们确立可追溯性与完整性,不确立测量本身的正确性。

EVIDENCE RETAINED / MANIFEST.json 及其哈希 · preregistration.md 与公开时间戳 · raw/ 原始响应归档 · 复现镜像 digest 与 README 预期哈希 · 变更日志与历史版本存档
RECORDED FIELDS (15)
  • file_name / / MANIFEST 条目
  • sha256 / SHA-256 hex / 文件哈希
  • bytes / bytes / 文件大小
  • rows / count / 表行数(非表格文件为空)
  • spec_version / / AXP-AVAIL-v1.<minor>.<patch>
  • signature_table_version / / 分类签名表版本
  • image_digest / / 采集/分析容器镜像 digest
  • git_commit / / 生成脚本提交哈希
  • window_start_ts / ISO8601 UTC / 窗口起点
  • window_end_ts / ISO8601 UTC / 窗口终点
  • license / / 数据 CC BY 4.0 / 代码 MIT
  • doi / / 归档服务分配的 DOI
  • missing_convention / / 空串 / NA / NR 的含义声明
  • raw_sampling_rule / / raw 抽样规则;非 OK 样本 100% 保留
  • raw_sampling_seed / count / 抽样随机种子
SPECIFICATION
RPT

Reporting rules for this benchmark

How results from this protocol may and may not be described once a dataset exists. Author: Axial Proof Editorial Team. Independent reviewer: Axial Proof Review Team.

CONSTRAINTS

每个数字的强制随附项:窗口起止(UTC)、探针数与 ASN 分层构成、采样间隔 Δ、计数口径名、facet 名、覆盖率、区间及其方法、规范版本号。缺任一项即不得发布该数字。 禁止事项:①禁止年化,禁止把 30 天数字乘以 12;②禁止「N 个 9」式表述与 SLA 等级判定;③禁止发布不带 facet 限定词的「平台可用率」;④禁止用均值延迟,禁止把跨探针混池的全局分位数作头条;⑤禁止发布样本量不支持的分位数(n < 10/(1−q) 一律留空);⑥禁止把「我方被限流/被挑战」表述为平台故障,同样禁止把它藏起来——单列「自致与访问性事件」表;⑦禁止把 NA(不可观测)呈现为正常;⑧禁止在看过数据后调整窗口、阈值或分类规则;⑨禁止把 t_server 估计量表述为平台内部处理耗时;⑩禁止对未公告事件做动机推断,数据只支持「未见公告」。 必须公布:canary 噪声底(任何优于噪声底的可用性声明降级为「不低于噪声底」);三种计数口径的并列结果,不得只报最有利的一种;挑战率按 DC/RES 分层;删失比例与覆盖率;窗口期波动协变量及其 12 个月百分位;朴素 Wilson 与块自助法区间的并列对比与 DEFF;κ 与双人编码分歧样本。 精度纪律:有效数字不得超过区间支撑的位数(半宽 0.4 pp 就写 99.6%,不写 99.5738%);事件时长不得报到比 Δ 更细的粒度,一律带 ±Δ。 跨平台比较:只在同一 facet、同一口径、同一响应体量级下进行,并必须同时列出各平台的挑战率、排除率与覆盖率;比较结论只能限定在「本窗口内的观测差异及其区间」,不得延伸为可靠性排名。 欧盟语境的写法:可以指出可用性观测在 MiCA/DORA 框架下具有事实层面的意义(CASP 的 ICT 韧性与事件报告义务),但一律使用固定免责句式:「本基准测量的是可观测的公开端点行为,不构成对该平台在 MiCA、DORA 或任何其他框架下合规状态的认定。」不做法律定性,不引用监管条款来给平台定级,不把观测到的中断表述为违规。 因果与损害:不写「平台宕机导致用户损失」这类因果断言;只陈述观测到的状态、时间与不确定度。故障归因(平台侧 vs 上游 CDN vs 传输网络)一律标注为不可确立,共因标记只用于排除,不用于定因。 更正与版本:任何分类规则或统计口径变更 → bump 版本号 + 全窗重跑 + 变更日志逐条说明受影响的已发布数字 + 旧数据集永久保留可访问。方法页顶部固定展示当前版本与 MANIFEST 哈希。 被测方回应:平台若提出异议,回应以数据集为准并公开往来要点;不因回应而修改已发布数据,只能新增版本或勘误条目,且必须说明改动的技术理由而非商业理由。