Skip to content

04 · HTTP 与 HTTPS 深入 ​

前端每天都在发请求,但 HTTP 本身"怎么走、怎么缓存、怎么复用连接"常被忽略。本篇站在协议侧讲方法、状态码、缓存与连接管理;A04 浏览器与网络 讲浏览器侧表现,两者分工。

速览卡 ​

项内容
一句话定位HTTP/HTTPS 协议侧的完整心智
核心内容方法幂等、状态码语义、缓存协商、连接复用、版本演进
读完能回答304 是怎么来的?为什么 HTTP2 要连复用?HTTPS 多了什么?
相关板块N03 DNS | N05 TLS | N11 抓包

一、请求模型:一次请求的解剖 ​

text
请求行   GET /api/users HTTP/1.1
请求头   Host / User-Agent / Accept / Cookie ...
空行
请求体   (GET 通常无体)

响应同理:状态行 + 响应头 + 空行 + 响应体。

记住"请求行 / 头 / 空行 / 体"四段式,抓包时一眼能定位问题。


二、方法与幂等 ​

方法幂等用途注意
GET是查询不应有副作用
POST否创建 / 触发动作重试可能重复创建
PUT是整体替换全量语义
PATCH否局部修改需小心并发
DELETE是删除幂等指多次删除结果一致

幂等 = 重复执行结果一致。网络重试是常态,非幂等接口必须配合幂等键(见 C04 一致性)。


三、状态码:别只会 200 和 500 ​

分类代表语义
2xx200 / 201 / 204成功
3xx301 / 302 / 304重定向 / 缓存命中
4xx400 / 401 / 403 / 404 / 429客户端问题
5xx500 / 502 / 503 / 504服务端问题
易混区分
401 vs 403401 未认证,403 无权限
301 vs 302301 永久,302 临时
502 vs 504502 上游返回异常,504 上游超时

四、缓存:怎么判断要不要重新下载 ​

text
首次 200 + Cache-Control: max-age=3600
再次 → 未过期 → 直接用本地(强缓存)
已过期 → 带 If-None-Match → 服务端回 304 → 用本地
头作用
Cache-Control: max-age强缓存有效期(相对时间)
Expires强缓存绝对过期时间(已不推荐)
ETag内容指纹,用于协商
Last-Modified修改时间,用于协商(弱于 ETag)
If-None-Match携带 ETag 去询问

静态资源用强缓存 + 文件名 hash,接口用协商缓存或禁缓存。把缓存配置写进响应头,比前端代码里折腾更可靠。


五、连接管理:HTTP 各版本在省什么 ​

版本连接模型解决的问题
HTTP/1.0每请求一条连接简单但开销大
HTTP/1.1Keep-Alive 复用省握手,但队头阻塞
HTTP/2多路复用单连接并行流,解决队头阻塞
HTTP/3QUIC / UDP再省 TLS + TCP 握手,抗丢包

队头阻塞:HTTP/1.1 一条连接一次只能处理一个请求;HTTP/2 用流并行解决,但 TCP 丢包仍会阻塞整条连接,HTTP/3 才真正摆脱。


六、HTTPS 多做了什么 ​

text
HTTP  = 明文请求/响应
HTTPS = TCP 之后先做 TLS 握手 → 加密传输

HTTPS 解决三件事:加密(防窃听)、完整性(防篡改)、身份认证(防冒充)。代价是握手多一个 RTT,所以有会话复用(详见 N05 TLS)。


七、自检清单 ​

  • [ ] 能画出一次 HTTP 请求的四段式结构
  • [ ] 知道 GET/POST/PUT/PATCH/DELETE 的幂等语义
  • [ ] 能区分 401/403、301/302、502/504
  • [ ] 能说出强缓存与协商缓存的全过程
  • [ ] 能讲清 HTTP/1.1 → 2 → 3 各自解决了什么

八、常见误区 ​

误区事实
"304 是重新下载"304 表示"未修改,用本地缓存"
"POST 可以安全重试"POST 不幂等,重试可能重复创建
"HTTP/2 没有队头阻塞"应用层解决了,TCP 层仍有
"HTTPS 只是加密"还有完整性与身份认证
"禁缓存就前端删头"缓存由服务端响应头主导

九、动手练习 ​

练习 A:看一次真实请求 ​

打开浏览器 DevTools → Network,找一个静态资源,观察响应头里的 Cache-Control 与 ETag,再强制刷新看是否变 304。

练习 B:测连接复用 ​

DevTools → Network 里看 HTTP/1.1 页面加载多个图片时是否并发在同一连接;对比 HTTP/2 站点(如 google)的表现。

练习 C:curl 看握手 ​

curl -v https://example.com 观察 TLS handshake 与 HTTP/2 输出,对照本篇第六节。


相关文档 ​

本区 ​

其他域 ​