举个例子:
Expires
和 If-Modified-Since
来做缓存判断:
Expires
(过期时间): 服务器告诉浏览器,这个资源的过期时间(比如 Expires: Mon, 25 Dec 2024 12:00:00 GMT
),在这个时间之前,浏览器可以直接用缓存。问题: Expires
用的是绝对时间,容易受到客户端时间的影响。If-Modified-Since
(如果修改时间符合): 如果资源有 Last-Modified
时间,浏览器下次请求时带上 If-Modified-Since
,服务器会比对它和 Last-Modified
,如果资源没更新,返回 304 Not Modified(不用重新下载,直接用缓存)。Cache-Control
头,提供更强大的缓存控制:
max-age=N
:设置缓存的有效时间(相对时间),比 Expires
更稳定。no-cache
:必须跟服务器确认后才能使用缓存(协商缓存)。no-store
:不允许缓存(比如敏感数据)。private
/ public
:控制缓存范围(只能浏览器缓存 / 浏览器和代理服务器都能缓存)。ETag
机制:
ETag
(实体标签)是一个资源的唯一标识,如果资源变化了,ETag
也会改变。If-None-Match
,服务器会比对 ETag
,如果相同,就返回 304 Not Modified。区别总结:
HTTP/1.0 | HTTP/1.1 |
---|---|
只支持 Expires 和 If-Modified-Since |
新增 Cache-Control 和 ETag |
过期时间是绝对时间,受本地时间影响 | max-age 是相对时间,更稳定 |
只支持简单的缓存控制 | 允许更细粒度的缓存策略 |
Host
头Host
头,每个 IP 地址只能对应一个网站。Host
头,服务器可以根据 Host
头识别多个网站。200 OK
302 Found
404 Not Found
100 Continue
:请求还没结束,可以继续发送数据(大文件上传时有用)。206 Partial Content
:支持断点续传。409 Conflict
:资源冲突,比如编辑同一个文档时产生冲突。418 I'm a teapot
(彩蛋状态码,不能用来泡茶)。Range
头,可以请求资源的部分内容,比如:
Range: bytes=500-1000
,只请求 500-1000 字节)。特性 | HTTP/1.0 | HTTP/1.1 |
---|---|---|
连接 | 短连接,必须重新建立 TCP 连接 | 默认长连接(Keep-Alive) |
缓存 | 只支持 Expires ,If-Modified-Since |
支持 Cache-Control ,ETag |
管道化 | 不支持 | 支持管道化,但仍然有阻塞问题 |
Host 头 |
没有,无法一个服务器托管多个网站 | 必须有 Host 头 |
状态码 | 状态码少 | 新增 24 个状态码 |
带宽优化 | 只能整个文件下载 | 支持断点续传(Range 头) |
HTTP/1.1 比 HTTP/1.0 更加高效,解决了很多 1.0 的缺点:
✅ 长连接减少 TCP 开销
✅ 更强的缓存机制提高性能
✅ 支持断点续传、带宽优化
✅ 支持管道化,部分提升并发能力
现在 绝大部分网站都在用 HTTP/1.1,但 HTTP/2 和 HTTP/3 在性能上更进一步,未来会慢慢取代 HTTP/1.1 。