今早在公交车上,把http2的官方讲解文档(还在草案之中)看了一圈,发现相对http 1.1确实改进了不少,完整的文档可通过:://www.gitbook.com/book/ye11ow/http2-explained/details 下载
 
把其中的主要思路结合我个人的理解,记录在这里(初次接触,可能有理解不正确的地方,如有不妥,欢迎指正)
 
1、 多路复用
下面这二张图很形象,http2中发送数据是基于帧的,每个帧又对应着一个“流“,下面这二列火车好比二个流,传统方式下,要传输二个流,有可能要发送二次数据(或者创建2个连接)。
在http2里,这二个流,可以串在一起,类似下图,这样发送一次就行了,即实现了所谓的多路复用,这样带来的直接好处是:不需要创建太多的TCP连接(创建TCP连接代价很高的),能省下不少的连接资源。
 
 
2、流的优先级和依赖性
每个流可以指派流的优先级(这个过程可以是动态的),比如在页面上切换tab页时,可以把将要显示的的图片对应的流,优先级增加,以加快显示,改善用户体验,另外每个流依赖其它哪些流,也可以指定。
 
 
3、头压缩
一张网页的加载过程中,可能会很多的http请求,每个请求中,都会包含一些重复的头信息(比如:cookie信息),十分浪费,http2可以将这些重复的内容压缩,提升性能。
 
4、服务器推送
这其实是服务端的一个智能预测,比如浏览器在加载资源X时,服务器如果知道浏览器很可能也会需要资源Y,那么服务器可以主动把资源Y推送给浏览器缓存起来,这样以后要用资源Y的时候,用户感觉就会很快。
 
5、备选服务
在负载均衡的情况下,会有多个server在提供服务,但是一个TCP连接总归只能连接到一个Server,在http2下长连接估计会成为趋势,这样的话,不利于负载"均衡"的整体性能发挥,如果服务端想建议客户端连接到另一个节点,可以用Alt-Svc头来告诉客户端有另一个备选服务器
 
上述这一堆改进最终的目的,我个人理解就是一句话:“更少的TCP连接,更快的传输”,如果http2流行以后,传统的一些优化手段,比如css sprit,把多个小js文件合并成一个文件这些技巧就没必要了,因为“多路复用”,本身就能把多个小文件串在一起,在同一个帧中发送,而不至于增加TCP连接。
 
潜在的副作用:
1、目前只支持TLS,即只能通过https:// 安全连接,这会带来额外的开销。
2、内容是二进制的,看起来不如以前直观,调试起来不如http 1.1方便
 
目前的支持情况:
1、浏览器方面,Firefox、Chrome最新版本已经实现了http 2,其它浏览器比如:Safari,IE,Opera宣称也会跟进,所以浏览器方面的普及应该不是什么大问题 
2、服务器方面,目前只有H2o支持了,Apache,Nginx目前还没有跟上。
 
另外,值得一提是Google的开源项目gRPC,就是在 protobuf + http2 实现的RPC框架。
 
最后,http 2被设计为与http 1.1完全兼容(没办法,现在还是 http 1.1的天下,如果不兼容,估计没人愿意尝试),所以我个人觉得这应该是一个过渡的协议,仍然背负着一些http 1.1的历史包袱,等流行之后,应该在http 3里会做一些激进的改进,就象html 4到html 5的飞跃一样。

让 http 2来得更猛烈些吧的更多相关文章

  1. 这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧

    注意:有网友提出部分项目停止更新的事情,这个问题我特意注意过,很多都是小功能组件,功能稳定,没有bug,没更新是正常的.够用就行了.其次技术支持的事情,对开源免费来说,不能太强求,这里发布的都是小功能 ...

  2. 让这三个月来的更猛烈些吧,前端react同构项目

    昨天一篇文章讲述了我在这三个月中由.net到java的过程,其中踩坑填坑的细节真不是三言两语可以道尽,而完成时的喜悦也远非寻常可比(仅次于涨工资).然而到这并不算完结,作为前后端分离的忠实粉丝,我认为 ...

  3. git stash让bug来的更猛烈些吧

    git stash可以用来暂存当前正在进行的工作,比如想pull最新的代码,又不想加新commit, 或者有一个紧急的bug需要修复,但是这个bug又与你已经在做的工作(还没完成)有关联.这个时候有的 ...

  4. 让HTML5游戏来的更猛烈些吧!--青岛思途

    作为著名的网页游戏门户,Kongregate在业界也算是鼎鼎大名了.小编与它的初识应是在几年前,只记得当时其平台上的游戏基本都是需要Flash的支持,可前几天,Adobe宣布计划停止Flash的更新和 ...

  5. 怎么让dedecms生成html页面更快些

    如何让织梦生成html页面更快些呢? 1.把文章模板里的“相关文章”.“热点文章”.“推荐文章”这类的标记删除了,用其它方式,如:shtml.js 引入 2.把织梦模板里用标记表示的模板路径.php附 ...

  6. 让EFCore更疯狂些的扩展类库(一):通过json文件配置sql语句

    前言 EF通过linq和各种扩展方法,再加上实体模型,编写数据库的访问代码确实是优美.舒服,但是生成的sql不尽如意.性能低下,尤其是复杂些的逻辑关系,最终大家还是会回归自然,选择能够友好执行sql语 ...

  7. iOS 让CoreData更简单些

    原文:http://www.cocoachina.com/ios/20170421/19096.html 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而 ...

  8. 让EFCore更疯狂些的扩展类库(二):查询缓存、分部sql、表名替换的策略配置

    前言 上一篇介绍了扩展类库的功能简介,通过json文件配置sql语句 和 sql语句的直接执行,这篇开始说明sql配置的策略模块:策略管理器与各种策略的配置. 类库源码:github:https:// ...

  9. c++:printf和cout那个更好更快些

    现在群里在讨论cout和printf那个快的问题,但我个人觉得printf好: 因为:printf对于一些数据大,以及保留小数位,字符……可以显示出明显的优势如“%s %d %c…………” 虽然pri ...

随机推荐

  1. Android Couldn't load BaiduMapSDK

    什么都不用多说,看代码 Couldn't load BaiduMapSDK_v3_2_0_15 from loader dalvik.system.PathClassLoader[DexPathLis ...

  2. jQuery介绍 DOM对象和jQuery对象的转换与区别

    jQuery介绍 DOM对象和jQuery对象的转换与区别 jQuery介绍      jQuery: http://jquery.com/      write less, do more.   j ...

  3. IOS RunLoop浅析 一

    RunLoop犹如其名循环. RunLoop 中有多重模式. 在一个“时刻”只能值执行一种模式. 因此在使用RunLoop时要注意所实现的效果有可能不是你想要的. 在这里用NSTimer展示一下Run ...

  4. javascript深入浅出(imooc)

    第一章 数据类型 1,六种数据类型:原始类型(number,string,boolean,null,undefined) + object对象(Function Array Date) 2,隐式转换: ...

  5. C#命名规则和编码规范

    用Pascal规则来命名属性.方法.事件和类名. public class HelloWorld { public void SayHello(string name) { } } Pascal规则是 ...

  6. Oracle索引梳理系列(六)- Oracle索引种类之函数索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  7. [Java入门笔记] 面向对象编程基础(三):成员变量和局部变量

    在类中,变量根据定义的位置不同,可以分为成员变量和局部变量.

  8. SCCM 2012 R2安装部署过程和问题(三)

    上篇 SCCM 2012 R2安装部署过程和问题(二) 个人认为对于使用SCCM 2012的最重要的经验是耐心. SCCM采用分布式部署的架构,不同的站点角色可以部署在不同的服务器上,站点角色之间的通 ...

  9. SQL SERVER 2014 各个版本支持的功能

    转自:https://technet.microsoft.com/library/cc645993 转换箱规模限制 功能名称 Enterprise Business Intelligence Stan ...

  10. OpenStack中Keystone的基本概念理解

    原文http://www.kankanews.com/ICkengine/archives/10788.shtml Keystone简介 Keystone(OpenStack Identity Ser ...