掘金: 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 倍.
演示 https://http2.akamai.com/demo
下面我们来直观地认识下它们.
首先是二进制帧
在 TCP 协议中, 数据的传输单位是数据报. 数据分成两大部分. 头部 (header) 和 实际数据部分 (body).
在 HTTP 2.0 中, 它把数据报的两大部分分成了 header frame 和 data frame. 也就是头部帧和数据体帧. 帧的传输最终在流中进行, 流中的帧, 头部帧不可再分, data 帧可以分为多个 data 帧, 即是可以 data = data_1 + data_2 + ... + data_n.
其次是流
流代表了一个完整的请求 - 响应数据交互过程. 它具有如下几个特点:
双向性: 同一个流内, 可同时发送和接受数据.
有序性: 流中被传输的数据就是二进制帧 . 帧在流上的被发送与被接收都是按照顺序进行的.
并行性: 流中的 二进制帧 都是被并行传输的, 无需按顺序等待. 但却不会引起数据混乱, 因为每个帧都有顺序标号. 它们最终会被按照顺序标号来合并.
流的创建: 流可以被客户端或服务器单方面建立, 使用或共享.
流的关闭: 流也可以被任意一方关闭.
下图来源于: 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 端就可以在一个链接中并发地发起多个请求, 每个请求及该请求的响应不需要等待其他的请求, 某个请求任务耗时严重, 不会影响到其它连接的正常执行.
下面通过图来看看:
因为这上述这三个特性, 让 HTTP 2.0 在数据的传输延迟上, 起到了很大的优化作用.
那么, 在我们的代码中, 如何指定使用 HTTP 2.0 协议呢?
最简单的方法, 代码中, 使用网络请求的时候, 构造请求参数的时候, 在 http 请求头部指定 protocol 版本即可, 例如下面例子:
http 1.1 的
- GET /index HTTP/1.1
- Host: www.xxx.com
本文参考于: https://blog.csdn.net/yangguosb/article/details/80639336
完
来源: https://juejin.im/post/5c88f2066fb9a049c043e420