HTTP/2 资料汇总
随着今年 5 月 14 日 HTTP/2 协议正式版的发布,越来越多的网站开始部署 HTTP/2 了。我对 HTTP 协议一直都比较有兴趣,本文汇总一些关于 HTTP/2 的资料以及我写过的文章,会持续更新。如果大家有任何问题,欢迎留言交流探讨。
协议
HTTP/2 协议由以下两个 RFC 组成:
- RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2);
- RFC 7541 - HPACK: Header Compression for HTTP/2;
网上有一份由百度 FEX 翻译的「h2-13 中文版」,更新于一年前,也可以看看。h2-13 说明这是协议的第 13 版草案,HTTP/2 一共经历了 00~17 共 18 版草案才正式发布。
很多支持 HTTP/2 的 Web 服务器和客户端,都会标注出自己支持的具体版本,例如 h2、h2-14,分别表示自己支持正式版、第 14 版草案。有时候还会看到某个软件写着支持 h2c,这是指它支持运行于非加密通道之上的 HTTP/2(HTTP/2 Cleartext)。
HTTP/2 协议是从 SPDY 演变而来,SPDY 已经完成了使命并很快就会退出历史舞台(例如 Chrome 将在「2016 年初结束对 SPDY 的支持」;Nginx 在今年年底正式支持 HTTP/2 后,也不再支持 SPDY),故本文不再讨论 SPDY。
在「HTTP/2 官网」可以找到更多有关 HTTP/2 协议的资料。
部署
根据 caniuse 的统计,目前支持 HTTP/2 的浏览器有 Chrome 41+、Firefox 36+、Safari 9+、Windows 10 上的 IE 11 和 Edge。服务器方面则有 F5、H2O、nghttp2 等数十种选择,各种语言实现的都有。Nginx 则相对谨慎一些,在「本月初才提供对 HTTP/2 的实验性支持」,年底才会正式支持。这里有一份「HTTP/2 服务器及客户端」的完整清单。
「Akamai 这个页面」提供了 HTTP/1 和 HTTP/2 的对比,大家可以用自己的浏览器测试一下。
升级到 HTTP/2 之后,不支持 HTTP/2 的浏览器还能正常访问么?如果有疑问,推荐阅读:谈谈 HTTP/2 的协议协商机制。
HTTP/2 协议本身并没有要求必须基于 TLS 部署,但当前所有浏览器均只支持 HTTP/2 Over TLS。这样做一方面更安全,另一方面利用 TLS 的加密机制可以更好地穿透网络中间节点。
所以如果要部署 HTTP/2,首先需要将网站升级为 HTTPS。这个过程涉及到购买证书、生成证书和配置 Web 服务器等几个步骤,网上很多教程,这里略过。有两点需要注意:1)选择层级少的证书(点击 Chrome 地址栏的绿色小锁,在详情中的证书信息里可以看到层级);2)一定不要使用 SHA1 算法的证书。本站有不少关于 HTTPS 和证书的文章,供参考:
- 关于启用 HTTPS 的一些经验分享(一);
- 关于启用 HTTPS 的一些经验分享(二);
- 关于启用 HTTPS 的一些经验分享(三);
- Let's Encrypt,免费好用的 HTTPS 证书;
- 开始使用 ECC 证书;
本博客先后使用过 H2O 和 Nginx 这两个服务器提供 HTTP/2 服务,下面是具体的介绍:
如果你在使用 Apache,可以参考这篇文章启用 HTTP/2。
对于喜欢折腾的人来说,Caddy 应该是个不错的选择,这个基于 Go 语言开发的 Web Server 对 HTTP/2 和 HTTPS 有着良好的支持,最近还开始支持 QUIC 协议。
另外,现在国外一些 CDN 也开始支持 HTTP/2 了,例如 KeyCDN,可以根据自己实际需要选用。KeyCDN 写过一篇描述自家和全球 HTTP/2 部署情况统计的文章:HTTP/2 Statistics: KeyCDN Report on HTTP/2 Distribution。
HTTP/2 协议中对 TLS 有了更严格的限制,例如 HTTP/2 中只能使用 TLSv1.2+,还禁用了几百种 CipherSuite。如果你遇到了启用 HTTP/2 导致网站打不开的问题,一定要看看《从启用 HTTP/2 导致网站无法访问说起》这篇文章。
Google 在 Chrome 51 中移除了 NPN,如果你的服务器不支持 ALPN,在 Chrome 51+ 中无法协商到 HTTP/2,《为什么我们应该尽快支持 ALPN?》这篇文章里有更多描述。
Nginx 1.9.15~1.10.x 在处理 HTTP/2 POST 时考虑不周,导致特定场景下一些浏览器会产生「无法连接到服务器」错误。《谈谈 Nginx 的 HTTP/2 POST Bug》这篇文章里有详细说明。
优化
将网站升级为 HTTPS 之后,多了 TLS 握手过程,之后的全部流量都会加密,如果没有做好优化肯定会比之前更慢。实际上,现在 TLS 已经很快了,这里有一个性能专家 igrigorik 建立的网站:Is TLS Fast Yet?,可以关注下。
下面几篇对 Nginx 的配置心得,是我在本博客实践之后写的,可以先看看:
HTTP/2 究竟会给 WPO(Web Performance Optimization)带来什么,我也写了一系列文章来介绍:
在 Velocity 2015 • SC 会议上,来自 Google 的 Ilya Grigorik 分享了「HTTP/2 is here, let's optimize! - Yesterday's perf best-practices are today's HTTP/2 anti-patterns」话题,重点讲述针对 HTTP/2 和 HTTP/1 进行 WPO 的相同和不同之处,值得推荐。
HTTP/2 中的 Server Push,可以减少网络延迟对性能带来的影响,优化首次访问速度。但它可能造成流量浪费,具体细节请看我的这两篇文章:
HTTP/2 中的头部压缩,可以减少头部体积,提高传输效率。有关这项技术原理和实现的详细介绍,请看我的这篇文章:
目前我没有找到只针对 HTTP/2 的测试工具,下面性能及安全在线测试网站的结果可以作为参考:
- WebPagetest,老牌网站性能测试工具;
- GTmetrix,使用 PageSpeed、YSlow 和其他工具全面测试网站性能;
- Qualys SSL Server Test,本站强烈推荐的 HTTPS 测试工具;
- Observatory by Mozilla,Mozilla 出品的网站安全测试工具;
调试
不同于 HTTP/1 的文本格式报文,HTTP/2 传输的都是二进制帧,调试起来要麻烦一些。
首先,要辨别某个网站是否启用了 HTTP/2,可以通过浏览器开发工具的「网络」面板中的 Protocol 字段查看。也可以通过扩展在浏览器地址栏显示当前的协议类型,HTTP/2 指示器扩展:Chrome 版、Firefox 版。
在 Chrome 地址栏输入chrome://net-internals/#http2
,打开 Chrome 自带的 HTTP/2 查看工具,可以很方便地查看 HTTP/2 帧信息。
新版 Wireshark(dev 1.99)可以调试 HTTP/2,详细介绍请查看「官网 Wiki」和我的这篇文章:调试 HTTP/2 流量。使用 nghttp2 也可以方便地调试 HTTP/2 流量,详情见这里。
更多调试工具可以在 CloudFlare 这篇文章里找到:Tools for debugging, testing and using HTTP/2。
书籍
以下书籍都有可供免费阅读的电子版:
- NGINX HTTP2 White Paper V4(Nginx 编写的 HTTP/2 白皮书);
- http2 explained(中文翻译见这里);
- HTTP/2: A New Excerpt from High Performance Browser Networking(即「High Performance Browser Networking」第十二章,Ilya Grigorik 编写);
最近发现一个 HTTP/2 日文网站:http2.info,列举了很多有关 HTTP/2 的资料,懂日语的同学可以去看看。
最后放上我最近做的一个关于 HTTP/2 的分享:《HTTP/2:新的机遇与挑战》。
本文链接:https://imququ.com/post/http2-resource.html,参与评论 »
--EOF--
发表于 2015-08-31 00:50:46 ,并被添加「 HTTP2 」标签 ,最后修改于 2016-08-30 09:11:49 。查看本文 Markdown 版本 »
专题「HTTP/2 相关」的其他文章 »
- 谈谈 Nginx 的 HTTP/2 POST Bug (Aug 20, 2016)
- 为什么我们应该尽快支持 ALPN? (May 18, 2016)
- 谈谈 HTTP/2 的协议协商机制 (Apr 14, 2016)
- 使用 nghttp2 调试 HTTP/2 流量 (Mar 07, 2016)
- 从启用 HTTP/2 导致网站无法访问说起 (Jan 17, 2016)
- 基于 HTTP/2 的 WEB 内网穿透实现 (Nov 23, 2015)
- HTTP/2:新的机遇与挑战 (Nov 22, 2015)
- HTTP/2 头部压缩技术介绍 (Oct 25, 2015)
- 使用 Wireshark 调试 HTTP/2 流量 (Oct 24, 2015)
- H2O 中的 Cache-Aware Server Push 简介 (Oct 21, 2015)
HTTP/2 资料汇总的更多相关文章
- 【转】自学成才秘籍!机器学习&深度学习经典资料汇总
小编都深深的震惊了,到底是谁那么好整理了那么多干货性的书籍.小编对此人表示崇高的敬意,小编不是文章的生产者,只是文章的搬运工. <Brief History of Machine Learn ...
- iOS超全开源框架、项目和学习资料汇总(5)AppleWatch、经典博客、三方开源总结篇
完整项目 v2ex – v2ex 的客户端,新闻.论坛.apps-ios-wikipedia – apps-ios-wikipedia 客户端.jetstream-ios – 一款 Uber 的 MV ...
- PyQt4学习资料汇总
一个月前研究了下PyQt4,感觉比较不错.相比wxpython,界面美观了很多,并且将界面设计与代码逻辑很好的分离了开来.关于PyQt4的资料也不少,这里我将我找到的资料汇总一下,以防自己以后忘得一干 ...
- 【转】iOS超全开源框架、项目和学习资料汇总
iOS超全开源框架.项目和学习资料汇总(1)UI篇iOS超全开源框架.项目和学习资料汇总(2)动画篇iOS超全开源框架.项目和学习资料汇总(3)网络和Model篇iOS超全开源框架.项目和学习资料汇总 ...
- 【同行说技术】iOS程序员从小白到大神必读资料汇总
在文章<iOS程序员从小白到大神必读资料汇总(一)>里面介绍了很多iOS入门学习的资料,今天小编就发几篇技术进阶的文章,快来看看吧! 一.iOS后台模式开发指南 这个教程会教你在什么时候怎 ...
- SQL Server 127个SQL server热门资料汇总
SQL Server 127个SQL server热门资料汇总 最近有许多关于如何学习SQLSERVER的问题,其实新手入门的资源和贴子很多,现在向大家隆重推荐经过精心整理的[SQLSer ...
- 机器学习&深度学习经典资料汇总,data.gov.uk大量公开数据
<Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...
- MongoDB资料汇总专题[转发]
转发下..这个哥收集的很全 MongoDB资料汇总专题 作者:nosqlfan http://blog.nosqlfan.com/html/3548.html 最后更新时间:2013-04-22 1. ...
- d3可视化实战00:d3的使用心得和学习资料汇总
最近以来,我使用d3进行我的可视化工具的开发已经3个月了,同时也兼用其他一些图表类库,自我感觉稍微有点心得.之前我也写过相关文章,我涉及的数据可视化的实现技术和工具,但是那篇文章对于项目开发而言太浅了 ...
- 158个JAVA免豆精品资料汇总
附件完整版下载地址: http://down.51cto.com/data/431561 附件部分预览~ java中国移动收费系统[源代码] http://down.51cto.com/data/70 ...
随机推荐
- Nginx负载-nginx转发到Swoole服务器(nginx配置文件变更)
- md5加密 bas64加密
/** * 获取bas64加密的算法 * @param str * @return */ public static String getBase64(String str) { byte[] b = ...
- wx:for获取 data-xxx 自定义的属性
今天在写wx:for循环时,在事件对象上e.target.dataset上一直拿不到自定义属性 data-id. 示例: <view wx:for='{{list}}' wx:key='{{it ...
- 给没有连接因特网的centos使用yum安装其他软件。
在centos上,使用yum安装软件很方便,比如安装gcc,java等, 但是在没有网络的情况下呢? 我之前就碰到过这么一个问题,在一个没有外网的环境内,我需要安装GCC等工具, 然后有人推荐我先去其 ...
- Docker 学习8 Dockerfile详解2
一.继续上章节Docker学习7 CMD命令后. 11.ENTRYPOINT a.容器启动后相当于会启动ENTRYPOINT + CMD 命令,CMD相当于参数传给entrypoint的 [root@ ...
- Yii框架学习资源盘点
盘点一些Yii框架的常用学习资源. 1.Yii中文论坛 https://www.yiichina.com/ 2.Yii中文网 http://www.yii-china.com/ 3.魏曦教你学Yii2 ...
- iOS报错:linker command failed with exit code 1 (use -v to see invocation) 问题解决方式之一
百度库原版本:3.2.1 更新为:4.2.0,两个库相隔2年时间: 问题i: 更新CocoaPods的同时更新了百度地图库的版本,运行程序报错: linker command failed with ...
- 十分钟了解HTTPS
一.为什么要用HTTPS——HTTP协议的缺陷 通信使用明文(不加密),内容可能会被窃听 不能验证通信方的身份,所以请求和响应都有可能是攻击者发送的 数据包在由A到B的过程中,可能经历很多次路由转发, ...
- [Ubuntu]Firefox书签Ubuntu与Windows同步
Ubuntu默认使用Firefox国际版.其他平台访问官网下载到的都是中国版,而国际版和中国版使用两套账号体系,相互之间无法同步,导致Ubuntu的Firefox无法和其他平台的Firefox同步书签 ...
- lua 语言基础
1.数据类型: string(字符串) ·运算符“+.-.*./”等操作字符串,lua会尝试讲字符串转换为数字后操作: ·字符串连接用“..”运算符 ·用“#”来计算字符串的长度(放在字符串前面) · ...