# HTTP的前世今生
30 秒速记
HTTP/0.9(1991):只有GET,只能拿HTML,没有头部和状态码HTTP/1.0(1996,RFC 1945):加了头部、状态码、Content-Type,能传图片了,但只是信息性文档不是正式标准HTTP/1.1(1997/1999):持久连接、Host虚拟主机、分块传输、缓存控制,用了二十多年HTTP/2(2015):源自Google的SPDY,二进制分帧 + 多路复用,主攻性能HTTP/3(2022,RFC 9114):跑在QUIC上,现在主流浏览器和大CDN都已支持- 主线:前期补功能,后期提速度;
URL、方法、状态码这套语义一直没变
HTTP 的演进可以分两段看:1.1 之前是在补功能,1.1 之后是在提性能。 0.9 简单到只能 GET 一个 HTML 页面;1.0 有了头部和状态码,可以传图片;1.1 补上持久连接和 Host,一台服务器能托管多个站,这套协议撑了二十多年。后来网页越来越重,HTTP/2 从 SPDY 演化出来解决并发问题,HTTP/3 又换到 QUIC 解决 TCP 的队头阻塞。面试时我会强调一点:版本再怎么升,方法、状态码、头字段的含义都没变,变的是怎么传。
HTTP协议始于三十年前蒂姆·伯纳斯 - 李的一篇论文HTTP/0.9是个简单的文本协议,只能获取文本资源;HTTP/1.0确立了大部分现在使用的技术,但它不是正式标准;HTTP/1.1是目前互联网上使用最广泛的协议,功能也非常完善;HTTP/2基于 Google 的SPDY协议,注重性能改善,但还未普及;HTTP/3基于 Google 的QUIC协议,是将来的发展方向

原理拆解: HTTP 的演进可以分成两条主线:一条扩充语义能力,另一条改善传输效率。HTTP/0.9 只有极简资源获取;HTTP/1.0 增加状态码、头部和多种内容类型等机制;HTTP/1.1 进一步规范持久连接、缓存、分块传输和虚拟主机。HTTP/2 保留方法、状态码和头部等上层语义,但将传输改为二进制分帧,并在单条连接上复用多个流。HTTP/3 再把承载层转向基于 UDP 的 QUIC,降低传输层队头阻塞及连接建立成本。
最小验证: 输入同一个 HTTPS 地址,分别要求 curl 尝试不同协议,并打印最终协商到的版本;要验证的结论是资源语义相同,而协商出的传输版本可以不同。
curl -sS -o /dev/null -w 'HTTP/%{http_version}\n' --http1.1 https://example.com/
curl -sS -o /dev/null -w 'HTTP/%{http_version}\n' --http2 https://example.com/
curl -sS -o /dev/null -w 'HTTP/%{http_version}\n' --http3 https://example.com/
第一行通常输出 HTTP/1.1;后两行只有在本机 curl、TLS 库、目标站点和网络链路共同支持时,才可能输出 HTTP/2 或 HTTP/3。命令仍访问同一 URL,说明版本升级主要改变连接与传输方式,并未废弃 URL、方法和状态码等核心语义。
边界与排查: HTTP/2 源自 SPDY 的实践,但不是把 SPDY 名称直接延续下来;HTTP/3 基于 QUIC,其标准化与部署状态也不能沿用早期资料中的“未来协议”判断。若命令报“不支持该选项”,应先用 curl -V 查看编译能力;若协商降级,则检查服务端协议配置、TLS 的 ALPN、代理支持和网络是否限制 UDP。
面试官追问
追问 1接口升级 h2 后 URL、状态码一个没变,能说协议没变吗?
不能。变的是传输方式:1.1 是文本、一条连接一次一个请求,h2 是二进制帧、一条连接并发多个流。语义层故意保持兼容,就是为了业务不用改。
追问 2HTTP/1.0 和 1.1 最关键的区别是什么?
两个:1.1 默认持久连接,不用每个请求都重新三次握手;1.1 强制要求 Host 头,一个 IP 上可以跑多个网站。再往下就是分块传输、Cache-Control、ETag 这些缓存能力。
追问 3怎么不改代码确认线上站点支持哪些版本?
curl -sI --http2 https://example.com -o /dev/null -w '%{http_version}\n',输出 2 就是支持 h2;换 --http3 试 h3,前提是本机 curl 编译时带了对应能力,curl -V 能看到。
追问 4HTTP/2 就是 SPDY 改了个名吗?
不是。HTTP/2 以 SPDY 为蓝本标准化,但改了不少,比如头部压缩从 SPDY 的 deflate 换成了 HPACK,因为前者有 CRIME 攻击风险。Chrome 在 2016 年就移除了 SPDY。
