随着web技术的飞速发展,1999年制定的HTTP 1.1已经无法满足大家对性能的要求,Google推出协议SPDY,旨在解决HTTP 1.1中广为人知的性能问题。SPDY得到了Chrome、Firefox和Opera的支持,很多大型网站(如谷歌、Twitter、Facebook、淘宝)都对兼容客户端使用SPDY。SPDY在被行业采用并证明能够大幅提升性能之后,已经具备了成为一个标准的条件。

HTTP工作组采用了SPDY v2草案作为制定HTTP 2.0标准的起点,2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540正式发表。至此,SPDY完成了历史的使命,即将退出历史的舞台,HTTP/2粉墨登场。

在HTTP的语义、HTTP方法、状态码、URI和首部字段等核心概念不变的情况下,HTTP/2实现了性能优化,HTTP/2具体有哪些变化呢?下面一一解答 O(∩_∩)O~

二进制分帧(Binary Framing)

HTTP1.x以换行符作为纯文本的分隔符。

HTTP/2将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,我们先了解几个概念:

  • 帧(Frame):HTTP/2通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流。
  • 消息(Message):由一个或多个帧组合而成,例如请求和响应。
  • 连接(Connection):与 HTTP/1 相同,都是指对应的 TCP 连接;
  • 流(Stream):已建立的连接上的双向字节流。

在HTTP/2中,数据流以消息的形式发送,而消息由一个或多个帧组成,帧可以在数据流上乱序发送,然后再根据每个帧首部的流标识符重新组装。二进制分帧是HTTP/2的基石,其他优化都是在这一基础上来实现的。

多路复用(Request and Response Multiplexing)

HTTP1.x中,如果想并发多个请求,必须使用多个TCP链接,且浏览器为了控制资源,还会对单个域名有6-8的个数限制,如下图,红色圈出来的请求就因域名链接数已超过限制,而被挂起等待了一段时间: 
 
针对这一问题,我们做了很多优化,例如合并请求、图片精灵、散列域名等

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

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

这一特性,性能会有极大的提升,因为:

  • 同个域名只需要占用一个TCP连接,消除了因多个TCP连接而带来的延时和内存消耗。
  • 单个连接上可以并行交错的请求和响应,之间互不干扰。

流优先级( Stream priority)

在HTTP/2中,每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。

服务器推送(Server push)

Server push是HTTP/2中一个很强大的功能:

  • 服务器除了响应客户端的请求外,还可以向客户端额外推送资源。
  • 服务器推送的资源有自己独立的URL, 可以被浏览器缓存,可以达到多页面共享。
  • 资源推送遵守同源策略,服务器不可随便推送第三方资源给客户端。
  • 客户端可以拒绝推送过来的资源。

有了这一特性,我们可以做什么?

  • 应用可以通过额外的http头部,列出需要服务器推送哪些资源。
  • 服务器可以解析请求的html,推测出客户端接下来需要请求的资源,然后提前向客户端推送。
  • 等等

头部压缩(Header Compression)

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

在HTTP 1.x中,这些信息都是以纯文本协议发送的,给每个请求增加了不小的负荷。

为了减少这块的开销并提升性能, HTTP/2会压缩这些首部:

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

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

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

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

 
从上图可以看到,得益于头部压缩,第二个请求中cookie只占用了1个字节,我们来看看变化了的Accept字段: 
 
由于Accept字段与请求一中的内容不同,需要发送给服务器,所以占用了29 bytes。

应用层协商协议(APLN:Aplication Layer Protocol Negotiation)

客户端、服务器都需要升级才能支持HTTP 2.0,升级过程中就存在HTTP1.1、HTTP 2.0并存的情况,然而他们都使用的80端口,那么如何来选择使用什么协议通信呢?

APLN就是为了解决这个问题的,通过协商来选择通信的协议:

  1. 客户端发起请求,如果支持HTTP/2,则带upgrade头部: 
    GET /page HTTP/1.1 
    Host: server.example.com 
    Connection: Upgrade, HTTP2-Settings 
    Upgrade: HTTP/2.0 
    HTTP2-Settings: (SETTINGS payload) 
  2. 服务器不支持,则拒绝升级,通过HTTP1.1返回响应 
    HTTP/1.1 200 OK 
    Content-length: 243 
    Content-type: text/html 
    (... HTTP 1.1 response ...) 
  3. 服务器支持,则接受升级,切换到新分帧,使用HTTP/2通信。 
    HTTP/1.1 101 Switching Protocols 
    Connection: Upgrade 
    Upgrade: HTTP/2.0 
    (... HTTP 2.0 response ...) 

使用协议协商,无论是哪一种情况,都不需要额外的往返,如果客户端通过记录或者其他方式,知道服务器支持HTTP/2,则直接使用HTTP/2通信,无需再协议协商。

Ending

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

HTTP/2性能得到了极大的提升,我们在HTTP 1.1时代做的有些优化反而成了鸡肋,在升级过程中,如何让HTTP/2 和 HTTP 1.1的用户都能得到最优的性能,这是对于我们的另外一大挑战。

HTTP/2 h2 协议简介相关推荐

  1. ethernet/IP 协议简介 pdf

    目 录 1.现场总线控制技术与工业以太网 工业以太网实时性问题 3.Ethernet/IP协议简介 4.Ethernet/I P通信适配器硬件设计与实现 5.EtherNet/IP 工业以太网优缺点及 ...

  2. Python 14.1 TCP/IP协议简介

    TCP/IP协议简介 虽然大家对现在的互联网很熟悉,但是计算机网络比互联网出现的早得多. 为了把全世界不同的计算机都连起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Inte ...

  3. 【计算机网络】网络层 : BGP 协议 ( BGP 协议简介 | BGP 协议信息交换 | BGP 协议报文格式 | BGP-4 常用报文 | RIP 、OSPF、BGP 协议对比 )

    文章目录 一.路由选择协议分类 二.BGP 协议 简介 三.BGP 协议 信息交换过程 三.BGP 协议 报文格式 四.BGP 协议 特点 五.BGP-4 协议的 四种报文 六.RIP .OSPF.B ...

  4. 【计算机网络】网络层 : OSPF 协议 ( 协议简介 | 链路状态路由算法 | OSPF 区域 | OSPF 特点 )

    文章目录 一.路由选择协议分类 二.OSPF 协议 简介 三.链路状态路由算法 四.OSPF 区域 五.OSPF 特点 一.路由选择协议分类 路由选择协议分类 : ① 内部网管协议 IGP : 在 自 ...

  5. 动态路由选择协议简介

    原文地址:动态路由选择协议简介作者:心不在焉 Exterior Gateway Protocol 路由选择协议基础: 使用协议来查找网络并更新路由表的配置就是动态路由. 名词解释: AS(Autono ...

  6. Tsung MQTT协议简介及MQTT xml文档配置介绍

    MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...

  7. TACACS 协议简介与开发总结

    这个项目来源于国外某运营商客户的需求,整个开发流程除了参考基本的tacacs+协议外,还借鉴了Github上一个类似项目的设计,下面介绍下协议的基本内容和开发注意事项以及对接测试环境的搭建. 目录 0 ...

  8. Dubbo3 Triple 协议简介与选型思考

    Dubbo3 提供了 Triple(Dubbo3).Dubbo2 协议,这是 Dubbo 框架的原生协议.除此之外,Dubbo3 也对众多第三方协议进行了集成,并将它们纳入 Dubbo 的编程与服务治 ...

  9. python 全栈开发,Day66(web应用,http协议简介,web框架)

    一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...

最新文章

  1. java memcachedclient_memcached client — memcached client for java使用 | 学步园
  2. Objective -C Memory Management 内存管理 第一部分
  3. 这门国产编程语言,确实很棒!
  4. 将iOS默认上下文坐标系改变为Quartz通常坐标系
  5. 搭建hadoop和spark分布式环境
  6. 在linux里flash自动转图片
  7. 捕获 PHP 致命错误 Fatal Errors
  8. 我在使用Spring Gateway时遇到的一些坑
  9. CSS实现半透明边框
  10. 关于工业相机的基本知识
  11. eighth day for learning
  12. 融云集成一个聊天室页面(vue版本)
  13. HDS存储管理工具命令行汇总
  14. Mac 运行 JNLP 文件
  15. AS3多线程快速入门(三):NAPE物理引擎+Starling
  16. 中国电子学会2022年12月份青少年软件编程Python等级考试试卷四级真题(含答案)
  17. android 获取权限管理,Android获取超级管理员权限的实现
  18. ucweb7.0 for WM/PPC/SP/S60V1/S60V2/S60V3/S60V5/ 平台安装包下载
  19. 窥探MySQL索引与事务
  20. iOS 逆向编程(九 - 1)通过 USB 连接登录 iPhone 以及端口映射

热门文章

  1. QCOW2 — 再谈 COW、ROW 快照技术
  2. 在mac上安装 docker
  3. Countly 19.02.1 发布,实时移动和 web 分析报告平台
  4. Sublime Text3注册激活和部分配置
  5. 腾讯云+未来高峰对话:智能+时代的创新与探索
  6. 【IntelliJ idea/My/ecplise】启动项目前,修改配置JVM参数
  7. 73. 解决ExtJS TreePanel 的 iconCls设置问题
  8. Linux中表示“时间”的结构体和相关函数
  9. jquery ajax(实现单独提交某个form)
  10. 闭锁CountDownLatch和栅栏CyclicBarrier之异同举例