深入浅出HTTP(2)

216 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情

上一篇文章深入浅出HTTP(1)主要了解了HTTP报文的真实面目。本文则来了解一下HTTP从1到2的发展史。

HTTP的特点

HTTP灵活,无状态等特点可以说既是缺点也是优点。具体总结下来,HTTP主要有以下几个特点:

  1. HTTP 是灵活可扩展的,可以任意添加头字段实现任意功能;
  2. HTTP 是可靠传输协议,基于 TCP/IP 协议“尽量”保证数据的送达;
  3. HTTP 是应用层协议,比 FTP、SSH 等更通用功能更多,能够传输任意数据;
  4. HTTP 使用了请求 - 应答模式,客户端主动发起请求,服务器被动回复请求;
  5. HTTP 本质上是无状态的,每个请求都是互相独立、毫无关联的,协议不要求客户端或服务器记录请求相关的信息。

HTTP1.0和HTTP1.1

1.首先是缓存方面的处理,在HTTP1.0中主要使用的header中的If-Modified-Since,Expires来作为协商缓存判断的标准,但HTTP1.1则可以由更多的选择来控制缓存策略,如Entity tag,If-Unmodified-Since,If-Match,If-None-Match等。

2.第二方面主要体现在宽带优化和网络连接的使用。在HTTP1.0中会存在一些浪费带宽的现象。即当客户端只想要某一部分时,服务器仍会将整个对象传过来,且不支持断点续传。而在HTTP1.1则在请求头引入了range头域,允许只请求资源的某个部分。

3.在错误通知方面,HTTP1.1新增了24个错误状态响应码。

4.在Host头处理方面,HTTP1.0的请求消息中的URL并没有传递主机名,而现在HTTP1.1的请求消息和响应消息都支持Host头域,且请求消息中如果没有头域会报400的报错。

5.HTTP1.1相比于1.0,支持了长连接和请求的流水线处理。在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

HTTP1和HTTP2

由于以前的1.0,1.1容易给人造成误解,所以HTTP协议决定不再使用小版本,而是使用大版本。那么,HTTP2 又做了哪些改进性能的修改呢?

首先HTTP2对HTTP1是完全兼容的。实现平滑过渡。在语义保持稳定之后,HTTP/2 在语法层做了天翻地覆的改造,完全变更了 HTTP 报文的传输格式。

1.头部压缩

由上文我们可以看到HTTP的报文头部,是个不折不扣的大头儿子,因此HTTP2对头部进行压缩,开发了专门的 HPACK算法,在客户端和服务器两端建立「字典」,用索引号表示重复的字符串,还釆用哈夫曼编码来压缩整数和字符串,可以达到 50%~90% 的高压缩率。

2.二进制分帧

HTTP1的报文都是文本格式的,一目了然,然而HTTP2则全面采用了二进制格式,大大方便了计算机的解析。并且把TCP协议的部分特性挪到了应用层,把原来的Header-Body的消息打散成无数个小片的二进制帧,用HEADER帧存放头数据、DATA帧存放实体数据。

3.多路复用

HTTP2引入了流的概念,是二进制帧的双向传输序列,同一消息往返的帧会分配一个唯一的流ID。因此,HTTP2就可以在一个TCP连接上用流同时发送多个碎片化消息,也就是多路复用:多个往返通信都复用一个连接来处理。这样就不会出现对头阻塞的问题,降低了延迟,大幅提高连接的利用率。

4.服务器推送

HTTP/2 还在一定程度上改变了传统的请求 - 应答工作模式,服务器不再是完全被动地响应请求,也可以新建流主动向客户端发送消息

5.增强了安全性

HTTP2 也增强了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密码套件。