Appearance
HTTP/0.9
- 仅支持 GET 请求方法
- 只支持传输纯文本格式的 HTML,不支持其他类型资源
- 不支持请求头和响应头
- 无连接
- 无状态:不会记录连接的任何信息
- 响应只有内容,没有状态码或头部
HTTP/1.0
- 新增 POST、HEAD 请求方法
- 支持请求头和响应头,Content-Type 支持多种数据格式
- 新增 HTTP 响应状态码(如 200、404、500 等)
- 默认短连接:每次请求都会重新建立 TCP 连接。需手动设置
Connection: keep-alive才能复用连接 - 支持简单的缓存策略:使用
Expires和Last-Modified实现协商缓存 - 仍不支持虚拟主机(Host 字段),一台服务器只能应对一个网站
HTTP/1.1
新增请求方法:PUT、DELETE、OPTIONS、TRACE、CONNECT、PATCH(部分实现)
请求头中新增 HOST 字段,支持虚拟主机。同一 IP 可部署多个网站。请求头中不设置 Host 会报 400
默认长连接:
Connection: keep-alive,一个 TCP 连接可复用多个请求支持更多缓存控制策略:
Cache-Control、Etag等支持断点续传:通过
Range请求头和Content-Range响应头实现部分内容下载(返回 206 Partial Content)发起请求时请求头中添加:
Range: bytes=0-10表示响应体中前 11 个字节内容 Range: bytes=-10表示响应体中最后 10 字节的内容 ... 响应头中会自动添加: Content-Range: bytes 0-10/764,0-10 表示下载的范围, 764 表示响应体总大小 但是再次下载时文件可能更新了, 请求头中需要加入If-Range: Etag | Last-Modifiled字段 如果文件没有变化, 返回206(Partial Conrent),否则返回200重新下载支持管线化(pipelining):允许客户端并行发送多个请求,但响应仍需按顺序返回,易受队头阻塞(HOL Blocking)影响,浏览器多默认关闭
分块传输编码(chunked transfer encoding):响应内容长度未知时,使用
Transfer-Encoding: chunked分块传输,无需Content-Length,让服务器可以在不知道响应总长度的情况下高效、实时地传输数据,适用于流式、动态内容等场景动态生成内容时无需预先知道长度
当服务器无法提前知道响应体的总长度(比如动态生成内容、流式传输等场景),可以采用 chunked 方式分块发送数据,每块前面带有长度标记,客户端据此拼接完整内容。
边生成边发送,提升响应速度
服务器可以一边生成内容一边发送给客户端,无需等全部内容生成完毕再发送,减少延迟,提高用户体验。
节省内存资源
不需要将全部响应内容缓存到内存或磁盘后再发送,适合大文件或流式数据传输。
无需 Content-Length 头
由于每个块都带有长度信息,整个响应体的长度无需提前声明 Content-Length,最后用一个长度为 0 的块表示结束。
新增 24 个状态码(如 409 Conflict、410 Gone 等)
逐步废弃明文 HTTP,鼓励使用 HTTPS
HTTP/2
- 基于二进制分帧层:所有数据拆分成二进制帧传输,每个帧有流标识,可并发多流
- 多路复用:同一 TCP 连接可承载多个请求和响应,数据帧可乱序发送,解决队头阻塞(但 TCP 层仍有 HOL 问题)
- 头部压缩:HPACK 算法,使用哈夫曼编码和索引表压缩 Header,减少冗余
- 服务端推送(Server Push):服务端可主动推送资源到客户端缓存
- nginx 支持
http2_push_preload on; - 响应头用
Link: </index.js>; rel=preload; as=script
- nginx 支持
- 只支持 HTTPS(大部分主流浏览器要求)
- 支持流量优先级和流量控制
- 更低的延迟和更高的带宽利用率
HTTP/3
- 基于 QUIC 协议(UDP),替代 TCP
- 彻底解决 TCP 队头阻塞:不同流间不再互相影响,流内丢包仅影响自身
- 快速连接恢复:使用连接 ID(UUID),网络切换后无需重新握手,能继续复用连接
- 0-RTT 建连:可实现无延迟的数据发送
- 内置加密与认证机制,安全性更高(TLS 1.3 集成在协议层)
- 支持向前纠错:包中带冗余数据,部分丢包无需重传即可恢复
- 依赖 UDP,兼容性和中间件支持仍在完善
补充问题解答
现代浏览器与服务器长连接
- HTTP/1.0 默认短连接,请求完成后断开
- HTTP/1.1+ 默认长连接(keep-alive),以下情况会断开:
- 服务器设置
Connection: close - 服务器设置超时或最大请求数(如
Keep-Alive: timeout=20, max=100)
- 服务器设置
一个 TCP 连接可承载多少 HTTP 请求?
- 长连接下可承载多个请求
- 短连接下每个请求都需新建 TCP 连接
一个 TCP 连接内能否并发多个 HTTP 请求?
- HTTP/1.1 支持管线化,但响应需按请求顺序返回,且受队头阻塞影响,实际多被禁用
- HTTP/2 通过多路复用可并发多个请求/响应,互不阻塞
刷新页面为何不需重新建立 SSL 连接?
- 如果 TCP 长连接未断开,SSL 会话会复用,省去握手过程
HTTP/1.1 下同一 Host 最大 TCP 连接数?
- 浏览器有并发连接上限,Chrome 通常为 6 个
HTTP/1.1 下提高页面加载效率方法?
- 使用
Connection: keep-alive减少 TCP 建连 - 请求数过多时可开启多个 TCP 连接(主机分片、虚拟主机)
页面含大量图片时下载方式?
- 若支持 HTTP/2,浏览器会优先用多路复用在单个连接中并发下载
- 若不支持,浏览器会并发建立多个 TCP 连接(数量受限,排队下载)
HTTP/3 为什么用 UDP 而不是 TCP?
- TCP 建连慢(3 次握手)、队头阻塞
- TCP 在操作系统内核实现,升级维护难度大
- UDP 无连接、无队头阻塞、易定制,适合新协议快速演进
- QUIC 在 UDP 基础上实现可靠传输、拥塞控制、加密、安全等特性,兼具 TCP 优势
HTTP1.0 与 HTTP1.1 区别
- 缓存机制:1.0 主要靠
Expires、Last-Modified,1.1 新增ETag、Cache-Control - 带宽优化:1.1 支持断点续传(206 Partial Content)
- 错误管理:1.1 新增更多状态码(如 409、410 等)
- Host 头:1.1 强制要求 Host 头,支持虚拟主机
- 长连接:1.1 默认开启长连接(keep-alive),1.0 需手动设置
HTTP2.0 与 HTTP1.x 区别
- 二进制协议:HTTP1.x 文本协议,2.0 转为二进制,解析更高效
- 头部压缩:2.0 用 HPACK 算法压缩头部,减少重复数据传输
- 多路复用:单连接并发多请求,彻底解决 1.x 队头阻塞
- 服务端推送:2.0 支持主动推送资源至客户端缓存
- 流量控制和优先级:2.0 支持请求优先级、流量动态分配