HTTP 协议发展史:一部填坑与演进的技术史诗

Published 2026-03-01 19:55 1699 words 9 min read

smile丶snow avatar

smile丶snow

大三/前端开发/百合汉化组成员/百合/偶尔也会做些动态壁纸

2026.03 - 至今
快手
前端开发实习生
2025.12 - 2026.03
北京蓝色光标数字传媒
前端开发实习生
This post is not yet available in English. Showing the original.
HTTP 协议的发展史,其实就是一部解决网络延迟和阻塞的填坑史。从 HTTP/1.0 的短连接到 HTTP/1.1 的长连接,再到 HTTP/2 的多路复用,最终走向 HTTP/3 的 QUIC 协议,每一次演进都是对前代痛点的彻底革命。

第一阶段
/1.0 —— 纯真年代与”用完就扔”

🕰️ 背景 (Context)

1996 年左右,网页几乎全是纯文本,偶尔有几张小图片。网页结构极其简单。

💥 核心痛点
(每次都要三次握手)

HTTP 协议是建立在 TCP 协议之上的。在 HTTP/1.0 时代,浏览器每请求一个资源(比如一张图),都要经历:

建立 TCP 连接(三次握手)发送 HTTP 请求接收响应断开 TCP 连接(四次挥手)

这就像你每次去超市买一瓶水,都要重新办一张会员卡,买完立刻注销。由于建立 TCP 连接的网络开销极大,一旦页面图片稍微多一点,加载速度简直惨不忍睹。


第二阶段
/1.1 —— 缝缝补补的”长连接”与前端的”奇技淫巧”

🕰️ 背景 (Context)

到了 1999 年,网页开始变得复杂,CSS、JS、大量图片涌现。HTTP/1.1 临危受命,带来了极其关键的 Connection: keep-alive (长连接)。

🛠️ 填坑方案
TCP 通道

浏览器和服务器商量好:“咱们建好一次 TCP 连接后,先别断开,后续的请求都顺着这条管道发。“这就省去了大量握手挥手的时间。

💥 新的致命痛点
(Head-of-Line Blocking)

TCP 管道虽然保住了,但 HTTP/1.1 规定:在同一个 TCP 通道里,请求必须排队,一问一答。

如果第一个请求的文件很大(比如一个超大 JS),或者服务器处理得很慢,后面的请求就算准备好了,也只能干等着。这叫”队头阻塞”。

为了缓解这个问题,浏览器强行规定:同一个域名下,最多只能同时建立 6 个 TCP 连接(开 6 个收费站通道并排跑)。但面对现代网页动辄上百个资源,6 个通道根本不够用。

👷‍♂️ 前端工程师的被动抗争 (奇技淫巧时代)

因为 HTTP/1.1 太不给力,当年的前端工程师被逼出了各种反人类的性能优化手段:

  1. CSS 雪碧图 (Sprite)
    ,靠 CSS 的 background-position 来切图。为的就是把几十个 HTTP 请求硬生生缩减成 1 个。
  2. 大文件打包合并
    JS 合并成一个巨大的 bundle.js,所有的 CSS 合并成一个文件。
  3. 域名分片 (Domain Sharding)
    6 个 TCP 连接,那我就把图片放到 img1.xxx.comimg2.xxx.com,人为突破 6 个连接的限制。

第三阶段
/2 —— 彻底革命,“多路复用”降维打击

🕰️ 背景 (Context)

移动互联网爆发,前端工程化崛起。雪碧图和文件合并不仅增加了开发成本,还破坏了缓存的颗粒度(只要改了一行 JS,整个巨大的 bundle.js 缓存就全失效了)。

🛠️ 革命性方案
(Multiplexing) 与二进制分帧

HTTP/2 彻底砸碎了 HTTP/1.1 的文本传输模式,引入了”二进制分帧层”。它把 HTTP 报文切成了极小的二进制”帧”,并且给每个帧打上了 ID 标签

它的运作逻辑极其强悍:

  • 浏览器和服务器之间只建立 1 个 TCP 连接
  • 所有的请求和响应都被切成碎块,混在一起在管道里疯狂并发传输。
  • 到了对端,再根据 ID 标签把碎块重新拼装成完整的文件。

完全不需要排队! 前一个大文件再慢,也不会堵死后面的小文件。HTTP 层面的”队头阻塞”被彻底消灭。

💡 上下文的精妙之处 (面试核弹)

随着 HTTP/2 的普及,前面提到的那些前端优化手段瞬间变成了反模式 (Anti-Pattern):

  • 不再需要雪碧图
    100 个小图标的请求和发 1 个大图的请求,在 HTTP/2 的单 TCP 多路复用下,开销几乎一样!
  • 不再推荐把所有 JS 打包成一个巨无霸
    ,因为可以精准利用浏览器的粒度缓存(配合 ETag 和 Cache-Control)。Vite 这种基于 ESM 的构建工具,就是在享受 HTTP/2 多路复用的红利。

第四阶段
/3 —— 抛弃 TCP,走向 QUIC

🕰️ 背景 (Context)

HTTP/2 完美了吗?并没有。HTTP/2 把所有的鸡蛋都放在了同一个篮子里(只有一个 TCP 连接)。

TCP 协议底层是保证顺序的。如果在这唯一的一条 TCP 通道里,有一个数据包在网络中不小心丢失了,TCP 底层就会死等这个包重传,导致所有 HTTP/2 的并发流全部卡死停摆! 这叫 TCP 层面的队头阻塞

同时,移动端用户经常在 4G/5G 和 Wi-Fi 之间切换(IP 地址会变),一切换,TCP 连接就断了,必须重新三次握手,看视频或者直播就会卡顿。

🛠️ 终极方案
UDP 的 QUIC 协议

HTTP/3 大笔一挥:TCP 这个有 40 年历史的老爷车我们不用了!

它直接基于轻量级、无需握手的 UDP 协议,并在应用层自己实现了一套叫 QUIC 的协议。

  1. 0-RTT 极速建连
    TCP 繁琐的三次握手,以前连过的服务器,甚至可以带着数据直接发包。
  2. 彻底消灭队头阻塞
    UDP,各个流之间真正独立。哪怕丢了一个包,也只会影响那一个流,其他流继续畅通无阻。
  3. 连接迁移
    不再用”IP + 端口”来识别连接,而是用一个唯一的 Connection ID。即便你从 Wi-Fi 切到移动蜂窝网络,IP 变了,只要 ID 没变,连接就瞬间平滑无缝转移,直播和视频缓冲做到极致丝滑。

总结
?

下次遇到这个问题,你就可以这样侃侃而谈:

“HTTP 协议的发展史,其实就是一部解决网络延迟和阻塞的填坑史。

HTTP/1.0 苦于频繁建连,所以 HTTP/1.1 引入了长连接。

但长连接带来了 HTTP 层面的队头阻塞,逼得前端发明了雪碧图、文件合并等妥协手段。

接着 HTTP/2 用二进制分帧和多路复用彻底解决了 HTTP 队头阻塞,让雪碧图成为了历史,也促成了现代前端极其细粒度的打包构建工具(如 Vite)的繁荣。

最后,由于 TCP 协议底层的物理限制导致了新的阻塞问题,HTTP/3 直接抛弃 TCP 拥抱 UDP (QUIC),实现了 0-RTT 建连和完美的弱网切换支持。”

© 2024 - 2026 smile丶snow @YukiBloom
Powered by theme astro-koharu · Inspired by Shoka