做者:林冠宏 / 指尖下的幽灵html
掘金:juejin.im/user/587f0d…git
博客:www.cnblogs.com/linguanh/github
GitHub : github.com/af913337456…服务器
腾讯云专栏: cloud.tencent.com/developer/u…网络
虫洞区块链专栏:www.chongdongshequ.com/article/153…并发
超文本传输协议 HTTP 的 2.0 版本的协议在 2015 年的时候已经发布了。相比于前面的 HTTP 1.1 版本。它多出了下面三个主要的新特性。区块链
多路复用
流
二进制帧
片断HTTP 2.0 对 HTTP 的延迟问题起到了能够说是一个巨大的优化。下面的连接是网上的一个直观网站,它展现了一样是 300 多张图片,分别在 HTTP 1.1 和 HTTP 2.0 协议下加载的耗时。HTTP 2.0 的速度差很少是 HTTP 1.1 的6倍。优化
演示网站
下面咱们来直观地认识下它们。spa
二进制帧
在 TCP 协议中,数据的传输单位是数据报
。数据分红两大部分。头部(header) 和 实际数据部分(body)。
在 HTTP 2.0 中,它把数据报的两大部分分红了 header frame
和 data frame
。也就是头部帧和数据体帧。帧的传输最终在流中进行,流中的帧,头部(header)帧
和 data 帧
能够分为多个片断帧,例如data
帧便是能够 data = data_1 + data_2 + ... + data_n
。
此外地,若是基于二进制帧
总体来划分,除了报文的帧分类。还有其它一些辅助帧类型,例如评论中提到的:SETTINGS、PING、GOWAY、WINDOW_UPDATE等控制帧。
流
流
表明了一个完整的请求-响应
数据交互过程。它具备以下几个特色:
二进制帧
。帧在流上的被发送与被接收都是按照顺序进行的。二进制帧
都是被并行传输的,无需按顺序等待。但却不会引发数据混乱,由于每一个帧都有顺序标号。它们最终会被按照顺序标号来合并。下图来源于:https://blog.csdn.net/zqjflash/article/details/50179235
。它演示了流中的帧的有序性
与并行性
。例如数据报1
的 data frame
就没有连着一块儿传输,而是分红了2个。
帧是流中的数据单位。一个数据报的header 帧能够分红多个 header 帧,data 帧能够分红多个data 帧。
HTTP 2.0 的多路复用实际上是 HTTP 1.1 中长连接的升级版本。
在 HTTP 1.1 中,一次连接成功后,只要该连接还没断开,那么 client 端能够在这么一个连接中有序地发起多个请求,并以此得到每一个请求对应的响应数据。它的缺点是,一次请求与响应的交互必需要等待前面的请求交互完成,不然后面的只能等待,这个就是线头阻塞
。下面举个例子:
请求A 和 请求B。A 先被发起,此时 server 端接收到了 A 请求,正在处理。同时 B 请求也发过来了。可是 A 请求还没被返回,此时 B 请求只能等待。
在 HTTP 2.0 中,一次连接成功后,只要连接还没断开,那么 client 端就能够在一个连接中并发地
发起多个请求,每一个请求及该请求的响应不须要等待其余的请求,某个请求任务耗时严重,不会影响到其它链接的正常执行。
下面经过图来看看:
由于这上述这三个特性,让 HTTP 2.0 在数据的传输延迟上,起到了很大的优化做用。
最简单的方法,代码中,使用网络请求,在构造请求参数的时候,在 http 请求头部指定 protocol 版本便可,例以下面例子:
http 1.1 的
GET /index HTTP/1.1
Host: www.xxx.com
复制代码
本文参考于: