{
 "date": "2026-10-25",
 "timezone": "Asia/Shanghai",
 "issue": 52,
 "batch": "U15",
 "sourceTags": "OpenJDK jdk-17.0.12+7（NioSocketImpl.java L584-L627 / SSLSocketImpl.java L1684-L1712、L1715-L1728 / InetAddress.java L1161-L1174 摘录基线）；运行 JDK 为 Oracle JDK 17.0.12+8-LTS-286，构建号不同，不把运行说成源码 tag 实测。内核协议行为引用 RFC 9293/6298/8446、tcp(7)、resolv.conf(5)，不伪造内核源码摘录",
 "environment": {
  "os": "macOS 26.7.1 (25G241, x86_64)",
  "architecture": "x86_64",
  "jdk17": "Oracle JDK 17.0.12+8-LTS-286（/Library/Java/JavaVirtualMachines/jdk-17.jdk；/usr/libexec/java_home -v17 解析到 GraalVM，实验显式 JAVA_HOME，沿用 U14 口径）",
  "docker": "本机无容器运行时（U14 已确认，未重复探测）——Linux 专属行为（tcp_retries*/tcp_tw_reuse/ip_local_port_range、resolv.conf/nsswitch、backlog 溢出）按 man/内核文档推导并逐项标注未实跑",
  "runPolicy": "调用方 perl alarm 90-300 秒上限；run.py 十五模式（budget/tcp/selector/http/dns + U15 四模式 tcpstates/tls/reuse/dnschain + thread/signal/fd/mem/perm/disk）；唯一 TemporaryDirectory 自动清理；tls 模式的 keytool 材料只写入临时目录，不触系统钥匙串/cacerts；所有监听与连接仅在 127.0.0.1，good.test/bad.test/chain.test 为 JVM 私有 hosts 文档名"
 },
 "tdd": {
  "redGreen": [
   "红1（『RFC 5737 文档地址 192.0.2.1 是安全黑洞、可作连接超时实验』）：ConnSpike 向 192.0.2.1:64444 发起 Socket.connect(900ms) 实测连接完成（本机 192.168.5.0/24 网关+运营商对该地址有响应）——文档地址在真实网络不保证不可达；绿：连接超时路径从实验降级为 NioSocketImpl.java L584-L627 源码推导 + JDK 手册引用，正文与 README 逐项标注未实测，并把该反例写成教学内容。",
   "红2（『JDK HttpClient 可手动设置 Connection 头控制复用』）：ConnSpike setHeader(\"Connection\",\"close\") 实测 IllegalArgumentException: restricted header name；绿：断连控制权在服务端响应头（实测服务端 Connection: close 后下一请求 accept 计数 1→2），restricted 头规则与 jdk.httpclient.allowRestrictedHeaders 记入正文。",
   "红3（『客户端 keep-alive 即可复用连接』）：首版服务端每连接只服务一个请求，3 请求实测 3 次 accept——复用需要服务端循环读多请求；绿：改为每连接循环服务后 3 请求 1 次 accept，reuse-keepalive 断言 accepts==1 与服务端断连后 ==2。",
   "红4（『Remote host terminated the handshake = 对端 TLS 配置错误』）：TlsSpike 初版未禁用系统代理，对主机名请求被本机代理（127.0.0.1:7897）CONNECT 截获后报同一句；绿：HttpClient 显式 .proxy(ProxySelector.of(null)) 后四案例全部按预期分类，正文把该消息定为『不指认根因的兜底话』并给出排障顺序（与 SSLSocketImpl.handleEOF 摘录呼应）。",
   "红5（『TIME_WAIT 归属可按预期指定』）：TWSpike2 首版服务端读完单字节立即 close，抢到主动关闭使服务端进 TIME_WAIT、客户端端口立即重绑定成功；绿：改为服务端读到 EOF（FIN）再关闭的被动顺序后，客户端端口稳定呈现 TIME_WAIT、无 REUSEADDR 重绑定 EADDRINUSE/设后成功；TIME_WAIT 归属由『谁先发 FIN』决定的口径改写为可判定断言。"
  ],
  "devFixes": "开发期修复如实记录不计红绿：(1) ConnectionProbe 'null' 信任库参数被当作文件路径打开（FileNotFoundException）且非 daemon 的 accept 线程挂住 JVM——改字面量 'null'=默认信任库并全部改 daemon 线程池；(2) javax.net.debug 输出走 stderr 而非 stdout（JDK 17），runner 改合并扫描；(3) keytool 子命令需带 '-' 前缀（-genkeypair），首版无杠被 keytool 拒绝；(4) run.py 分发把新 U15 模式落进 OsNetworkLab 通用分支（Unknown case），补 U15_MODES 排除；(5) 过期证书首版为自签名导致 PKIX 在有效期检查前失败（path building failed），改为 lab CA 签名的过期链；(6) reuse 服务端处理 /bye 后 return null 终止整个 accept 循环导致后续请求挂起，改 break 单连接。这些是脚本/断言缺陷不是误解断言。",
  "noFakeRed": "五次红均为先按常见认知写下预期后被 macOS 实测推翻（TEST-NET 黑洞、Connection 头可设、客户端单侧复用、握手消息单一根因、TIME_WAIT 归属指定），随后按实测/源码修正转绿，不倒造 red。"
 },
 "runs": [
  {
   "name": "all-final",
   "command": ["python3", "labs/os-network/run.py", "all"],
   "env": {"JAVA_HOME": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home"},
   "startedLocal": "2026-10-25 12:5x (Asia/Shanghai, perl alarm 300s)",
   "timedOut": false,
   "exit": 0,
   "stdoutSummary": "十五模式 28 条 PASS：U12 八条（budget/tcp/selector/http/dns×3）与 U14 六条（thread/signal/fd/mem/perm/disk）原样复跑全绿；U15 新增 tcpstates（TIME_WAIT netstat 行+重绑定 denied/ok+CLOSE_WAIT x3+半开 reset+keepalive 选项）、tls 五案例（200/PKIX path building failed/validity check failed/No subject alternative/debug 握手分段）、reuse（3请求1accept/受限头拒绝/服务端断连 accepts=2/HttpTimeoutException ~723ms/拒绝 ~3ms）、dnschain（hosts 命中/missing 失败/缺失文件点名/scutil resolver#1=192.168.5.1/dscacheutil localhost=127.0.0.1）全绿。",
   "tmpLeft": 0,
   "stabilityNote": "TIME_WAIT 时长（独立 spike ~32.6s）、CLOSE_WAIT 计数、netstat/sysctl 数值、HttpTimeoutException/拒绝时延均为 macOS 单机观察值非契约；断言只压状态、异常类与方向阈值（>=3 CLOSE_WAIT、elapsed 600-3000ms、refused<2000ms）。FIN/EOF、linger0→reset、TIME_WAIT 重绑定规则、SIGKILL→RST、四类 TLS 失败分类、受限头拒绝、hosts 缺失语义为内核/协议/JDK 行为断言。"
  },
  {
   "name": "mode-first-greens",
   "command": [["python3", "labs/os-network/run.py", "tcpstates"], ["python3", "labs/os-network/run.py", "tls"], ["python3", "labs/os-network/run.py", "reuse"], ["python3", "labs/os-network/run.py", "dnschain"]],
   "env": {"JAVA_HOME": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home"},
   "exit": 0,
   "note": "2026-10-25 12:2x–13:0x 四新模式独立直跑各 exit 0（tls 在红4/开发修复后转绿；tcpstates 在红5/开发修复后转绿）"
  },
  {
   "name": "spikes",
   "command": ["/tmp/u15-spike 一次性 spike：Spike1/2（TIME_WAIT rebind denied/ok、netstat 行格式）", "Spike3/4（linger0 RST、SIGKILL 未读数据→Broken pipe/Connection reset）", "TlsSpike 系列（keytool -startdate -400d 过期链、四案例分类、代理红4）", "ConnSpike 系列（refused 22ms→3ms、TEST-NET 红1、reuse 红2红3、HttpTimeoutException 706-723ms）", "TWSpike（TIME_WAIT_GONE_AFTER_MS=32645, polls=16）", "ResolveProbe（hosts 缺失→UnknownHostException 点名文件路径）"],
   "exit": 0,
   "note": "一次性 spike 目录 /tmp/u15-spike 于记录后定向删除；TIME_WAIT ~32.6s 与各时延数值进入正文时标注为 macOS 单机观察值"
  }
 ],
 "honesty": {
  "notAContract": "TIME_WAIT 存留时长（~32.6s macOS / Linux 60s 量级推导）、CLOSE_WAIT 计数、sysctl keepidle=7200000ms、connect refused ~3ms、request timeout ~723ms、解析耗时均为 macOS 26.7.1 单机观察值；Linux tcp(7) 参数（tcp_retries1/2、tcp_keepalive_time、tcp_tw_reuse、ip_local_port_range）、backlog 溢出行为、RTO/重传行为按文档推导未实跑。",
  "unreproducedScenarios": "真实递归/权威 DNS 查询、TTL 传播、DNSSEC、运营商劫持对照、内核 TCP 重传与拥塞、真实连接超时（本网络 TEST-NET-1 实测建连成功，见红1）、TLS 撤销检查（OCSP/CRL）、mTLS 客户端证书、0-RTT、HTTP/2 多路复用、连接池压测、中间 CA 缺失组合均未实跑，正文按 RFC 9293/6298/8446/6125、tcp(7)、resolv.conf(5) 与 jdk-17.0.12+7 源码推导并逐项标注。macOS 可观测对等物（环回状态机、netstat/sysctl、scutil --dns、dscacheutil、keytool 临时信任库、JVM 私有 hosts）已实跑。",
  "distinguishing": "模型/推导层：重传 RTO、backlog 溢出、Linux 参数、负缓存 TTL 来源（RFC 2308）、撤销策略、TEST-NET 建连成功的归因。真实组件层：Oracle JDK 17.0.12+8 于 macOS 的 socket/TLS/HttpClient 行为、macOS 内核状态机（netstat/sysctl/scutil）、keytool 证书链与 JDK PKIX 验证。二者在正文与账本中分开标注。"
 }
}
