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 存在两个问题:

  1. 连接慢,请求是串行的,需要保证顺序,例如一个网页中可能会有多个资源
  2. 性能差,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 协议的。

关注公众号领取二十套技术图谱

关注公众号领取二十套技术图谱


子杨
19 声望4 粉丝

目前是一名 SRE,爱好 Go 和 Python。