上篇文章介绍了http1.1相对于http2的一些不足,本篇文章来聊一聊http2的一些优点,但是http2的优点比较多,并且需要结合源码展示,所以关于htt2的一些特点,我打算拆分成多篇文章,本篇文章只讨论http2实现的多路复用功能。

回顾http1.1协议,我们了解到,虽然http1.1实现了tcp的长连接,在一个tcp链接通道中,我们可以连续处理多个http请求响应,但是这个处理过程是半双工模式,也就是同一时刻只能处理一个request的请求或者响应,后面的request必须等到前面的请求响应之后才能进行。

浏览器为了更加快速的加载页面资源,于是针对同一域名设置了最大并发数,这样做能稍微加快速度,但是也带了一些问题,参看上一篇文章http1.1相对http2有哪些不足。

http2完全摒弃http1.1半双工通信的方式,实现了全双工通信,具体表现为:浏览器针对同一个域名的资源,只建立一个tcp连接通道,所有的针对这个域名的请求全部在这个通道中完成,并且引入了流的机制,这条通道可以同时处理多个request,这不同于http1.1的pepeline,http2的多路复用,对于request的响应并不会因为上一个request的响应未完成而阻塞,http2彻底解决了http层面的队头阻塞。

http2中在一个tcp通道中的所有http请求不分先后,不会阻塞,同样是一个页面中多个资源同时去请求,用http2来实现的话,过程如图:

这张图与上一篇文章中http1.1版本中的图是有区别的,可以看到这里http请求并不会因为前面的请求未响应而阻塞。

我们来通过几张图来演示一下http1.1到http1.1的pipeline在到http2的进化。

先看第一张图:

仔细观察上图,发现在http1.1版本中的一个tcp通道中,这是一个单通道,同一时刻只能处理一个http请求,并且必须按照顺序。

再看第二张图:

仔细观察这张图,虽然在一个tcp通道中实现了多个http并发,但是返回的时候是会阻塞的,谁先到达,谁先返回,顺序绝对不能乱,这就是http1.1pipeline的弊端。还有另一个pipeline的限制,只能是幂等请求(get、head等)才能应用pipeline,大部分浏览器默认是关闭pipeline的。

再看第三张图:

这张图中在一个tcp链接通道中,同时进行多个http请求和响应,仔细观察请求顺序和响应顺序无关,速度相对于上面两张图明显变快,并且页面中的资源请求都在一个tcp通道中完成,有效的避免了tcp竞速,慢启动等因素。

上面只是演示了http2的传输方式,那么他是如何实现的呢?

http1.1是明文协议,解析http1.1的明文是基于文本。http2.0的协议采用的是二进制格式。

http2为什么要采用二进制格式呢?

1、基于文本解析的话,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多。

2、二进制则只认0和1的组合,解析速度更快。

那么在不改动 HTTP/1.1 的语义、⽅法、状态码、URI 以及⾸部字段等等的情况下, HTTP/2 是如何过渡到http1.1呢?

关键之⼀就是在应⽤层(HTTP/2)和传输层(TCP or UDP)之间增加⼀个⼆进制分帧层。如图:

在⼆进制分帧层中, HTTP/2 会将所有传输的信息分割为更⼩的消息并封装在帧(frame)中,并对它们采⽤⼆进制格式的编码 ,其中 HTTP1.1的⾸部信息会被封装到 HEADER frame,⽽相应的 Request Body 则封装到 DATA frame ⾥⾯。如上图的HEADER frame和DATA frame分别对应http1.1的请求头和请求体。

对比如图:

并且,HTTP/2 通信都在⼀个tcp连接上完成,这个连接会同时处理多个http的request,http2给每个http的request都分配唯一的streamId,而每个request切割出来的fram都共用这个streamId,这样的话http2就可以基于这个streamid将切割的信息还原,http2通道中同时处理多个request的方式类似处理多个流,所以有些文章会指出http2实现了流方式传递信息。如图:

上图中每个大的蓝色方块代表一个http的request,每个request被切割为多个fream,并且被编号,我们用黄红绿三种颜色分别代表三个stream流,不同的颜色代表不同的streamid,http2接收到数据会根据其streamid自动还原数据,这样就实现了在一个TCP连接通道中的流式传输,多个request都会复用这个TCP通道,实现了高效的复用。

总结一下:上文我们简单介绍了http2的多路复用功能,简单来说有如下几个特点:

1、http2针对同一个域名只建立一个TCP链接,所有http请求都通过这个TCP链接来完成。

2、http2将每个request切割为更小的帧,有header帧和body帧,并且给同一个request的帧分配相同的streamId,模拟实现了流的传输。

转载自https://cloud.tencent.com/developer/article/1573513

HTTP2.0多路复用相关推荐

  1. HTTP的前世今生(HTTP1.1,HTTPS,SPDY,HTTP2.0,QUIC,HTTP3.0)

    本文将从HTTP不断发展的时间线来讲解与其相关的知识点,其中包括HTTP1.1,HTTPS,SPDY,HTTP2.0,QUIC,HTTP3.0等,文章中内容涉及面较广,属于扫盲级别,不会特别深入某个知 ...

  2. HTTP1.0 HTTP1.1 HTTP2.0总结

    https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A https://blog.csdn.net/striveb/article/details/8423 ...

  3. HTTP1.0 、 HTTP1.1、HTTP2.0的主要区别

    HTTP1.0 VS HTTP1.1 长连接: HTTP1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接(PersistentConnection) ...

  4. HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比

    本篇是对HTTP不同版本主要特性的一个概述和总结. HTTP1.0 早先1.0的HTTP版本,是一种无状态.无连接的应用层协议. HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要 ...

  5. HTTP长相随--期盼已久的HTTP2.0、WebDAV协议、 QUICHTTP3.0

    期盼已久的HTTP2.0 HTTP2.0性能增强的核心:二进制分帧 HTTP2.0首部压缩: HTTP2.0多路复用 : 单链接多资源的优势: 可以减少服务链接压力,内存占用少了,链接吞吐量大了 由于 ...

  6. go学习笔记 http2.0使用【SAN 和双向认证】以及dotnetcore5.0的调用

    简单说一下我的环境 win7+go1.15.6,GO1.15   X509 不能用了 ,需要用到SAN证书, 证书 需要用到SAN证书,下面就介绍一下SAN证书生成.首先需要下载 OpenSSL ht ...

  7. http2.0的时代来了

    KS Knowledge Sharing 知识分享 现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享! 开篇HTTP发展的心路历程 上图:连接无法复用 上图: ...

  8. 【网络】HTTP2.0新特性

    前段时间实习生面试的时候被问到HTTP2.0以及和HTTP1.1的区别,貌似网上对这一块的讲解很少,而且大多数就是空洞的理论堆砌,看也看不懂.不过花点时间慢慢找还是可以找到很不错的资料的.整理如下,希 ...

  9. HTTP1.0,HTTP1.1,HTTPS和HTTP2.0的区别

    HTTP1.0和HTTP1.1的一些区别 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控 ...

最新文章

  1. Intellij IDEA必备插件,提高效率的“七种武器”!
  2. 影响计算机算法世界的十位大师(上)
  3. 第十六届全国大学生智能车竞赛技术报告 | 单车拉力组- 上海海事大学-骑摩托的蒙娜丽莎
  4. 0.1 hint crack
  5. 洛谷1850(NOIp2016) 换教室——期望dp
  6. 骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)
  7. java spring cloud版b2b2c社交电商spring cloud分布式微服务:服务注册与发现(Eureka、Consul)...
  8. 在开发过程中调试报表插件详细教程
  9. MVVM设计模式和在WPF中的实现(四) 事件绑定
  10. linux大文件分割与合并
  11. code forces 1176 D. Recover it!
  12. 报错:fdfs while reading from socket: (timed out))
  13. ttest求pvalue_统计中t检验法中P值该怎样计算
  14. 利用Photos 框架搭建美图秀秀相册选择器
  15. LaTeX 长度和单位 Lengths Units
  16. python电影推荐系统_电影推荐系统---协同过滤算法(SVD,NMF)
  17. 大学计算机应用基础绩点,出国留学如何计算GPA平均分
  18. RGB及sRGB与XYZ坐标转换
  19. 程序员年薪20万、30万、40万都是如何生活的?
  20. Java接口继承接口

热门文章

  1. 在云服务器上部署的项目一直运可以怎么做
  2. Flying Squirrel Creek
  3. 解决“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”
  4. java设置excel单元格文本右对齐,POI操作Excel--设置单元格对齐方式--day03
  5. 网页动态效果——随鼠标移动的动态触击式线条
  6. 使用Weka进行数据可视化
  7. Symantec Ghost Solution Suite简介
  8. 什么是线性表?线性表的特点,线性表的顺序存储和链式存储
  9. python打印日历_Python实战练习——打印日历教程
  10. ViewFlipper用法