HTTP2学习笔记

时间:2024-05-19 16:44:48

                                                                                               ------------------------------------------感谢陶辉老师

1、 HTTP1.0/1.1版本面临的问题

 1.1HTTP/1.1传输效率非常低

      我们知道,一个http的数据包包含二层帧头(14个字节),三层ip包头(20字节),四层tcp包头(最小20字节),这54个字节是HTTP包头必须要包括的。除此之外,由于http是无状态的协议,导致每一个http的请求及相应都需要携带大量的http header头部信息,来关联应用层的业务逻辑信息,这里面用的最多的就是cookies信息。而http header并不是http真正的有效载荷,而且http header信息通畅比较大,这就更加加剧了http1.1传输效率低下的问题。

1.2 http /1.1 头部巨大

     如上面所述,由于http1.1的无状态性,导致需要巨大的http 头部信息来维持应用层的关联性

1.3 http/1.1不能实现真正意义上的并发执行

     http/1.1不是并发执行的,就是requsst发送后如果没有response回来的话 是不能同时发送另外一个请求的。

1.4 无法实现服务器对客户端信息的推送

     http/1.1消息的标准格式是请求/响应类型,也就是说只能由客户端主动向服务器发起请求,服务器回应客户端请求,这种单向的连接。这种机制是http/1.1所面临的最大问题,存在严重的缺陷。

     举个例子,如果某公司在网上举行竞价拍卖活动,由于每个人的报价都需要传递到服务器,同时,服务器要实时的把相关报价信息推送给每个参与报价的客户,在这种业务场景下,单独的使用http/1.1是无法满足的。这时候需要因此websocket应用来解决这个业务问题。

2、HTTP2简介

      http2的前身是SPDY这个协议,SPDY是谷歌所做的一个努力,在2012-2015时间段内谷歌浏览器默认支持SPDY。

SPDY的实现是在tcp和ssl协议层之上加了一层spdy。2015年后,谷歌为了给http2让路,放弃了spdy的支持。

      准确来说,HTTP2的协议就叫做HTTP2,而不是HTTP2.0,因为HTTP2没有任何子协议了,下一个版本就直接到了HTTP3。所以http2的rfc标准相对来说也很精确,其RFC文档就一个7540。

         据统计,目前互联网web网站已经有30%支持http2协议了,之所以发展如此快的原因是如下几点

         ①未改变http/1.1的语义。

         ②基于TCP,仅在应用层变动


 3、http2的主要特性及实例

     http2有两种应用方式,

     一种基于TCP协议建立的HTTP2,称为H2C;

     另外一种是我们常用到的基于SSL建立的HTTP2,称为H2

     特性:

     1)二进制协议

     2)多路复用

     3)数据流

      4)头信息压缩

      5)服务器退总

 

3.1 H2C介绍

     H2C与websocket建立连接类似,有connction头部表示要进行协议升级,然后使用upgreade升级到H2C,

      下面进行H2C建立连接的演示:

       由于浏览器都不支持H2C,所以使用linux的curl工具进行测试。要求curl版本要在7.46以上,同时使用支持H2C的网站“http://nghttp2.rog”

       ①使用tcpdump 抓取相关报文并写入文件。

HTTP2学习笔记

       ②使用curl访问测试网站

HTTP2学习笔记

       ③三次握手信息

HTTP2学习笔记

      ④H2C升级

如下图第5帧,http get包。应用层信息connection:upgrade...http-setting是一个设置帧

HTTP2学习笔记

 

⑤ upgrade h2c

 如下图帧信息,通过connction:upgreade 和upgrade:h2c,升级到h2c协议。

HTTP2学习笔记  

  ⑥发送magic帧建立会话

HTTP2学习笔记

 

3.2 H2介绍

 

    H2是基于ssl来进行会话建立的,下面以新浪为例演示H2建立过程

①客户端发送client hello,

     ALNP中会告诉服务器自己支持哪些协议。

HTTP2学习笔记

  ②server hello

   server hello中,ALPN字段显示,server所选择的协议是H2

 HTTP2学习笔记

③magic帧和setting帧,建立会话

HTTP2学习笔记

 

3.3 h2的核心概念

① stream

    一个tcp连接包含一个或者多个steam,

②message

    一个双向通讯数据流。包含一条或者多条Mesage。

     对应HTTP1中的请求或者响应,包含一条或多条Frame

③Frame

    最小单位,以二进制压缩格式存放HTTP1的内容。

3.4 实例介绍核心概念

   ①Frame 每一个报文就是一个frame

   HTTP2学习笔记

②stream和frame关系

    每一个frame都会有一个Id,表示是哪一个stream

    我们可以简单的认为同一个ID就是同一个fream

<1>下图get请求stream id 是1,

HTTP2学习笔记

<2>服务器response返回 stream id也是1

HTTP2学习笔记

<3>server response的data信息 stream id信息也为1

 

HTTP2学习笔记

 

如上几个图,一个报文是一个帧,通过stream id就把帧frame和stream关联起来了。

③ messge

    接下来看消息的组成,http2中有header 帧和data帧组成,header和data共同组成了http1.1中的message,所mesge是一个业务层的概念。

   如下图所示,http2的headers Frame和Date fream组成了http1.1中的headers(http method,host,content-type,,,)和body。

HTTP2学习笔记