HTTP/2

HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新,HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 在「2016 年初结束对 SPDY 的支持」;Nginx在版本1.9.5+,Apache在版本2.4.16+都已经全面支持HTTP/2。

首先看看HTTP/2的一些新特性:

  • 二进制分帧

  • 首部压缩

  • 流量控制

  • 二进制分帧

    二进制分帧层,是HTTP2.0性能增强的核心。

    HTTP 1.x在应用层以纯文本的形式进行通信,HTTP2.0在不改变HTTP1.x的语义、方法、状态码、URL以及首部字段的情况下,为了突破原有性能限制,在应用层(HTTP)和传输层(TCP)之间增加了一个二进制分帧层。HTTP2.0将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码,如下图所示。

  • 这里引入一个新的通信单位:帧。

    帧是HTTP 2.0通信的最小单位,包括帧首部、流标识符、优先值和帧净荷等。

  • 其中,帧类型可以分为:

    • DATA:用于传输HTTP消息体

    • HEADERS:用于传输首部字段

    • SETTINGS:用于约定客户端和服务端的配置数据。比如设置初识的双向流量控制窗口大小

    • WINDOW_UPDATE:用于调整个别流或个别连接的流量

    • PRIORITY:用于指定或重新指定引用资源的优先级

    • RST_STREAM:用于通知流的非正常终止

    • PUSH_ PROMISE:服务端推送许可

    • PING:用于计算往返时间,执行“ 活性” 检活

    • GOAWAY:用于通知对端停止在当前连接中创建流

    标志位,用于不同的帧类型定义特定的消息标志。比如DATA帧就可以使用End Stream: true表示该条消息通信完毕;流标识位表示帧所属的流ID;优先值用于HEADERS帧,表示请求优先级;R表示保留。

  • 下面是抓包的一个HEADERS帧:
  • 另外一个两个要说一下的概念:消息和流。

    消息是指逻辑上的HTTP消息(请求/响应),一系列数据帧组成一个完整的消息,比如一系列DATA帧和一个HEADERS帧组成了请求消息。

    流是链接中的一个虚拟信道,可以承载双向消息传输,每个流有唯一证书标识符,为了防止两端流ID冲突,客户端发起的流具有奇数ID,服务端发起的流具有偶数ID。

    所有HTTP 2.0通信都在一个TCP链接上完成,这个链接可以承载任意数量的双向数据流Stream。相应地,每个数据流以消息的形式发送,而消息由一个或多个帧组成,这些帧可以乱序发送,然后根据每个帧首部的流标识符重新组装。

  • 二进制分帧主要是为HTTP2.0其他特性提供基础。它能把一个数据划分封装为更小更便捷的数据。首先是在单链多资源方式中,减少服务端的链接压力,内存占用更少,链接吞吐量更大;另一方面,由于TCP链接的减少而使网络拥塞状态得以改善,同时慢启动时间减少,使拥塞和丢包恢复的速度更快。

首部压缩

HTTP1.x每次通信(请求或响应)都会携带首部信息用于描述资源属性。而

HTTP2.0在客户端和服务端之间使用首部表来跟踪和存储之前发送的键值对,首部表在连接过程中始终存在,新增的键值对会更新到表尾,因此不需要每次通信都携带首部,请求与响应首部的定义在HTTP2.0中基本没有变。

另外HTTP2.0使用了首部压缩技术,压缩算法采用HPACK,让报头更紧凑、更快速传输,有利于移动网络环境。需要注意的是,HTTP2.0的首部压缩,与我们常用的gzip等报文内容压缩不冲突。

流量控制

HTTP/2.0 “流”的流量控制的目标是:在不改变协议的情况下允许使用多种流量控制算法

  • 流量控制是特定于一个连接的。每种类型的流量控制都是在单独的一跳的两个端点之间的,并不是在整个端到端的路径上的。(这里的一跳指的是HTTP连接的一跳,而不是IP路由的一跳)

  • 流量控制是基于WINDOW_UPDATE帧的。接收方公布自己打算在每个流以及整个连接上分别接收多少字节。这是一个以信用为基础的方案。

  • 流量控制是有方向的,由接收者全面控制。接收方可以为每个流和整个连接设置任意的窗口大小。发送方必须尊重接收方设置的流量控制限制。客户方、服务端和中间代理作为接收方时都独立地公布各自的流量控制窗口,作为发送方时都遵守对端的流量控制设置。

  • 无论是新流还是整个连接,流量控制窗口的初始值是65535字节。

  • 帧的类型决定了流量控制是否适用于帧。目前,只有DATA帧服从流量控制,所有其它类型的帧并不消耗流量控制窗口的空间。这保证了重要的控制帧不会被流量控制阻塞。

  • 流量控制不能被禁用。

  • HTTP/2只定义了WINDOW_UPDATE帧的格式和语义,并没有规定接收方如何决定何时发送帧、发送什么样的值,也没有规定发送方如何选择发送包。具体实现可以选择任何满足需求的算法。

优化你的HTTPS(上),你需要这么做的更多相关文章

  1. 美图App的移动端DNS优化实践:HTTPS请求耗时减小近半

    本文引用了颜向群发表于高可用架构公众号上的文章<聊聊HTTPS环境DNS优化:美图App请求耗时节约近半案例>的部分内容,感谢原作者. 1.引言 移动互联网时代,APP 厂商之间的竞争非常 ...

  2. 如何优化运行在webkit上的web app

    如何优化运行在webkit上的web app 近来公司有个web app 项目运行在移动版android系统上,发现在电脑上跑的很流畅的web页面在移动版webkit上非常不流畅.根本无法和nativ ...

  3. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  4. 对服务器上所有Word文件做全文检索的解决方案-Java

    一.背景介绍    Word文档与日常办公密不可分,在实际应用中,当某一文档服务器中有很多Word文档,假如有成千上万个文档时,用户查找打开包含某些指定关键字的文档就变得很困难,目前这一问题没有好的解 ...

  5. 教育单元测试mock框架优化之路(上)

    转载:https://sq.163yun.com/blog/article/169561874192850944 众所周知,mock对于单元测试,尤其是基于spring容器的单元测试,是非常重要的.它 ...

  6. 优化你的HTTPS(下),你需要这么做

    本篇文章是接着上篇文章来说,这篇介绍三种方法分别是多路复用 ,请求优先级,服务器推送. 多路复用 请求优先级 服务器推送 多路复用 在HTTP1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一 ...

  7. 程序性能优化之APK大小优化(六)上

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从APK瘦身来介绍APK大小优化:文章主要内容从理 ...

  8. 最新IP数据库 存储优化 查询性能优化 每秒解析上千万

    高性能IP数据库格式详解 每秒解析1000多万ip  qqzeng-ip-ultimate.dat 3.0版 编码:UTF8     字节序:Little-Endian 返回规范字段(如:亚洲|中国| ...

  9. 个人收藏--未整理—C# http/https 上传下载文件

    c# HTTP/HTTPS 文件上传. 分类: .net 2015-02-03 08:36 541人阅读 评论(0) 收藏 举报 方法主体 [csharp] view plaincopy public ...

随机推荐

  1. python线程池ThreadPoolExecutor(上)(38)

    在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...

  2. webpack config to use plugin and webpack-dev-server

    Demo3操作手册 本Demo演示如何配合各种plugin进行偏复杂的使用 准备环境 初始化环境, cd到demo1目录之后, 执行如下命令: npm init -y npm install webp ...

  3. Kubernetes(k8s)目录

    Kubernetes(k8s)目录 Kubernetes集群安装(亲测有效)

  4. LeetCode 643. 子数组最大平均数 I(Maximum Average Subarray I)

    643. 子数组最大平均数 I 643. Maximum Average Subarray I 题目描述 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. LeetCo ...

  5. [转帖]Linux下主机间文件传输命令

    Linux下主机间文件传输命令 https://yq.aliyun.com/articles/53631?spm=a2c4e.11155435.0.0.580ce8ef4Q9uzs   SCP命令: ...

  6. [SourceTree] - 使用内置 Git 克隆项目出现 templates not found 问题之解决

    背景 使用 SourceTree 克隆 Asp.Net Core 项目失败. 错误 warning: templates not found C:\Program Files\Git\share\gi ...

  7. Java基础笔试练习(二)

    1. HashMap的数据结构是怎样的? A.数组 B.链表 C.数组+链表 D.二叉树 答案: C 解析: JDK8以后,HashMap的数据结构是数组+链表+红黑树 2. 在 JAVA 编程中,J ...

  8. 剑指offer55:链表中环的入口结点

    1 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 2 思路和方法 这是一个典型的链表中查找环的问题,基本思路是,首先设置两个快慢指针slow和fast,并且快指 ...

  9. Hadoop 求单词count数

    package com.yw.hadoop273; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongW ...

  10. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...