优化你的HTTPS(上),你需要这么做
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(上),你需要这么做的更多相关文章
- 美图App的移动端DNS优化实践:HTTPS请求耗时减小近半
本文引用了颜向群发表于高可用架构公众号上的文章<聊聊HTTPS环境DNS优化:美图App请求耗时节约近半案例>的部分内容,感谢原作者. 1.引言 移动互联网时代,APP 厂商之间的竞争非常 ...
- 如何优化运行在webkit上的web app
如何优化运行在webkit上的web app 近来公司有个web app 项目运行在移动版android系统上,发现在电脑上跑的很流畅的web页面在移动版webkit上非常不流畅.根本无法和nativ ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- 对服务器上所有Word文件做全文检索的解决方案-Java
一.背景介绍 Word文档与日常办公密不可分,在实际应用中,当某一文档服务器中有很多Word文档,假如有成千上万个文档时,用户查找打开包含某些指定关键字的文档就变得很困难,目前这一问题没有好的解 ...
- 教育单元测试mock框架优化之路(上)
转载:https://sq.163yun.com/blog/article/169561874192850944 众所周知,mock对于单元测试,尤其是基于spring容器的单元测试,是非常重要的.它 ...
- 优化你的HTTPS(下),你需要这么做
本篇文章是接着上篇文章来说,这篇介绍三种方法分别是多路复用 ,请求优先级,服务器推送. 多路复用 请求优先级 服务器推送 多路复用 在HTTP1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一 ...
- 程序性能优化之APK大小优化(六)上
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从APK瘦身来介绍APK大小优化:文章主要内容从理 ...
- 最新IP数据库 存储优化 查询性能优化 每秒解析上千万
高性能IP数据库格式详解 每秒解析1000多万ip qqzeng-ip-ultimate.dat 3.0版 编码:UTF8 字节序:Little-Endian 返回规范字段(如:亚洲|中国| ...
- 个人收藏--未整理—C# http/https 上传下载文件
c# HTTP/HTTPS 文件上传. 分类: .net 2015-02-03 08:36 541人阅读 评论(0) 收藏 举报 方法主体 [csharp] view plaincopy public ...
随机推荐
- Asp.Net Core Identity中基于角色授权
我们已经在之前介绍了简单的授权是在Controller或Action上添加属性Authorize来实现,那角色授权是在指定Authorize的同时指定Roles参数. 我们来看看基于角色访问的三种方式 ...
- clang, gcc, gdb
Clang 比 GCC 编译器的优势: 1 编译速度更快 2 编译产出更小 3 出错提示更友好,比如 clang 在编译过程可以直接指出相对简单的出错位置以及它 " 认为 " 正确 ...
- spring 整合guava
一.ApplicationContext.xml中的配置 <!--开启缓存注解--> <cache:annotation-driven /> <bean id=" ...
- 大数据架构(PB级)
1.随着互联网快速发展,数据量的快速膨胀,我们日增3000多亿数据量,因此需要针对PB级存储.几百TB的增量数据处理架构设计 2.系统逻辑划分总图: 暂不便透露 3.系统架构图: 4.大数据计算引擎我 ...
- SpringBoot项目集成PageHelper使用
SpringBoot项目集成PageHelper使用 一.开始 地址:https://github.com/pagehelper/Mybatis-PageHelper 在spring boot ...
- Visual Studio 设置为 UTF-8 保存格式
1. 步骤 Visual Studio 提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符. 在 VS 中,该命令没有默认显示在「文件」菜单中.用户需要手工设置,才能显示该命令. ...
- JSON & 虚拟列
什么是虚拟列? 在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Gener ...
- Java基础IO类之字节数组流
package IODemo; //字节数组流 :内部维护这着一个字节数组,我们可以利用流的读取机制来处理字符串 无需关闭,不会报IO异常 // ByteArrayInputstream ByteAr ...
- js 中加减乘除 比较精确的算法,js本身有些运算会出错,这里给出较精确的算法
问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会 ...
- Effective Java 读书笔记(四):泛型
1 不要使用原始类型 (1)术语 术语 例子 参数化类型(Parameterized type) List<String> 实际类型参数(Actual type parameter) St ...