夸夸其谈,简单说说HTTP的优化历程
HTTP
(超文本传输)协议,它是Web
上任何数据交换的基础,同时也是一个客户端-服务器协议;这些年间,HTTP经历很多变化,也有助于塑造其灵活性,下面我们来简单谈谈HTTP在各个版本做了哪些改变
通过本文,你将了解学习到如下内容
HTTP
这些年来,在迭代过程做了哪些优化,以及存在哪些不足?HTTP0.9
、Http1.0
和Http1.1
、SPDY
及2.0
、QUIC(HTTP 3.0)
各个版本的变化
HTTP/0.9—单行协议
在早期最初的HTTP
版本中,它非常简单,也被称为单行协议。顾名思义,请求由一行组成,并以唯一可能的方法开始,GET
后跟上资源的路径,最终的响应也只包含文件本身,没有状态码和错误码,并且由于没有HTTP
标头,它不能传输除HTML
以外的文件
<html>
Hello World
</html>
复制代码
HTTP/1.0—构建可扩展化
对于HTTP1.0,它最早在网页中使用是1996年,而该版本的出现意味着在浏览器和服务器中变得更加通用起来,引入了HTTP标头的概念,让协议变得非常灵活和可扩展。
感兴趣的小伙伴可以查看官方1996 年 11 月发布了一份描述常见做法的信息文档
它被称为并定义了 HTTP/1.0
HTTP1.0
是一种无状态、无连接的应用层协议。
它规定每次让客户端和服务器都保持短连接,这也意味这它的连接是不复用的,每次在发起网络请求的时候都需要重写建立TCP连接;
同时如果有多个网络请求的时候,它规定必须等待前一个请求响应之后,才会发送下一个网络请求,这就是所谓的队头阻塞(head of line blocking)
HTTP/1.1—标准化协议
由于HTTP1.0
的网络使用效率非常低效,每次请求都需要重新建立TCP
连接,为了克服了诸多HTTP1.0
性能上的问题,HTTP1.1
出现了,作为HTTP
的第一个标准化版本HTTP/1.1
于 1997 年初发布,仅比 HTTP/1.0
晚了几个月,并且在1999年广泛运用于现在各大浏览器网络请求中
感兴趣的小伙伴可以阅读1997 年 1 月发布的HTTP1.1的信息文档
它可以重复使用连接,节省了响应的时间,引入了持久连接,不再需要多次打开才能显示嵌入在单个原始文档中的资源,默认开启
Connection: keep-alive
引入了额外更多缓存策略控制,例如
cache-control
等, 不单单只有1.0中提供的headers
的expires
作为缓存判断标准已经具备支持断点续传的能力,由于
HTTP/1.0
存在浪费带宽的现象,客户端只需要一部分数据,而服务端却将全部数据发送过来了;对此Http1.1
做了相应的带宽优化,可以进行分块响应,在header
引入了range
域,允许只请求一部分,让开发者可充分利用带宽,避免浪费引入了内容协商,包括语言、编码和类型。客户端和服务器现在可以就交换哪些内容达成一致,并且在错误通知管理上做了优化,增加了24个错误状态码,比如410表示服务端上数据被永久删除等等
对于
Host
头做了处理,一台服务器上可以有多个虚拟主机,共享同一个IP地址,这也意味着HTTP1.1
有从同一IP
地址托管不同域的能力
存在的缺陷
虽然
HTTP1.1
让TCP
连接可以复用,但依旧没有解决队头阻塞的问题,也就是后面的请求依然需要等待前一个请求完成后才能进行,不允许存在两个并行的响应;由于所有请求都集中在一条连接中,在网络拥塞的情况下就很容易造成队头阻塞相对低效的
TCP
利用,HTTP1.1
无法充分利用TCP
提供的所有性能,如果有多个请求的时候,HTTP1.0
会开启多个TCP
连接来同时处理多个请求,这样以来,当网络资源增多的时候,这个加载时间也会随之增加。由于队首阻塞的问题,即便网络带宽再打也无法被充分利用,对于网络延迟也是非常敏感的,过高的延迟会导致页面访问速度直线下滑
Google SPDY
SPDY
作为Google
开发的基于TCP
的应用层协议,目的就是为了提供网页访问速度和提高安全性;它对于之前的HTTP1.1
在性能上做了优化,它并不是一种HTTP
协议的替代方案,而是对HTTP
协议的增强,SPDY
主要有如下几个方面的优势:
SPDY
是允许在单个TCP
连接上多次请求,不需要单独开放连接,有效避免了开启多个TCP
连接造成的网络延迟,简单来说,就是多路复用TCP
通道,降低HTTP
的高延时。对于多路复用,
SPDY
允许请求设置优先级,不必像之前HTTP
一样遵从先入先出的按顺序处理请求。头部压缩,舍弃掉了不必要的头部信息,可以节省一些等待时间。
基于SSL的安全传输,它是被
Google
强制使用的,经过SSL加密后,让请求传输变得安全。
虽然SPDY
相对之前HTTP
版本来说已经很优秀了,但它依旧是使用文本格式解析的协议
HTTP/2.0—更高性能的协议
对于2010年Google
推出的SPDY
实验性协议,它响应能力的提高并解决了重复数据传输的问题,作为了HTTP2.0
协议的基础。对于HTTP2.0
的新特性,如下文所述:
HTTP2.0
相比之前版本的HTTP
和SPDY
最大的不同在于它的协议解析采用二进制格式,目的是为了避免文本解析的天然缺陷,文本格式表现形式有很多不同,要考虑的场景很多,而由于二进制格式只有0和1,所以会更加方便;HTTP2.0
为此专门增加了二进制分帧层,将传输信息分割成帧,并进行二进制编码帧的使用会更加便捷,更容易获取到协议本身的内容
数据流以消息的形式发送,每个消息是由一个或多个帧组成
由于是基于
SPDY
的改进的协议,它同样是多路复用TCP
的,即所有请求通信都在一个TCP
连接上完成;同时,服务端与客户端是双向实时通信的,即连接共享;减少了网络返回传输的数据量,并且提高了相应网络的访问速度,相比
HTTP1.x
请求资源的时间消耗更少HTTP2.0
相比SPDY
同样由加密组的限制,但不同的是,它允许明文传输,而SPDY
是强制进行SSL/TLS加密传输压缩请求头,消除了传输数据的重复和开销
服务器推送,它允许服务器通过称为服务器推送的机制在客户端缓存中填充数据
存在的缺陷
虽然
HTTP2.0
通过多路复用解决了HTTP
层,但本身是基于TCP
来实现的,所以在TCP
层依旧存在队头阻塞的问题,简单来说,TCP
在收到数据包后,里面的数据有可能是乱序的,TCP
需要排序整理之后才给上层使用,如果某个包丢失了,就必须要等待重传,因为这个丢失的包从而导致了整个连接被阻塞了。由于是基于
TCP
连接,总所周知,它是可靠的,面向连接的传输协议,但是它加载速度相对缓慢,而网络环境改变速度很快,归根结底,其本质就是TCP
的问题。
QUIC(HTTP/3.0)
Google
2013年实现,QUIC
的出现旨在为 HTTP
连接提供更低的延迟,和HTTP2.0
一样,它也是一个多路复用协议,到了2018年 这个基于QUIC
协议的HTTP
才正式被确认为HTTP3.0
;
QUIC
可以简单理解为 HTTP 2.0 + TLS 1.3 + UDP
解决了在连接复用中
HTTP 2.0 + TCP
存在的队首阻塞问题,前面说过HTTP2.0
是运行在单个TCP
连接上的,因此TCP
层处理的丢包检测和重传可以阻止所有流,这样的话是有可能导致队首阻塞的,而QUIC
在UDP
上运行多个流,并为每个流独立实现丢包检测和重传,这样如果发生错误,只会阻塞该数据包中包含数据的流。由于是基于
UDP
,所以可以灵活控制拥塞协议,并且它可以支持快速握手,减少了TCP
三次握手及TLS
握手的时间,并优化了失败重传策略和流量控制算法。连接迁移:采用了类似
Connection id
的特性,不需要在切换网络的时候重新连接,这样用户在使用APP
的体验会更加流畅