连载中 9/20

HTTP/1.1 的家底与欠账:keepalive、chunked 和一肚子文本

2026-10-05 · 15 阅读 · 0 评论 · 0 赞

报文就是纯文本

HTTP/1.1 的报文人眼直接可读,这是它最大的优点也是最大的债。一个请求加响应长这样:

GET /api/notes?page=1 HTTP/1.1        ← 请求行:方法 路径 版本
Host: note.example.com                ← 头部区:一行一个键值对
User-Agent: curl/8.4.0
Accept: application/json
                                      ← 空行:头结束
(GET 无请求体)                      ← 请求体

HTTP/1.1 200 OK                       ← 状态行:版本 状态码 短语
Content-Type: application/json
Content-Length: 87
                                      ← 空行
{"code":0,"data":[...]}

可读性的代价:解析要逐行扫描找 CRLF,头部的重复字符串没法压缩(每个请求都背一遍 User-Agent、Cookie),体积白白膨胀。

家底一:keepalive 长连接

HTTP/1.0 一问一断,每个请求都要重新三次握手 + 慢启动。1.1 默认开启 Connection: keep-alive:连接建一次,串多少个请求随意。省掉的不只是握手 RTT,还有拥塞窗口的重新爬坡——上一篇算过这笔账。服务端用 keepalive_timeout 控制空闲回收,太短形同虚设,太长白占 FD,一般 30~75 秒。

家底二:chunked 分块传输

响应体多大,最开始可能并不知道(流式生成、动态渲染)。Transfer-Encoding: chunked 允许切块发送、长度自述,不用预先生成完整内容再算 Content-Length:

HTTP/1.1 200 OK
Transfer-Encoding: chunked

4\r\n                     ← 本块长度(十六进制)
Wiki\r\n                  ← 块内容
5\r\n
pedia \r\n
0\r\n                     ← 长度 0 = 结束
\r\n
// 大文件下载、SSE 流式响应都靠它

欠账:一连接一请求

keepalive 让请求能串行复用连接,但 1.1 规定同一连接上,前一个响应没回来,下一个请求不能发(官方的 pipelining 因为响应必须按序、中间一慢全堵,浏览器从未启用)。页面要拉 30 个资源怎么办?浏览器只好多开连接——同域名并发 6 条成为硬性上限。这条债怎么还,下一篇专讲。

用 curl 把报文看穿

$ curl -v https://note.example.com/api/notes -H "Accept: application/json"
> GET /api/notes HTTP/1.1        ← > 开头 = 发出去的
> Host: note.example.com
< HTTP/1.1 200 OK                ← < 开头 = 收回来的
< Connection: keep-alive
{ ... }                          ← 响应体

// 排错三板斧:加 -w 看耗时分解,--resolve 绑指定 IP,-x 走代理
// HTTP 的一切行为,最终都落到这几行文本上

下一篇:队头阻塞——HTTP/1.1 时代性能的天花板,以及一代人为推倒它做出的各种魔改。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#HTTP1.1#keepalive#chunked#报文结构#curl

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10114 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9877 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9307 阅读 · 21 评论 · 287 赞