这是一个关于「一行字」如何改变世界的故事。从
GET /index.html到QUIC,HTTP用了三十年。
原文地址
墨渊书肆/从一行字到改变世界:HTTP这三十年都经历了什么?
1991年,互联网还是个大农村。
那时候上网的人很少,网页也简陋得可怜。你能想象吗------第一个网页上只有一行字,连张图片都没有。
但就是从这一行字开始,一个帝国崛起了。
HTTP/0.9:一切的开始
1991年,一个叫蒂姆·伯纳斯-李(Tim Berners-Lee)的科学家,发明了HTTP。
但你绝对想象不到,最初的HTTP能有多简单。
它只有一个方法 :GET。
对,就一个。
你想获取一个网页?好,给服务器发一行字:
md
GET /index.html
服务器收到,嗷嗷一顿找,然后直接把内容返回给你。就这么粗暴。
没有响应头,没有状态码,没有POST,没有PUT。服务器返回什么,你就看什么。
像什么?
像一个只会说「好」的人。你问一句,它答一句,多余的一个字都没有。
但这就是HTTP的起点------一个简单到不能再简单的协议,奠定了互联网的基石。
HTTP/1.0:第一次进化
1996年,HTTP迎来了第一次大升级。
这时候的互联网已经开始热闹起来了。网页不再是纯文字,图片、音频、视频都冒出来了。原先那套「一行字」的打法,明显不够用了。
时代呼唤改变
人们开始提需求了:
- 「我想知道请求成没成功」
- 「我想传输其他类型的文件,不只是HTML」
- 「我想知道这个页面有没有更新」
- 「我想把页面做得更好看」
怎么办?HTTP/1.0来了。
新增了什么?
状态码 :服务器现在会告诉你结果了。200是成功,404是找不到,500是服务器挂了------就像你问路别人会指路了一样。
请求头和响应头 :你可以告诉服务器你能接受什么格式(Accept),服务器也能告诉你返回的是什么类型(Content-Type)、多大(Content-Length)。
支持多种请求方法 :GET有了,POST也有了。POST可以用来提交表单,比如你填完用户名密码点「登录」。
缓存机制 :Expires、Last-Modified这些概念开始出现。浏览器知道什么该存、什么该用了。
这一升级,HTTP从一个只会说「好」的人,变成了一个会「点头摇头」「递纸条」「看备忘录」的完整的人。
但人们还是不满足。
HTTP/1.1:真正的霸主
1997年,HTTP/1.1发布了。
这是一个极其长寿的版本------它统治了互联网整整20多年,直到今天还有很多网站在用它。
你说它有多厉害?
HTTP/1.1的杀手锏
持久连接(Keep-Alive):这是最关键的改动。
以前的HTTP,每次请求都要建立一次TCP连接。请求完就断,断完再连。就像每次说话都要重新握手一样,累不累?
HTTP/1.1说:「别断了,咱们保持连接。」一个TCP连接可以跑完整个页面的所有请求。
管道化(Pipelining):这个就更狠了。
以前是这样的:发请求A,等响应;发请求B,等响应;发请求C,等响应------一个接一个,串着来。
HTTP/1.1可以这样:发请求A、请求B、请求C,一起发出去!不用等A的响应回来再发B。
想象一下你去麦当劳点餐。以前是:「我要一个汉堡」「好」「我要薯条」「好」「我要可乐」「好」。现在是:「我要一个汉堡、一份薯条、一杯可乐」「好嘞」。
爽不爽?
但是!
管道化有个问题:虽然请求一起发了,但响应必须按顺序回来。
这就叫「队头阻塞」(Head-of-Line Blocking)。
就像你点了三份菜,厨房先做了最简单的薯条,但得等你最想吃的汉堡做好了一起上------你只能看着薯条流口水,不能先吃。
这个问题,困扰了HTTP/1.1很多年。
其他小改进
- 新增了一堆方法 :
PUT(上传)、DELETE(删除)、HEAD(只获取头部)、OPTIONS(查看支持什么方法) - 分块传输编码 :
Transfer-Encoding: chunked,服务器可以一块一块地返回数据,不用等全部算完 - 缓存机制升级 :
Cache-Control登场,比Expires更智能 - Host头:一台服务器可以托管多个网站了(虚拟主机)
为什么HTTP/1.1能活这么久?
说白了,就是够用。
虽然有队头阻塞的问题,但配合CDN、域名分片、静态资源合并这些「野路子」,1.1还是能打的。
再加上升级协议需要服务器、浏览器、CDN厂商全部配合------这是一个生态问题,不是技术问题。
所以HTTP/1.1硬是撑到了2015年,才等来下一代标准。
HTTP/2:真正的革命
2015年,HTTP/2正式发布。
这是HTTP诞生以来最大的一次升级。如果把HTTP/1.x比作绿皮火车,那HTTP/2就是高铁。
发生了什么变化?
二进制分帧:这是最底层的变化。
以前的HTTP/1.x是「文本协议」------你发的请求、服务器回的响应,都是明文写的,像写信一样。
HTTP/2改成了「二进制」------所有数据都转换成0和1来传输,就像发电报。
这意味着什么?效率更高了,因为计算机处理二进制比处理文本快多了。
而且数据被拆成了一个个「帧」(Frame),可以乱序发送、并行接收,彻底解决了队头阻塞!
多路复用(Multiplexing) :这是HTTP/2的核心杀手锏。
一个TCP连接里,可以同时跑多个「流」(Stream)。每个流里可以双向传输数据,帧可以乱序、可以交叉。
还是点餐的例子:以前是点三份菜等服务员一份一份上,现在是服务员端着一个大盘子,三份菜一起给你端上来,而且你还可以边吃边点。
爽到飞起。
服务器推送(Server Push):这个功能也很革命。
以前是这样的:浏览器请求页面HTML → 服务器返回 → 浏览器解析HTML发现要CSS → 再请求CSS → 服务器返回 → 浏览器解析CSS发现要图片......
一套下来,浏览器累得够呛。
HTTP/2说:「别麻烦了,我知道你要什么。」服务器在返回HTML的时候,直接把CSS、图片一起推给你。
就像你去饭店,服务员看你落座就把碗筷、茶水、菜单一起摆好了------不用你开口。
头部压缩(HPACK) :HTTP/1.x每次请求都要带一堆header,很多还是重复的。HTTP/2用HPACK算法压缩header,能省70%以上的流量。
HTTP/2的遗憾
HTTP/2解决了应用层的队头阻塞,但TCP层面还有个问题------丢包。
HTTP/2所有请求都跑在一个TCP连接上。如果其中一个包丢了,整个连接都要等它重传成功。
怎么办?
换协议呗。
HTTP/3:UDP登场
2018年,HTTP/3正式发布。
这是HTTP第一次抛弃TCP ,拥抱UDP。
为什么要用UDP?
TCP太可靠了------它保证数据一定到达、按顺序到达、中途不能出错。
但有时候,我们不需要这么可靠。
比如看直播------丢了一帧画面有什么关系?下一帧就来了。我要的是快,不是「绝对不出错」。
UDP就是这样的「愣头青」------我负责发,你负责收,收没收到、有没有乱序,我不管。
这反而成了优势。
QUIC:HTTP/3的核心
HTTP/3用的是QUIC协议(Quick UDP Internet Connections),它是Google发明的,后来被IETF收编。
QUIC用UDP的方式,实现了TCP的效果:
- 无队头阻塞:每个「流」是独立的,一个流丢包不影响其他流
- 0-RTT连接:第一次连接后,后续连接可以瞬间建立(省去握手时间)
- 连接迁移 :你从WiFi切到5G,IP地址变了,连接不会断------因为
QUIC用的是连接ID,不是IP地址 - 内置TLS :TLS握手和
QUIC握手一起完成,又省了一轮时间
简单说:TCP的优点我都有,TCP的缺点我避开,我还比TCP快。
HTTP/3带来了什么?
- 更低的延迟
- 更好的移动端体验(WiFi/5G切换不断连)
- 抗丢包能力更强
但HTTP/3也有问题:它需要服务器和客户端都支持,而且UDP在某些网络环境下可能被限速或被墙。
所以HTTP/2和HTTP/3现在在并存使用,未来可能会慢慢过渡到3。
结尾:从一行字开始,到改变世界
回顾HTTP的进化史,你会发现一条清晰的线:
| 版本 | 年份 | 核心特点 |
|---|---|---|
HTTP/0.9 |
1991 | 只有一个GET,一行字 |
HTTP/1.0 |
1996 | 状态码、请求头、POST、缓存 |
HTTP/1.1 |
1997 | 持久连接、管道化、虚拟主机 |
HTTP/2 |
2015 | 二进制分帧、多路复用、服务器推送 |
HTTP/3 |
2018 | QUIC + UDP、0-RTT |
从一行字 到改变世界,从文本到二进制,从TCP到UDP------HTTP用了三十多年。
今天,你打开任何一个网站、刷任何一个App、点任何一个链接------背后都是这一行字的子孙后代在为你工作。
这就是技术的魅力:从一个简单的想法出发,最终改变了整个世界。