十三Tech
应用层协议

图解 HTTP

从一个 URL 背后的协议骨架开始,顺着一次完整的请求-响应,拆到报文、连接、缓存、内容协商、安全,再演进到 HTTP/2 与 HTTP/3。

适合想把 HTTP 从「会调接口」理解到报文语义、缓存策略、传输机制和工程排障的后端与前端工程师。

3030/30 已完结最近更新 2026/6/27
阶段目录

按主题段落阅读

文章列表

完整目录

30
01

图解 HTTP 01|一个 URL 背后:从地址栏到报文的协议骨架

HTTP 被讲成「调接口的协议」,但它真正的骨架是 URL、报文三段式和 method/status 的语义对偶。这一篇先把这套骨架立起来,解释为什么报文要严格三段式、为什么会有幂等,为后面的连接、缓存和演进铺好路。

02

图解 HTTP 02|header 不是参数表:它是一张请求的元信息契约

header 常被当成「请求参数的另一种写法」,但它真正的角色是携带这次交互的元信息——类型、长度、协商意图、跳板路径。这一篇把 header 分成五类,说清为什么有些 header 端到端传递、有些会被中间件剥掉。

03

图解 HTTP 03|method 的语义边界:为什么 GET 和 POST 的差别不在 body

很多人以为 GET 和 POST 的差别是「有没有 body」,其实差在语义——安全、幂等、可缓存。这一篇讲清 method 的三个属性,以及为什么 PATCH 必须存在、OPTIONS 在 CORS 预检里干什么。

04

图解 HTTP 04|状态码的契约:数字给机器,原因给人

状态码被简化成「成功用 200,失败用 400/500」,但 301/302/307/308 的 method 处理、401/403 的认证授权区分、全用 200 的代价,才是真正影响线上行为的地方。

05

图解 HTTP 05|body 怎么编码:从 Content-Length 到分块到 SSE

body 不是「请求参数」,它怎么定边界、怎么编码格式,决定了能不能流式传输、能不能传文件、能不能边生成边推。这一篇讲清 Content-Length、chunked、multipart 和 SSE 的取舍。

06

图解 HTTP 06|TCP 三次握手:为什么不是两次也不是四次

HTTP 跑在 TCP 上,发请求前先得建连接。三次握手 SYN/SYN-ACK/ACK 的序号变化、为什么是三次不是两次、以及它造成的 1 个 RTT 开销,是所有 HTTP 性能优化的起点。

07

图解 HTTP 07|keep-alive:复用一条连接的代价与收益

既然每次握手要花 1 个 RTT,能不能握一次手多跑几个请求?keep-alive 解决了这个问题,但它治标不治本——HTTP/1.1 的队头阻塞还在,idle 连接也在占资源。

08

图解 HTTP 08|队头阻塞:HTTP/1.1 最深的坑,HTTP/2 要填的洞

keep-alive 解决了重复握手,但 HTTP/1.1 有个更深的坑——队头阻塞。一条连接上请求串行,前一个慢了后面全得等。它分应用层和 TCP 层两种,分别推动了 HTTP/2 和 HTTP/3。

09

图解 HTTP 09|TLS 握手:HTTPS 比 HTTP 多出来的那几个来回

HTTPS = HTTP over TLS。TCP 握手建好通道后,TLS 还要在通道里再握一次手——协商加密套件、交换密钥、验证身份。TLS 1.2 要 2 个 RTT,TLS 1.3 减到 1 个,这就是 HTTPS 比 HTTP 慢的根源。

10

图解 HTTP 10|证书与信任链:浏览器凭什么相信一个 HTTPS 站点

TLS 加密保证了别人看不懂,但怎么确认对面真的是 rubyfun.cn 而不是中间人?靠证书、CA 和信任链。这一篇讲清证书的核心字段、信任链怎么从根 CA 一路延伸、以及证书吊销的三种方式。

11

图解 HTTP 11|强缓存:连请求都不发的最快路径

连接建好、数据传过来,但同一个资源能不能别每次都传?能。强缓存让浏览器连请求都不发,直接用本地副本——这是 HTTP 最快的优化。这一篇讲清 Cache-Control 和 Expires 怎么决定强缓存。

12

图解 HTTP 12|协商缓存:问一句「还能用吗」,省掉整个 body

强缓存过期了不代表资源变了。协商缓存让浏览器发个轻量请求问服务器「我的副本还能用吗」,能用就返回 304——省掉了传输整个 body 的开销。这一篇讲清 ETag 和 Last-Modified 两套机制。

13

图解 HTTP 13|Vary:同一个 URL,缓存怎么区分不同版本

同一个 URL,手机和电脑可能拿到不同页面。缓存怎么区分这些「同 URL 不同内容」的响应?靠 Vary 头。这一篇讲清 Vary 怎么让缓存键不再只看 URL,以及漏配 Vary 导致串内容的坑。

14

图解 HTTP 14|缓存层级:从浏览器到 CDN 到源站的接力

缓存不只在浏览器里,它分布在浏览器的 memory/disk、CDN 边缘节点、反向代理、源站,形成一条多级接力链。这一篇讲清每一层缓存站在哪、各自用什么策略、以及 age 头怎么追踪资源的年龄。

15

图解 HTTP 15|缓存失效与陷阱:缓存界最难的两件事

计算机科学有两件难事:命名和缓存失效。这一篇讲清资源更新后怎么让缓存失效——文件指纹、短 TTL、CDN 刷新、stale-while-revalidate,以及那些常见的缓存陷阱。

16

图解 HTTP 16|内容协商:同一个 URL 怎么给不同客户端不同的东西

同一个 URL,服务器怎么知道要返回 JSON 还是 XML、中文还是英文、gzip 还是 br?靠内容协商。这一篇讲清主动协商(Accept 头)和响应式协商(300)两种机制,以及为什么 Vary 是协商和缓存的桥梁。

17

图解 HTTP 17|压缩传输:gzip、br 和为什么别压缩已压缩的

内容协商确定了返回什么,但传输时怎么让它更小?靠 Content-Encoding 压缩。这一篇讲清 gzip、br(Brotli)的取舍,为什么图片不能再压缩,以及压缩 vs 分块的区别。

18

图解 HTTP 18|分块传输:不知道总长度时怎么边生成边发

Content-Length 要求先备齐数据才能发,但动态生成的内容、流式响应怎么办?分块传输(Transfer-Encoding: chunked)让服务器不知道总长度也能边生成边发。这一篇讲清它的格式、和 SSE 的关系、以及为什么 HTTP/2 把它干掉了。

19

图解 HTTP 19|范围请求:断点续传和多线程下载怎么实现的

下载大文件中断了,能不能从断点继续而不是重头来?视频网站怎么做到拖进度条秒播?靠范围请求(Range)。这一篇讲清 Range、Content-Range、206 响应,以及 Accept-Ranges 怎么声明支持。

20

图解 HTTP 20|表单提交与文件上传:三种 enctype 的取舍

HTML 表单提交看起来简单,但 enctype 背后是三种 body 编码方式:urlencoded、multipart、text-plain。这一篇讲清三种格式怎么选、文件上传为什么必须用 multipart、以及现代 fetch 提交的差异。

21

图解 HTTP 21|Cookie:给无状态的 HTTP 加上记忆

HTTP 是无状态的,但登录、购物车需要记住用户。Cookie 是 HTTP 加状态的方案——服务器种、浏览器存、每次请求自动带。这一篇讲清 Cookie 的属性、作用域,以及 HttpOnly/Secure/SameSite 三个安全属性。

22

图解 HTTP 22|CORS:跨域请求为什么会被浏览器拦下来

前端调接口遇到「CORS 报错」是高频问题,但很多人只会在后端加 Access-Control-Allow-Origin: *。这一篇讲清同源策略、简单请求 vs 预检请求、CORS 的整套响应头,以及为什么这是浏览器的限制不是服务器的。

23

图解 HTTP 23|CSP:给页面装一道「只准加载这些资源」的围栏

XSS 攻击往页面注入恶意脚本,怎么防?HttpOnly 防 Cookie 被偷,CSP 从源头限制「页面只能加载哪些资源、执行哪些脚本」。这一篇讲清 CSP 的指令、nonce/hash 机制,以及它和 XSS 的关系。

24

图解 HTTP 24|HSTS:强制浏览器用 HTTPS,堵住降级攻击

你的网站支持 HTTPS,但用户可能手滑输入 http://,或中间人把请求降级成明文。HSTS 让浏览器记住「这个域名必须用 HTTPS」,堵住第一次的降级窗口。这一篇讲清 HSTS、preload list,和它堵不住的「首次访问」盲点。

25

图解 HTTP 25|Web 攻击与防御:XSS、CSRF、注入、点击劫持的攻防图

安全阶段收尾,把 Web 四大攻击——XSS、CSRF、SQL 注入、点击劫持——的原理和 HTTP 层面的防御串成一张攻防图。前面几篇讲的 Cookie、CORS、CSP、HSTS 都是这张图里的防御节点。

26

图解 HTTP 26|HTTP/2 多路复用:一条连接跑无数请求

HTTP/1.1 的队头阻塞逼出了 HTTP/2。这一篇讲清 HTTP/2 的核心改造:文本变二进制帧、一条连接跑多个 stream(多路复用)、服务器推送,以及它填了应用层 HOL 却放大了 TCP 层 HOL 的悖论。

27

图解 HTTP 27|头部压缩 HPACK:为什么同一个 header 不用重复发

HTTP/1.1 每个请求都重复发一堆 header,浪费严重。HTTP/2 用 HPACK 压缩头部——静态表、动态表、哈夫曼编码三件套,让重复 header 只发一个索引号。这一篇讲清 HPACK 怎么工作。

28

图解 HTTP 28|HTTP/3 与 QUIC:为什么连 TCP 都被换掉了

HTTP/2 解决了应用层队头阻塞,却放大了 TCP 层队头阻塞。HTTP/3 干脆把 TCP 换成基于 UDP 的 QUIC——握手和加密合并、stream 独立丢包不连累、连接迁移。这一篇讲清 HTTP/3 为什么这么激进。

29

图解 HTTP 29|代理与网关:请求路上那些中间节点

HTTP 请求从客户端到服务器,中间往往不止两个节点——正向代理、反向代理、网关、CDN 层层转发。这一篇讲清这些中间节点各自干什么、怎么改写请求,以及 Via/X-Forwarded-* 头怎么追踪链路。

30

图解 HTTP 30|抓包排障与系列收束:把 29 篇串成一张排查地图

系列最后一篇。把前面 29 篇的机制串成一张排查地图:遇到 HTTP 问题怎么分层定位,浏览器 DevTools 和抓包工具看什么,以及整个图解 HTTP 系列的总收束。