自己从根开始迭代解析:example.com 3 问 757 ms(根 → com. → 权威),交给 1.1.1.1 递归只要 1 个查询;转介报文含 13 条 NS 和 11 条胶水并因 512 字节上限被截断;13 个根服务器往返从 7 到 280 ms(任播);www.bbc.co.uk 被抢先伪造应答(7.6 ms、两个矛盾答案、带 RA)。
实测 DNS 缓存:1.1.1.1 / 8.8.8.8 返回的 TTL 在 101~300 间乱跳(背后多个缓存节点,没有干净的倒数);.invalid 的 NXDOMAIN 负缓存 86400 秒,NODATA 的 SOA TTL 1800 秒;对公网解析器命中与否在 290 ms 往返里看不出(差 1 ms),但本机操作系统缓存把 getaddrinfo 从 80.9 ms 降到 0.3 ms。
逐类型取 DNS 记录的原始 RDATA 字节并手工解读:A 4 字节、AAAA 16 字节、CNAME 与 MX 后半截用压缩指针、TXT 带长度前缀、SRV 端口 993、CAA 只允许 pki.goog、PTR 反向名字、HTTPS 记录里的 alpn=h3,h2;ANY 在 1.1.1.1 上直接 NOTIMP。每个答案都和 8.8.8.8 交叉核对。
实测 DNS 的 512 字节限制与 EDNS0:不带 EDNS0 的根 DNSKEY 响应被截成 17 字节并置 TC,TCP 重问得 842 字节;OPT 记录 11 字节里藏着 1232 的载荷大小和 DO 位;TCP 新连接 612 ms 约为 UDP 285 ms 的两倍,线上 10 包对 2 包;1.1.1.1 对 2649 / 4689 字节的响应一律 TC,不产生 IP 分片。
自己从根信任锚验证 example.com 的 DNSSEC 签名链(8 环全部通过);RRSIG 的字段、签名有效期 50 小时、带签名的响应多约 107 字节;改一个地址 / 翻一个比特 / 过期后都会验证失败;dnssec-failed.org 在 1.1.1.1 与 8.8.8.8 上 SERVFAIL + EDE 9,加 CD 位则能取回;12 个常见名字里 4 个已签名。
实测 DoT 与 DoH:这台机器所在网络里 Cloudflare / Google / Quad9 / AdGuard 的加密 DNS 都连不上,只有阿里 223.5.5.5 可用;新建连接约 80 ms(UDP 的 7 倍),复用连接 8.6 ms;抓包看不到查询名但能看到 SNI;www.bbc.co.uk 经 DoT / DoH 拿到的仍是与明文同类的异常地址。
实测 macOS 怎么解析名字:按域名后缀在 7 个解析器里选(1 个单播、6 个 mDNS);AF_UNSPEC 也只发 A 查询(Request A records,没有 AAAA);单标签名字先加搜索域 lan 再问裸名字;localhost 不发 DNS;.local 走 224.0.0.251 的 mDNS,查不到要等 5002 ms。
手工拆解 HTTP/1.1 报文:56 字节的请求、928 字节的响应(335 字节头部 + 4 + 589 字节分块消息体);头部大小写与 LF 行尾都被接受,缺 Host 得 400,未知方法 405,版本 HTTP/9.9 得 505;1.0 默认关连接、1.1 默认保持;单个头部上限在 130000~200000 字节之间。
实测 HTTP/1.1 的连接复用:RTT 100 ms 时 10 个资源每次新建 2024 ms、keep-alive 1114 ms、流水线 233 ms;但流水线有队头阻塞:快请求被慢请求拖到 702 ms(并行连接只要 202 ms),服务端不开 TCP_NODELAY 还会再晚 100 ms;example.com 支持流水线且空闲 130 秒也不关连接。
实测 HTTP 消息体怎么划界:example.com 的 589 字节分块响应只有 1 个 577 字节的块、框架开销 12 字节;100000 字节每块 100 字节开销 6.00% 而每块 16 KiB 只有 0.06%;chunked 让数据 0~1016 ms 陆续到达而 Content-Length 要等 1001 ms;缺长度的响应要等连接关闭才结束;长度写错、截断、错位各是什么后果。
实测 HTTP 方法语义:example.com 只开放 GET 与 HEAD(其它全部 405 且不带 Allow 头);HEAD 与 GET 的头部只差 Transfer-Encoding;响应丢失时 urllib3 自动重试 GET / PUT(服务器收到 3 次)而不重试 POST;强制重试 POST 会使服务器账上被重复执行 3 次。
实测 HTTP 缓存:python.org 的 logo 新鲜期还剩 355388 秒;条件请求 304 比完整 200 少 97.8%(364 对 16384 字节);ETag 优先于日期;100 ms 往返下 10 次访问,无缓存头 500420 字节、max-age=60 只有 50069 字节、每次验证的 ETag 方案 50673 字节;附 Vary 缓存键的模拟。