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

这本书很薄,比昨天那本更薄,内容如书名,是一个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

            
 

posted @ 2018-02-05 23:07  xjlnjut730  阅读(5)  评论(0)    收藏  举报