《HTTP/2基础教程》学习笔记

摘要:摘要: 这本书很薄,比昨天那本更薄,内容如书名,是一个HTTP2的基础教程,从这本书上可以了解HTTP2协议的基本情况。以下是我这边的整理。

这本书很薄,比昨天那本更薄,内容如书名,是一个HTTP2的基础教程,从这本书上可以了解HTTP2协议的基本情况。以下是我这边的整理。也可以看大纲,整理如下:
http://naotu.baidu.com/file/3ab4827c2c1359d60b9281a124167566?token=17f6da1adc8b54fb

一、HTTP2的发展历史
目前为止,HTTP经历了三个比较重要的版本(1.0,1.1,2.0):
HTTP1.0,这标志着HTTP真正成为工具,相对于0.9规范的一页纸,1.0版本有60页。这个版本有三个比较严重的缺点:
不能让多个请求共用一个连接
缺少强制的Host首部
缓存的选择相当简单

HTTP1.1,主要的变更点有:
缓存相关的首部扩展
OPTIONS方法
Upgrade首部
Range请求
压缩和传输编码
管道化,队头阻塞影响了管道化特性的实现
HTTP1.1强制要求客户端提供Host首部,使得虚拟机托管成为可能;并且连接可以在响应之后复用,极大提升了HTTP的性能;

HTTP2.0的前身是2009年由谷歌工程师Mike Belshe与Roberto Peon提出的SPDY协议,主要提出了多路复用,帧,首部压缩的特性;也正是SPDY,使得业界对修改HTTP协议产生了极大的热情。

未来

HTTP2.0绝不是HTTP的终结,未来已经在启航。谷歌已经提出了QUIC(Quick UDP Internet Connection)协议,试图用UDP协议来优化HTTP的传输性能。
QUIC的主要特性有:无序的包处理,灵活的拥塞控制,更低的建立连接开销,传输细节的身份验证,连接迁移等;
另外,TLS1.3规范也在推进中,TLS1.3的一个重要特性,会对HTTP的性能有比较大的改观:
新连接只需要一次往返(目前最少3次);如果是恢复连接的话, 不需要往返时延(0-RTT)

二、HTTP2的协议内容
HTTP2的协议特点有:二进制协议、首部压缩、多路复用、加密传输;
其中,首部压缩指的是同一个连接中,多次请求之间,首部会存在很多相同的文本,针对这部分文本可以进行压缩,以减少传输数据量;
这里需要说下SPDY的CRIME漏洞:如果使用GZIP算法进行压缩,则会存在泄漏加密信息的风险。攻击者在请求中添加数据,观察压缩加密后的数据量是否会小于预期。如果变小了,攻击者就知道注入的文本与请求的其它内容(比如私有的会话cookie)有重复。
因此HTTP2中不是使用GZIP算法进行首部压缩的,而是新开发的HPACK算法;
HPACK的主要思路:当客户端发送请求时,可以在首部数据块中指示特定首部及其应该被索引的值,服务端读到了这些请求首部,它会创建同样的索引表;在客户端下一次请求时,如果首部相同,直接传递索引值即可。

多路复用指的是在传输过程中,可以同时传递请求与响应数据,以最大化利用连接。

连接
客户端与服务端如何判断是否能使用HTTP2协议?
首先是利用ALPN应用层协议协商,来进行协议的协商,这个协议是由NPN演化而来;还有一个HTTP Alternative Services,是ALPN之外的补充,服务器可以在返回客户端的响应首部中增加HTTP Alternative Services信息,表示后续的请求可以使用更合适的请求地址或协议。
协议协商完,客户端会尝试发送connection preface连接前奏,服务器如果不返回错误,就可以进行HTTP2的通信了。

分帧层
HTTP1在传输协议内容时,采用的是文本,一行一行传输内容,这会存在两个问题:
一次只能处理一个请求或响应,完成前不能停止解析。
无法预判解析需要多少内存。如果行太长,可能会影响性能。
而HTTP2,则采用的是分帧层来处理,规范严格定义每个帧的结构;多个请求和响应可以交错,而不会互联阻塞。流ID用来标识帧所属的流;没有分块编码(chunked encoding)

服务器推送
在资源被用到之前,就由服务器主动将对象发给客户端。


三、性能优化
需要注意在HTTP2下,原有针对HTTP1所做的性能优化措施可能不一定会奏效,甚至会反作用。

常用的性能优化方案:
资源合并,把多个文件合成一个文件,以减少HTTP请求数;
在HTTP2中不太推荐,虽然能够减少传输字节数,但是提升不明显
极简化,去除无用的代码
HTTP2下仍然建议使用
域名拆分,将资源分布到不同的域名上去,让浏览器利用更多的socket连接
作者建议取消域名拆分,这违背HTTP2的设计意图;但仍然需要实际测试,才能判断是否有利于提升性能
禁用cookie的域名,为图片之类的资源单独建立域名,并设置这些域名不使用cookie,以减少传输数据量
作者建立避免这种优化,因为在HTTP2下,由于有了首部压缩技术,cookie的开销会显著降低
CSS Sprites,把多张图片合并成一个文件,使用CSS控制在Web页面上展示的部分
不推荐在HTTP2下使用,代价高昂;

四、HTTP2相关的工具
Chrome开发者工具(Remote Devices, Network)
WebPagetest
OpenSSL
nghttp2
curl
h2i
wireshark