验证类型:真实本机回环 HTTP 应用交互,加独立离线 Age/304 检查;不是生产缓存或 CDN 验证。 运行:python3 lab.py > run.jsonl;默认同时运行自检与真实实验。--self-check 不开网络。 环境:macOS-27.0-arm64-arm-64bit-Mach-O,Python 3.14.4;源站 127.0.0.1:52025,缓存 127.0.0.1:52026。端口每次运行重新分配。 最终运行 exit 0;13 个下游响应均为 200,源站实际请求 9 次。 冷请求 origin 0→1;有效命中 1→1。 第一次过期的 current_age=3.7584840020281263 秒,上游 304,无正文;缓存保留“你好 v1”正文并向无条件下游返回 200。 修改源站版本后再次过期,current_age=3.8828334822901525 秒,上游 200,正文更新为“你好 v2”。 英语变体“hello v2”与缺失 Accept-Language 的“default v2”分别冷取;英语、缺失、中文三次后续命中均不增加源站计数(5→5)。缺失字段键为 null,不映射为 en。 no-cache 首次 200 存储,随后即使 age 约 0.902 秒仍验证,上游 304、源站计数 6→7,正文保留。 no-store 两次均上游 200,源站计数 7→8→9,均不存储。 run.jsonl 保存每次上下游头、正文 hex、实际源站请求头与计数、Age 全部计算输入及决策。源站日志中的 304 body_hex 为空;下游真实收到的 headers/body 独立保存。 Age 使用墙钟解析 Date、单调时钟测 response_delay/resident_time;公式 max(max(0,response_wall-Date),Age+response_delay)+resident_time。仅 max-age>age 新鲜。源站 Date 秒精度使刚存储 age 也可非零。 两次等待目标为已存储 response_mono+3.1 秒,真实单调等待,不伪造过期。服务串行处理请求;驱动仅在上一次完整响应之后修改源站版本。 缓存使用 send_response_only 并转发保存的 Date,命中不自动生成新的 Date;304 精确匹配已存储 ETag 后合并头、更新 Age 输入、保留原正文。 初次真实运行因 HTTPConnection 不支持 context manager 抛 TypeError,finally 停止服务线程;修为 contextlib.closing 保证关闭连接。最终 run.jsonl 仅保留修复后完整成功轮。 --help exit 0;--self-check exit 0;--invalid exit 2。Python no-excuse checker:no violations in 1 file(s)。git diff --check 通过。LSP basedpyright 未安装且不安装,不声称类型检查通过。 离线自检:corrected_age=5,apparent-age 主导例=3.5,age 恰等 max-age 时 stale,匹配 304 保留正文,ETag 不匹配 304 拒绝。离线数值不冒充网络实测。 清理:owned_threads_stopped=true、owned_servers_closed=true;仅两个本脚本服务及其连接,无宿主 DNS/路由更改。 边界:固定 GET、固定三个路径、固定上游;Vary 仅 Accept-Language,取原始 zh/en/缺失字段。仅单个强 ETag 精确匹配,不实现弱比较、列表、通配符或完整 If-None-Match 语义。下游限定无条件请求。无参数 no-cache 与 no-store 为受控响应指令子集。 没有验证认证、Range、启发式缓存、陈旧故障回退、请求指令、共享代理安全、并发请求合并或生产吞吐。教学代码不等于完整 RFC 合规实现。 本次核查:https://www.rfc-editor.org/rfc/rfc9111.html §4.2.3/4.3.4;https://www.rfc-editor.org/rfc/rfc9110.html §13.1.2。