作者:林冠宏 / 指尖下的幽灵
掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8
博客:http://www.cnblogs.com/linguanh/
GitHub : https://github.com/af913337456/
腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities
虫洞区块链专栏:https://www.chongdongshequ.com/article/1536563643883.html
超文本传输协议 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倍。
下面我们来直观地认识下它们。
首先是二进制帧
在 TCP 协议中,数据的传输单位是数据报
。数据分成两大部分。头部(header) 和 实际数据部分(body)。
在 HTTP 2.0 中,它把数据报的两大部分分成了 header frame
和 data frame
。也就是头部帧和数据体帧。帧的传输最终在流中进行,流中的帧,头部帧不可再分,data 帧可以分为多个 data 帧。
其次是流
流
代表了一个完整的请求-响应
数据交互过程。它具有如下几个特点:
- 双向性:同一个流内,可同时发送和接受数据。
- 有序性:流中被传输的数据就是
二进制帧
。帧在流上的被发送与被接收都是按照顺序进行的。 - 并行性:流中的
二进制帧
都是被并行传输的,无需按顺序等待。但却不会引起数据混乱,因为每个帧都有顺序标号。它们最终会被按照顺序标号来合并。 - 流的创建:流可以被客户端或服务器单方面建立, 使用或共享。
- 流的关闭:流也可以被任意一方关闭。
下图来源于:https://blog.csdn.net/zqjflash/article/details/50179235
。它演示了流中的帧的有序性
与并行性
。例如数据报1
的 data frame
就没有连着一起传输,而是分成了2个。
总结一下流和帧的关系
帧是流中的数据单位。一个数据报的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 端就可以在一个链接中并发地
发起多个请求,每个请求及该请求的响应不需要等待其他的请求,某个请求任务耗时严重,不会影响到其它连接的正常执行。
下面通过图来看看:
参考:https://blog.csdn.net/yangguosb/article/details/80639336