------------------------------------------感谢陶辉老师
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 抓取相关报文并写入文件。
②使用curl访问测试网站
③三次握手信息
④H2C升级
如下图第5帧,http get包。应用层信息connection:upgrade...http-setting是一个设置帧
⑤ upgrade h2c
如下图帧信息,通过connction:upgreade 和upgrade:h2c,升级到h2c协议。
⑥发送magic帧建立会话
3.2 H2介绍
H2是基于ssl来进行会话建立的,下面以新浪为例演示H2建立过程
①客户端发送client hello,
ALNP中会告诉服务器自己支持哪些协议。
②server hello
server hello中,ALPN字段显示,server所选择的协议是H2
③magic帧和setting帧,建立会话
3.3 h2的核心概念
① stream
一个tcp连接包含一个或者多个steam,
②message
一个双向通讯数据流。包含一条或者多条Mesage。
对应HTTP1中的请求或者响应,包含一条或多条Frame
③Frame
最小单位,以二进制压缩格式存放HTTP1的内容。
3.4 实例介绍核心概念
①Frame 每一个报文就是一个frame
②stream和frame关系
每一个frame都会有一个Id,表示是哪一个stream
我们可以简单的认为同一个ID就是同一个fream
<1>下图get请求stream id 是1,
<2>服务器response返回 stream id也是1
<3>server response的data信息 stream id信息也为1
如上几个图,一个报文是一个帧,通过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。