手工收发 HTTP/2 帧:24 字节前言 + 21 字节 SETTINGS,9 字节帧头;GET 请求只有 32 字节的 HEADERS 帧(HPACK 头部块 23 字节,对比 HTTP/1.1 的 67 字节);响应是 160 + 577 字节;PING 往返 151~153 ms;缺 :method 的畸形请求得到 400 而不是 RST_STREAM。
用本机 HTTP/2 服务器实测:10 个 300 ms 的请求,HTTP/1.1 顺序 4143 ms、6 连接 913 ms、HTTP/2 单连接 814 ms;不发 WINDOW_UPDATE 时服务器发 65535 字节就停;初始窗口 65535 到 4 MiB 的下载从 13.09 秒降到 0.71 秒;HPACK 把相同请求的头部块从 210 字节压到 8 字节(2.0%)。
对 example.com 的 HTTP/3:QUIC 握手 171 ms(1 个 RTT)对 TCP + TLS 的 324 ms,整次取回首页 348 ms 对 680 ms;抓包看到 1200 字节填充的 Initial;example.com 的会话恢复可行但不接受 0-RTT;本机服务端上 0-RTT 实测响应头 209 → 105 ms(少一个往返);3% 丢包下 aioquic 对 aioquic 13189 ms,换成 curl + Caddy 后 HTTP/3 964 ms 对 HTTP/2 702 ms。
手工收发 WebSocket 帧:101 握手的 Sec-WebSocket-Accept 我自己算出来一致;"Hello" 的客户端帧 11 字节(2 + 4 掩码 + 5)、服务器帧 7 字节;长度的 7 位 / 16 位 / 64 位三种编码对应 2 / 4 / 10 字节帧头;分片之间夹 ping;未掩码帧得到 1002;关闭握手。
手工解析 SSE:chunked 的 text/event-stream 响应、事件陆续在 0 / 205 / 410 / 616 ms 到达;字段格式(多行 data、注释、未知字段、没有结尾空行不派发);断线重连带 Last-Event-ID,三轮 id 连续且无重复;推送 1000 条 20 字节消息 SSE 34 字节 / 条,WebSocket 22,反复请求 85。
逐个取 20 个状态码的真实响应;requests / urllib3 / http.client 对 404 / 500 都不抛异常而 urllib.request 抛;429 带 Retry-After: 2 时 urllib3 等了 2.01 秒,503 无头时指数退避 0 / 1 / 2 / 4 秒;Expect: 100-continue 让未认证的 5 MB 上传省下全部请求体。
抓包手工解析 example.com 的 TLS 1.3 握手:ClientHello 1529 字节(含 1216 字节的 X25519MLKEM768 后量子混合公钥),ServerHello 选定该组和 TLS_AES_256_GCM_SHA384,之后 4420 字节全是加密记录;握手中位 164 ms(1 个往返),TLS 1.2 要 325 ms(2 个往返)。
解析 example.com 的 X.509 证书链:叶子 90 天、两个中间 CA 10 与 15 年、根 24 年,三次签名验证都通过,根在本机 192 张的信任库里;叶子的 SAN 是 example.com 与 *.example.com;badssl.com 的过期 / 主机名 / 自签名 / 未知根报错码 10 / 62 / 18 / 19,被吊销的证书却握手成功;同一 IP 上 SNI 决定给哪张证书。
抓包确认 SNI 在 ClientHello 偏移 130 处是明文,其余 9 个包都找不到;Cloudflare 对 SNI 与 Host 不一致的请求一律 403;ALPN 服务器按自己的偏好选 h2,不匹配时握手成功但不选协议;example.com / cloudflare.com 的 HTTPS 记录没有 ech 参数。
实测 TLS 会话恢复:TLS 1.3 恢复握手耗时与完整握手几乎相同(169 对 175 ms)但服务器→客户端字节从 6563 降到 2800(不再发证书),ClientHello 多 267 字节的 pre_shared_key;TLS 1.2 恢复省一个往返(322 → 155 ms);同一 ticket 重复用 4 次都成功;example.com 的 Max Early Data 为 0,0-RTT 没有测成。
本机用临时生成的小 PKI 实测双向 TLS:有效证书握手 1.7 ms 成功,不带证书 / 不被信任的 CA / 已过期都在 TLS 1.3 里先 “握手成功” 再在第一次读时收到警报;CERT_OPTIONAL 允许不出示但不允许出示无效的;TLS 1.2 里客户端证书明文可见,TLS 1.3 里加密;双向比单向每次握手多约 0.15 ms(21%)。
抓包量 TLS 记录层:TLS 1.3 每条记录固定多 22 字节(5 头 + 1 类型 + 16 标签),TLS 1.2 GCM 多 29 字节;记录长度明文可见;100000 字节被切成 6 条 16401 字节的满记录和 1 条 1713 字节的尾巴,多 154 字节;40 次小写入开销 22.0%,一次大写入 0.5%。