HTTP 协议全称是超文本传输协议(Hypertext Transfer Protocol),这里面需要理解三个地方:超文本、传输、协议,下面就从 HTTP 协议的历史讲起。
20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,它有四个分布在世界各地的节点,被认为是互联网的始祖。
到了 70 年代,基于对 ARPA 网络的实践和思考,研究人员发明出了著名的 TCP/IP 协议,并在 80 年代中期进入了 UNIX 内核,使更多计算机接入了互联网。
HTTP 诞生
这位大师叫蒂姆·伯纳斯·李(Tim Berners-Lee),是万维网的创始人,简单点说,是当代互联网的创始人。
在 1989 年,他发表了一篇论文,提出了在互联网上构建超链接文档系统的构想,在这篇论文里他确立了三项关键技术:
- URI:统一资源标识符,作为互联网上资源的唯一标识
- HTML:超文本标记语言,描述超文本文档
- HTTP:超文本传输协议,用来传输超文本
这三项技术直接奠定了我们当今 Web 世界的技术,蒂姆把它称为万维网(World Wide Web)。
所以,1989 年,HTTP 诞生了。
HTTP/0.9
在 20 世纪 90 年代初,互联网世界还是一片荒漠,计算机处理能力低下,存储容量小,网速很慢。网络上的绝大多数资源都是纯文本资源,所以 HTTP 协议也是纯文本格式的。
为了便于服务器和客户端处理,蒂姆最初设想的系统里的文档都是只读的,所以只允许用户通过 GET 请求从服务器上获取 HTML 文档,并且在响应之后立即关闭连接,功能非常有限。
这一版 HTTP 协议虽然很简单,但是作为一个原型,充分验证了 Web 服务的可行性。
HTTP/1.0
1993 年,美国国家超级计算应用中心(NCSA)开发出了 Mosaic,是第一个可以图文混排的浏览器,随后又在 1995 年开发出了服务器软件 Apache,简化了 HTTP 服务的搭建工作。
同一时期,在 1992 年发明了 JPEG 图像格式,1995 年发明了 MP3 音乐格式。
这些新技术的出现,促使 HTTP 协议开始添加各种特性,从用户需求的角度促进了 HTTP 协议的发展。
在已有实践的基础上,经过一系列的草案,HTTP/1.0 在 1996 年正式发布。主要增加了以下几部分内容:
- 增加了 HEAD/POST 等新方法
- 增加了响应状态码
- 增加了版本号
- 增加了 Header 头部的概念
- 增加了
Content-Type
,传输数据不再仅限于文本
但是 HTTP/1.0 并不是一个标准,只是记录已有实践和模式的一份参考文档,不具有实际的约束力,相当于一个备忘录。
HTTP/1.1
1999 年,HTTP/1.1 发布了 RFC 文档,编号为 2616,从版本号我们就可以看到,HTTP/1.1 是对 HTTP/1.0 的小幅度修正。但是一个重要区别是,它是一个正式的标准,而不是一份参考文档。但是 HTTP/1.1 说是小幅度修正也不太确切,这里面主要变更点有:
- 增加了 PUT/DELETE/OPITIONS 等新方法
- 增加了缓存控制和管理
Cache Control
- 明确了连接管理,允许持久连接
Keepalive
- 允许响应数据分块,利于传输大文件(Chunked)
- 强制要求 Host 头
我们当今世界的所有知名网站,都是在这个时间点左右创立的,可以说有了 HTTP/1.1,才开创了 Web 1.0、Web 2.0 时代。
不过,由于 HTTP/1.1 太过庞大和复杂,因此在 2014 年又进行了一次修订,拆分为六份较小的文档,7230 /7231/7232/7233/7234/7235
这六份文档增加了两个大的需求:
- 加大了 HTTP 的安全性,比如使用 TLS 协议
-
让 HTTP 可以支持更多的应用,目前已经支持四种网络协议:
- 传统的短连接
- 可重用 TCP 的长连接模型
- 服务端 PUSH 模型
- WebSocket 模型
HTTP/2
HTTP/1.1 存在两个问题:
- 连接慢,请求是串行的,需要保证顺序,例如一个网页中可能会有多个资源
- 性能差,HTTP/1.1 是以文本的方式,借助 CPU 的 zip 压缩方式减少网络带宽,但是耗费了 前端和后端的 CPU
2010 年,Google 推出了新的 SPDY 协议,并应用于自家的服务器,HTTP/2 就是以 SPDY 为基础的,它的特点主要是:
- 使用二进制传输,不再是纯文本
- 可以在一个 TCP 连接中并发多个 HTTP 请求,移除了 HTTP/1.1 中的串行请求
- 使用 HPACK 算法来压缩头部
- 允许服务器主动向客户端推送数据
- 增强了安全性,基于 TLS 协议
HTTP/3
HTTP/2 的主要问题有队头阻塞问题,也就是说,若干个 HTTP 请求在复用一个 TCP 的连接,那么一旦发生丢包,造成的问题就是所有的请求都必须等待这个丢了的包重传回来,哪怕这个包不是我这个 HTTP 请求的。
基于此,Google 发明了 QUIC(Quick UDP Internet Connections)协议,它是基于 UDP 的。因此,它就解决了以下几个问题:
- UDP 是无序的,因此不存在队头阻塞问题
- QUIC 有一套自己的丢包重传和拥塞控制的协议
- HTTPS 握手通常需要六次网络交互,QUIC 直接将 TLS 和 TCP 合并成了三次握手
所以,QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复用协议。在未来,QUIC 协议成熟了的话,是有可能取代 TCP 协议的。
关注公众号领取二十套技术图谱
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。