
你可能遇到过这些情况页面第一次打开很慢第二次秒开明明改了静态资源用户却一直看到旧内容接口偶发慢抓日志发现后端处理时间并不长同一个域名为什么有时是 HTTP/1.1有时变成了 HTTP/2这些问题本质都离不开 3 件事HTTP 报文到底长什么样你抓包才看得懂连接怎么复用Keep-Alive/HTTP2 多路复用缓存怎么生效强缓存/协商缓存我这篇就用“知识分享 可验证”的方式把 HTTP 拆开讲清楚。目录按实战排查顺序先把 HTTP 的边界说清楚它解决什么不解决什么报文结构抓包时你到底在看什么GET vs POST别背八股用语义就够了版本演进1.0/1.1/2.0 分别解决了什么痛点连接复用Keep-Alive 到底省了什么缓存机制为什么“第二次秒开”以及怎么让它立刻更新实战用 DevTools/curl 验证与排障最后总结1. 先把 HTTP 的边界说清楚HTTP 是一种应用层协议规定客户端与服务端如何用“请求-响应”的方式交换数据。经典场景浏览器请求页面、App 请求接口。你在项目里更常用的表达是HTTP 是无状态的协议层不保存会话状态状态靠应用层补Cookie/Session/Token2. 报文结构抓包时你到底在看什么2.1 请求报文Request请求行METHOD path HTTP/version请求头Header: value空行请求体可选2.2 响应报文Response实战里你重点看三类东西状态码成功/重定向/缓存/失败关键响应头缓存相关、内容类型、压缩相关响应体大小与耗时到底慢在网络还是慢在后端状态行HTTP/version status_code reason响应头空行响应体3. GET vs POST别背八股用语义就够了你可以这样讲语义GET 用于获取资源POST 用于提交数据/产生副作用。幂等性GET 通常幂等POST 通常不幂等。参数位置GET 常放在 URL queryPOST 常放在 body但不是强制。容易踩坑的一句话不是“GET 不能有 body”而是多数实现不使用/不转发。4. 版本演进1.0/1.1/2.0 分别解决了什么痛点4.1 HTTP/1.0一次请求一次连接默认短连接一次请求一次连接性能问题连接建立/释放开销大4.2 HTTP/1.1默认 Keep-Alive开始“复用连接”核心改进默认持久连接Keep-Alive减少重复握手管线化Pipelining理论上可连续发送请求但实践中受限缓存机制更完善Cache-Control、ETag等但它仍有一个很要命的瓶颈队头阻塞Head-of-Line Blocking同一连接内前一个请求没返回后面的可能被阻塞。4.3 HTTP/2一个连接里并发多个请求多路复用核心改进背诵版二进制分帧不再是纯文本行多路复用一个连接并发处理多个 stream头部压缩HPACK服务端推送Server Push实际使用需谨慎工程里你要记住一句HTTP/2 解决了应用层的队头阻塞但底层仍基于 TCPTCP 层仍可能队头阻塞。5. 连接复用Keep-Alive 到底省了什么Keep-Alive 的意义复用同一个 TCP 连接承载多个 HTTP 请求减少三次握手/慢启动开销但要注意两个现实问题连接复用不是无限的服务端通常有连接数、超时时间等限制6. 缓存机制为什么“第二次秒开”以及怎么让它立刻更新你排查缓存问题时也建议按“先强后协商”来判断。6.1 强缓存特点不发请求到服务端浏览器直接用本地缓存常见头Cache-Control: max-age...Expires6.2 协商缓存特点会发请求到服务端服务端告诉你“缓存是否还可用”常见头If-None-Match/ETagIf-Modified-Since/Last-Modified协商缓存命中时通常返回304 Not Modified7. 实战用 DevTools/curl 验证与排障7.1 用浏览器 DevTools 看协议版本/连接复用打开 Chrome DevTools - Network勾选Disable cache排查缓存时很有用看Protocol列h2 表示 HTTP/2看Connection ID/Remote Address不同版本浏览器字段略有差异判断是否复用连接7.2 用 curl 直接验证缓存相关响应头你可以用下面这些命令快速确认服务端到底给了什么缓存策略curl-Ihttps://example.com/static/app.js重点关注Cache-ControlETagLast-Modified如果你想验证协商缓存是否会返回304curl-Ihttps://example.com/static/app.js\-HIf-None-Match: ETAG值7.3 “改了资源但不生效”最常见的落地做法静态资源带 hash 文件名例如app.3f2a9c.js配合长缓存HTML 入口短缓存/不缓存保证能拿到新版本资源引用8. 最后总结8.1 常见状态码怎么归类理解2xx成功2003xx重定向/缓存301/302/3044xx客户端错误400/401/403/4045xx服务端错误500/502/5038.2 复述自测你能讲顺说明你真的理解了HTTP 是应用层的请求-响应协议通常跑在 TCP 之上本身无状态状态一般通过 Cookie/Session/Token 在应用层实现。HTTP/1.1 用 Keep-Alive 复用连接减少握手开销但同一连接仍可能队头阻塞HTTP/2 用二进制分帧和多路复用提升并发能力同时做了头部压缩。缓存建议按“先强后协商”理解强缓存靠Cache-Control: max-age让浏览器直接用本地协商缓存靠ETag/Last-Modified让服务端决定是否返回304。