史前时代

20世纪20年代,美国建立了互联网的始祖-ARPA网
20世纪70年代,基于ARPA,发明了TCP/IP协议,并在80年代进入UNIX系统内核,促使更多计算机接入了互联网

创世纪

1989年,万维网之父Tim-Berners-Lee提出了在互联网上构建超链接文档系统的思想,确立了3项关键技术(URL、HTML、HTTP)

HTTP/0.9

受限于20世纪90年代计算机的处理能力以及存储容量和网络速度,许多通信协议都使用纯文本,包括HTTP,并且获取HTML文档只允许用GET动作,在响应请求之后立即关闭连接,功能十分有限。但同时,HTTP0.9的简单也验证了Web服务的可行性,体现了进化和扩展的可行性

特点

  1. 只有一个请求行,没有请求头和请求体
  2. 服务器没有返回头信息,只要返回数据就行
  3. 返回文件内容以ASCII字符流来传输

HTTP/1.0

历史背景

1993年美国开发了第一个图文混排的浏览器(Mosaic),随后在95年开发了Apache,同一时期,多媒体技术也发生了新的变化,例如92年内的JPEG图像格式和95年的MP3格式

HTTP改进

新软件技术的进步,推动了HTTP的进步,越来越多的特性被添加进了HTTP协议,形式上跟我们现在的差别不大了,例如:

  1. 增加了HEAD、POST等新方法
  2. 增加了响应状态码,标记可能的错误原因
  3. 引入协议版本号的概念
  4. 引入HTTP Header的概念,使处理请求和响应更加灵活
  5. 传输的数据不仅限于文本

HTTP/1.1

历史背景

1995年的浏览器大战

HTTP再次改进

1999年,HTTP/1.1发布RFC文档,编号2616,对1.0进行了小幅度修正并正式成为标准,只要用到HTTP协议,必须准守这个标准,改进如下:

  1. 增加了PUT、DELETE等新方法
  2. 增加了缓存管理和控制
  3. 明确了连接管理,允许持久连接
  4. 允许响应数据分块。利于传输大数据
  5. 强制要求Host头,表示当前域名地址,让服务器根据不同host做不同处理,因为HTTP1.0时代一个服务器只能有一个域名,随着虚拟主机的发展,需要在一个物理主机上绑定多个虚拟主机,每个虚拟主机都公用同一个IP地址
  6. 引入客户端Cookie机制和安全机制

    缺点

持久连接虽然能减少TCP的建立和断开次数,但是他需要等待前一个请求返回之后才能进行下一次请求,这会导致对头阻塞问题

试图解决

采用管线化技术(将多个HTTP请求整批提交给服务器),不过虽然可以整批提交,但依然需要按照请求顺序来回复浏览器,因此都被火狐和谷歌放弃了

HTTP/2

再看HTTP/1.1

先来看看HTTP/1.1时代做了哪些提升网络效率的优化:

  1. 持久连接
  2. 浏览器为每个域名最多同时维护6个TCP连接
  3. 用CDN实现域名分片机制

    HTTP1.1的问题

对带宽的利用不理想,利用率低,很难将带宽用满,带宽指的是每秒最大发送(上行带宽)或接收(下行带宽)的字节数

原因

  1. TCP慢启动,因为一些关键资源文件本来就不大(HTML,CSS,JS),因为TCP连接后就要发请求,但由于慢启动导致耗费时间很慢,但慢启动是为了减少网络拥塞的策略,我们没办法改变
  2. 同时开启多条TCP连接,这些连接会竞争固定的带宽
  3. 对头阻塞问题

首看HTTP/2

多路复用

a.png
0a990f86ad9c19fd7d7620b2ef7ee900.jpg
总结:一个域名只使用一个TCP长连接和消除对头阻塞

多路复用的实现:
86cdf01a3af7f4f755d28917e58aae6a.png
具体执行步骤:

bin.png

其他特性

  1. 可以设置请求的优先级
  2. 服务器推送
  3. 头部压缩

HTTP/3

TCP协议的缺陷

虽然HTTP2解决了应用层的对头阻塞,但HTTP2依然是基于TCP协议的,而TCP最初就是基于单连接设计的,可以把TCP看成一个客户端与服务器之间的管道,如下图:这是HTTP/1.1的图解
c231ab4b825df8b6f730f484fce596f0.png
但是,如果有一个数据包丢失了,那么整个TCP连接就会暂停,等待丢失的那个包重新传过来
33d2b4c14a7a2f19ef6677696b67de96.png
总结:在TCP传输过程中,由于单个数据包的丢失造成的阻塞称为TCP上的对头阻塞
**
那么,对头阻塞是怎么影响HTTP2传输的呢:先看图
4837434655a6d87f1bf5e3d899a698d1.png
区别于HTTP1.1时代,每个域名对应6个TCP连接,HTTP2每个域名对应一个TCP连接,那么一个连接中出现丢包,会阻塞该TCP连接中的所有请求,随着丢包率的增加,HTTP2效率也会越来越差

当然,除了对他阻塞这个问题,还有影响传输效率的原因:建立连接的延时(RTT)
e98927e19b20349815fb8f499067cb4f.png
HTTP1.1和HTTP2都是基于TCP,每次TCP连接都有一个建立连接的过程(3次握手),如果有HTTPS,那么TLS又需要建立连接,这些建立连接的过程都是耗费时间的

我们可以改进TCP协议吗?

TCP导致上述问题,但我们无法对其改进,原因如下:

  1. 中间设备的僵化,互联网靠路由器、交换机等设备连接起来,这些设备大量使用了TCP特性,而且被设置后很少更新,如果客户端升级的TCP协议,当新协议的数据包经过这些设备时,设备不理解内容,数据会被丢掉
  2. 操作系统,TCP协议是基于操作系统内核来实现的,应用程序只能用,不能改,而且更新操作系统内核的话,很困难

终极解决方案

基于UDP实现类似TCP的多卢数据流,可靠传输等特性(QUIC协议
0bae470bb49747b9a59f9f4bb496a9c6.png
可以从图中看出一下特性:

  1. 实现了类似TCP的流量控制、传输可靠功能
  2. 集成TLS加密功能(使用TLS1.3,减少握手的RTT个数)
  3. 实现了HTTP2中的多路复用功能(实现了同一物理连接可以有多个独立的逻辑数据流),解决了TCP中对头阻塞

05cc5720989aec75730ee4cb7e7c149a.png

  1. 实现快速握手能力(基于UDP)

HTTP3的问题

  1. 服务器和浏览器没有对HTTP3提供完整支持
  2. 部署HTTP3困难,因为操作系统对UDP的优化没有TCP好
  3. 中间设备的僵化,设备对UDP的优化比TCP低的多

总结

  1. HTTP协议始于30年前的一篇论文
  2. HTTP/0.9是个简单的文本协议,只能获取文本资源
  3. HTTP/1.0确立了大部分现在使用的技术,但他不是正式标准
  4. HTTP/1.1是现在使用最广泛的协议,功能完善
  5. HTTP/2基于Google的SPDY协议,注重性能改善,但还未普及
  6. HTTP/3基于Google的QUIC协议,是将来的发展方向