HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议。由互联网工程任务组(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540正式发表。

那 HTTP/2 到底有哪些具体变化呢?

二进制分帧

先来理解几个概念:

帧:HTTP/2 数据通信的最小单位消息:指 HTTP/2 中逻辑上的 HTTP 消息。例如请求和响应等,消息由一个或多个帧组成。

流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数ID。

HTTP/2 采用二进制格式传输数据,而非 HTTP 1.x 的文本格式,二进制协议解析起来更高效。 HTTP / 1 的请求和响应报文,都是由起始行,首部和实体正文(可选)组成,各部分之间以文本换行符分隔。HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。

HTTP/2 中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。

多路复用

多路复用,代替原来的序列和阻塞机制。所有就是请求的都是通过一个 TCP连接并发完成。 HTTP 1.x 中,如果想并发多个请求,必须使用多个 TCP 链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制,如下图,红色圈出来的请求就因域名链接数已超过限制,而被挂起等待了一段时间:

在 HTTP/2 中,有了二进制分帧之后,HTTP /2 不再依赖 TCP 链接去实现多流并行了,在 HTTP/2中:

  • 同域名下所有通信都在单个连接上完成。
  • 单个连接可以承载任意数量的双向数据流。
  • 数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装。

这一特性,使性能有了极大提升:

  • 同个域名只需要占用一个 TCP 连接,消除了因多个 TCP 连接而带来的延时和内存消耗。
  • 单个连接上可以并行交错的请求和响应,之间互不干扰。
  • 在HTTP/2中,每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。

服务器推送

服务端可以在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把JS和CSS文件推送给客户端,而不需要客户端解析HTML时再发送这些请求。

服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三方资源给客户端。

头部压缩

HTTP 1.1请求的大小变得越来越大,有时甚至会大于TCP窗口的初始大小,因为它们需要等待带着ACK的响应回来以后才能继续被发送。HTTP/2对消息头采用HPACK(专为http/2头部设计的压缩格式)进行压缩传输,能够节省消息头占用的网络的流量。而HTTP/1.x每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。

HTTP每一次通信都会携带一组头部,用于描述这次通信的的资源、浏览器属性、cookie等,例如

为了减少这块的资源消耗并提升性能, HTTP/2对这些首部采取了压缩策略:

  • HTTP/2在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;
  • 首部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新;
  • 每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值。

例如:下图中的两个请求, 请求一发送了所有的头部字段,第二个请求则只需要发送差异数据,这样可以减少冗余数据,降低开销。

我们来看一个实际的例子,下面是用WireShark抓取的访问google首页的包:

上图是是访问 https://www.google.com/ 抓到的第一个请求的头部,可以看到头部的内容,总共占用了437 bytes,我们选中头部的cookie,可以看到cookie总共占用了118 bytes。接下来我们看看第二个请求的头部:

从上图可以看到,得益于头部压缩,第二个请求中cookie只占用了1个字节,我们来看看变化了的Accept字段:

由于Accept字段与请求一中的内容不同,需要发送给服务器,所以占用了29 bytes。

相关推荐

浏览器和网络服务支持情况:http2支持清单

如何快速启用HTTP2: 又拍云文档中心

HTTP/2 和 HTTP/1 速度对比:HTTP/2: the Future of the Internet

结语

HTTP/2的通过支持请求与响应的多路复用来减少延迟,通过压缩HTTP首部字段将协议开销降至最低,同时增加对请求优先级和服务器端推送的支持。

参考资料:

  1. Jerry Qu blog 中的HTTP/2专题;
  2. 维基百科:HTTP/2
  3. RFC 7540 – 超文本传输协议第2版(HTTP / 2)
  4. FC 7541 – HPACK:HTTP / 2的头压缩
  5. http2讲解

转载于:https://www.cnblogs.com/upyun/p/6775134.html

一文读懂 HTTP/2 特性相关推荐

  1. 一文读懂HTTP/2及HTTP/3特性

    前言 HTTP/2 相比于 HTTP/1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何优雅降级应该是国内还不普遍使用的原因之一. 虽然 ...

  2. 一文读懂无线信道传播的各种特性

    通过无线信道传播的信号沿着大量不同的路径到达目的地,这些不同路径称为多径.图 1 是一位沿公路驾车的典型移动用户的图形.该图描述了从发射机到接收机的众多信号路径中的三条.这些路径源自环境中物体对辐射能 ...

  3. 一文读懂机器学习中的模型偏差

    一文读懂机器学习中的模型偏差 http://blog.sina.com.cn/s/blog_cfa68e330102yz2c.html 在人工智能(AI)和机器学习(ML)领域,将预测模型参与决策过程 ...

  4. 一文读懂HttpServletRequest

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 全网最全电子图书分享 你所需要的大数据视频 ...

  5. java中date类型如何赋值_一文读懂java中的Reference和引用类型

    简介 java中有值类型也有引用类型,引用类型一般是针对于java中对象来说的,今天介绍一下java中的引用类型.java为引用类型专门定义了一个类叫做Reference.Reference是跟jav ...

  6. 一文读懂浏览器存储与缓存机制

    浏览器存储 Cookie Cookie 是 HTTP 协议的一种无状态协议.当请求服务器时,HTTP 请求都需要携带 Cookie,用来验证用户身份.Cookie 由服务端生成,存储在客户端,用来维持 ...

  7. 区块链产业生态、存在问题及政策建议|一文读懂新趋势

    区块链产业生态.存在问题及政策建议|一文读懂新趋势 2017-03-03 09:47:50  来源: 腾讯研究院抢沙发 摘要:从技术上来讲,区块链是一种分布式的记账方法.说到记账,我们经历了从实物记账 ...

  8. 独家 | 一文读懂语音识别(附学习资源)

    原标题:独家 | 一文读懂语音识别(附学习资源) 一.前言 6月27日,美国权威科技杂志<MIT科技评论>公布2017全球最聪明50家公司榜单.科大讯飞名列中国第一.全球第六.全世界排在科 ...

  9. 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程

    本文引用了"一文读懂什么是进程.线程.协程"一文的主要内容,感谢原作者的无私分享. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早 ...

最新文章

  1. 机器学习特征工程之连续变量离散化:等频分箱
  2. 云计算还是python_云计算 与python
  3. c++ 编译添加dll_linux下编写C/C++代码须知———串讲
  4. (SpringMVC)Controller返回JSON数据
  5. 一文读懂 K8s 持久化存储流程
  6. 用java实现冒泡排序_Java实现冒泡排序
  7. 够学习一辈子的生活经典
  8. NLTK使用英文词性还原
  9. NIOS2-IDE环境下的一些操作技巧
  10. Node有什么特点?
  11. linux 3.10的kdump配置的小坑
  12. 对大家的工作和职业方向有益才是我的最终目的
  13. css 禁止录入中文
  14. 解决办法:KeyError: ‘ExpandBackward’及老版本pytorch/torchvision的安装办法。
  15. 是计算机系男神女神用英语怎么说,生日快乐我的男神英文怎么写
  16. Arthas线上问题定位神器
  17. 好玩的手机android游戏,好玩的android手机游戏2018_热门android游戏排行榜
  18. 高德地图sdk设置marker并且将设置为地图中心
  19. html怎么搞滚动字幕,抖音滚动字幕怎么弄 滚动字幕怎么做
  20. CNS文章代码学习(一)Immunity 三级淋巴结构

热门文章

  1. 如何通便清肠快速见效_如何三个月合理瘦身减脂
  2. linux中mongo的导出数据,Linux下mongodb安装及数据导入导出教程(示例代码)
  3. python编写脚本替换 jar包文件_shell-替换jar包中配置文件脚本
  4. 最强的游戏计算机,这可能是市面上体积最小性能最强的游戏主机了
  5. 相角裕量的指令 matlab,[转载]什么是相角裕量、增益裕量?
  6. CyclicBarrier(回环栅栏)
  7. oracle三种删除的区别,三种批量删除PLSQL写法效率的比对
  8. select * 映射错误_高性能IO模型分析-浅析Select、Poll、Epoll机制(三)
  9. mysql置疑原因_SQLSERVER数据库经常置疑的原因
  10. linux db2 强制停止,DB2强制退出ROLLBACK状态