从http1.1到http2

前言

对于 http 协议大家应该不陌生吧,我们在日常开发中最常打交道的协议也就是它了。关于 http 协议的基本介绍这里就省略了,本文重点讲述 为什么要从 http1.1 到 http2。

http1.1

大家都知道 http1.1 默认是开启了 Keep-Alive
的,这样建立的 TCP 连接,就可以在多次请求中复用。
在这里插入图片描述
这儿就有一个问题了,http1.1 是请求应答的模型,也就是说发送了一个请求后会等到回复之后才会发送下一个请求,比如请求一个网址的时候通常会请求html,图片,css,js 等大量的资源,通常会发很多个请求,而这多个请求通常是“排着队去请求的”,这就是著名的 http 队头阻塞。
在这里插入图片描述

为了解决这个问题,大家开始考虑什么域名分片啊,或者开多个连接啊,可这没有从根本上解决问题啊。

其次,http1.1 在应用层是纯文本的格式,并且请求头冗长,每个请求都要带上完整的 header ,我们知道 http1.1 里可以用头字段“Content-Encoding”指定 Body 的编码方式,比如用 gzip 压缩来节约带宽,但 header 部分却被无视了,没有针对它的优化手段,这也是为什么 http1.1 的性能问题一直为人诟病。

http2

为了优化 http1.1 的性能,Google 发明了 SPDY 协议(现在一般称为 http2 ),并应用于自家的 Chrome 浏览器 。

下面咱们来看看 http2 到底是怎么优化的吧。
头部压缩
http2 会对 http 的 header 进行一定的压缩,但是它没有使用传统的压缩算法,而是开发了“HPACK”算法,在客户端和服务器两端建立“字典”,对相同的头只发送索引表中的索引。并且还釆用哈夫曼编码来压缩整数和字符串,这使得请求头的大小变得很小,提高了传输效率。不仅如此,http2 对于整个报文采用了二进制编码,大大方便了计算机的解析。
请求“流”
http2 将一个 TCP 的连接中的多个请求虚拟成多个流,并且在 http2 协议中一个请求会被分割为“HEADERS”帧(存放header数据)和“DATA”帧(存放body数据)。每个流都有自己的流ID,同一个请求的“HEADERS”帧和“DATA”帧的流 ID 相同,通过相同的流 ID 可以将一个请求的 header 和 data 合并,而且流可以是客户端发往服务端,也可以是服务端发往客户端。

并且流是有优先级的。

HTTP 2.0 还将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码。常见的帧有Header 帧,用于传输 Header 内容,并且会开启一个新的流。再就是Data 帧,用来传输正文实体。多个 Data 帧属于同一个流。

通过这两种机制,HTTP 2.0 的客户端可以将多个请求分到不同的流中,然后将请求内容拆成帧,进行二进制传输。这些帧可以打散乱序发送, 然后根据每个帧首部的流标识符重新组装,并且可以根据优先级,决定优先处理哪个流的数据。

在这里插入图片描述
这里我故意将应答 css 画在了应答 html 前面,旨在表明流可能是乱序的。

HTTP/2 使用虚拟的“流”传输消息,解决了困扰多年的“队头阻塞”问题,同时实现了“多路复用”,提高连接的利用率。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值