实测 Range 请求:单段范围 206 且内容逐字节一致,起点超出得 416 并告知总大小,多段范围与未知单位被忽略返回 200;If-Range 在资源变了时回退到完整 200;中断后用 Range: bytes=6000- 续传,拼接后 SHA-256 一致;窗口受限的链路上 4 / 8 条连接并行下载比单连接快 3.5 / 6.3 倍。
实测 HTTP 压缩:python.org CSS 349113 字节 gzip 后 125147(−64%),但不支持 br / zstd;example.com 的 br 334 < gzip 400 < 原文 577,并忽略 q=0;gzip -6 / brotli q5 / zstd -3 在本机的压缩率与耗时;已压缩数据再压几乎无收益;1 Mbit/s 链路上压缩让下载快 2.6~3 倍。
拆开 baidu.com 的 4 个 Set-Cookie(max-age 2147483647 秒 ≈ 68 年);用 cookiejar 验证 8 个 Cookie 保存 5 个,域不匹配 / Max-Age=0 / 已过期的被丢弃,长路径的排在前面,Secure 不会走明文;example.com 对 64000 字节的 Cookie 头照收;附 SameSite 规则的模拟表。
实测重定向:python.org 明文 301 到 https://www.python.org/;同一个 301 / 302,requests 把 POST 变 GET 而 urllib3 保持 POST + 请求体,307 / 308 才保证保持,urllib.request 对 307 / 308 直接抛异常;循环重定向 requests 31 次、urllib3 4 次、urllib.request 11 次后放弃;Location 的相对写法。
用自己写的最小代理实测 HTTP 代理:明文请求行变成绝对形式,代理能看到全部内容;HTTPS 走 CONNECT 隧道,代理只看得到 CONNECT 目标和 SNI、1751 / 6544 字节密文;客户端↔代理 100 ms 往返时 HTTPS 访问从 525 ms 增到 1161 ms(连到代理 101、CONNECT 264、TLS 362、HTTP 472 ms);403 / 502 / 407 的反应。
手工收发 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 个往返)。