实测 TCP Fast Open:macOS 上服务端 listen 后才能设选项、客户端用 connectx;cookie 与 SYN 带数据、50 ms 延迟下 202 ms 降到 101 ms、example.com 接受 SYN 里的请求;服务端密钥轮换后旧 cookie 被拒、数据不丢;客户端在 SYN 重传 3 次后对该目的地停用 TFO,停用只针对该目的地、至少 40 分钟没有恢复;Linux 容器对照:省一个往返、对不支持的服务端回退、SYN 数据可被重放、带数据的 SYN 被丢弃时每个连接多等约 1 秒。
在 100 Mbit/s、RTT 100 ms 的 netlab 链路上扫描缓冲区:BDP 是 1,250,000 字节;接收窗口 256/512/1024 KiB 吞吐 2.53/4.98/9.91 MB/s,2048 KiB 起封顶 12.46 MB/s;过大的缓冲让 srtt 从 105 ms 涨到 197 ms;发送缓冲 64 KiB 只有 0.63 MB/s。
实测 TCP 队头阻塞:单程 50 ms、丢包 3% 的链路上,UDP 的 p99 延迟 51.4 ms 但丢 3%;TCP 单连接 0 丢失但 28.8% 的消息延迟超过 80 ms,p99 229.8 ms;一次丢包通常拖住 9 条消息,并在同一时刻被一起释放;拆成 4 条连接降到 8.7%。
实测 TCP 时间戳选项:占 12 字节(lo0 载荷 16344−12=16332);时钟 1000 Hz;keepalive 探测不带时间戳;TSecr 配对 20/20 成功但抓包差值只是一半 RTT(50 对 100 ms);重传的 36 个段里 34 个 ACK 回显重传的 TSval,分得清是哪次发送;PAWS 只有计算。
在 lo0 上用 netlab 注入延迟与丢包实测 TCP 吞吐:无丢包时往返 20 ms 为 193.57 MB/s、往返 100 ms 为 41.46 MB/s(窗口上限);5% 丢包让吞吐掉到基线的 2.2%;大多数格子实测与 Mathis 公式之比在 0.89~1.21;丢包率 ×4 吞吐约 ÷2.2~2.4。
实测 MSS 协商:SYN 里的 MSS = 接口 MTU − 40(lo0 16344、en0 1460);example.com 把 MSS 压到 1400,本机实际发出的最大段载荷 1388 = 1400 − 12;TCP_MAXSEG 在 connect/listen 前设置返回 EINVAL,连上后设置能把段限制在 1000 但不改握手;附各隧道应有 MSS 的计算表。
逐字节解析 DNS 报文:29 字节查询(12 字节头 + 问题区);1.1.1.1 的 61 字节响应,记录名是指向偏移 12 的压缩指针 c0 0c;递归解析器标志 QR RD RA,权威服务器 QR AA 且无 RA,不托管的名字 REFUSED;名字压缩省 20%~41%;大小写原样回显,非法标签长度被丢弃。
自己从根开始迭代解析: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 个已签名。