做者:杨志晓html
a.HTTP创建在TCP协议之上。浏览器
b.HTTP/0.9 于1991年发布。安全
c.HTTP/1.0 于1996年发布。服务器
d.HTTP/1.1 于1999年发布。网络
e.HTTP/2 于2015年发布。session
a.工做原理如图:
2_1.jpg
多线程
b.每次与服务器交互,都须要新开一个链接!app
2_2.jpg
dom
c.抓包分析:tcp
demo:4张图片+html总共5个请求
2_3.jpg
2_4.jpg
每一条tcp连接都会直接返回connection close
试想一下:请求一张图片,新开一个链接,请求一个CSS文件,新开一个链接,请求一个JS文件,新开一个链接。HTTP协议是基于TCP的,TCP每次都要通过三次握手,四次挥手,慢启动...这都须要去消耗咱们很是多的资源的!
a.相对于持久化链接还有另外比较重要的改动:
b.工做原理如图:
只创建一条tcp连接,可是每一个请求都是串行的,以下图所示
2_5.jpg
c.对上面同一个demo 在开启keep-alive后进行抓包分析:(4张图片+html总共5个请求)
2_6.jpg
5个请求发起一条tcp链接
2_7.jpg
d.图片增长后抓包以下(开启keep-alive):
2_8.jpg
e.经过增长图片个数抓包后发现,浏览器同时创建了6条tcp链接,观察浏览器网络请求加载图以下:
2_9.jpg
f.http1.1 支持pipelining(流水线) 条件是:sever端须要支持,同时浏览器也要开启,工做原理以下图:
2_10.jpg
HTTP Pipelining实际上是把多个HTTP请求放到一个TCP链接中一一发送,而在发送过程当中不须要等待服务器对前一个请求的响应;只不过,客户端仍是要按照发送请求的顺序来接收响应!
g.查询了 火狐浏览器开启pipelining方法:
在搜索栏输入 network.http.pipelining ,查询一下,若是没有,请右击鼠标,选择“新建”——布尔,而后输入 network.http.pipelining ,赋值true,而后点击肯定。
解释:激活这个键值以后,Pipelining同时发出成倍数的链接请求,从而达到提高链接速度的效果。网络上的大多数网站都是基于HTTP协议,而HTTP1.1能够支持多线程的链接请求,经过这个操做能够减小Firefox载入网页的时间。
h.总结:http1.x问题:
在HTTP1.0中,发送一次请求时,须要等待服务端响应了才能够继续发送请求。
在HTTP1.1中,发送一次请求时,不须要等待服务端响应了就能够发送请求了,可是回送数据给客户端的时候,客户端仍是须要按照响应的顺序来一一接收
因此说,不管是HTTP1.0仍是HTTP1.1提出了Pipelining理论,仍是会出现阻塞的状况。从专业的名词上说这种状况,叫作线头阻塞(Head of line blocking)简称:HOLB
a.SSL(Secure Sockets Layer) 安全套接层,是一种安全协议,经历了 SSL 1.0、2.0、3.0 版本后发展成了标准安全协议 - TLS(Transport Layer Security) 传输层安全性协议。TLS 有 1.0 (RFC 2246)、1.1(RFC 4346)、1.2(RFC 5246)、1.3(RFC 8446) 版本。
TLS 在实现上分为 记录层 和 握手层 两层,其中握手层又含四个子协议: 握手协议 (handshake protocol)、更改加密规范协议 (change cipher spec protocol)、应用数据协议 (application data protocol) 和警告协议 (alert protocol)
2_11.jpg
HTTPS = HTTP over TLS.
b.抓包分析:
ClientHello
2_12.jpg
c.绘制流程图以下:
2_13.jpg
d.HTTP2与HTTP1.1最重要的区别就是解决了线头阻塞的问题!其中最重要的改动是:多路复用 (Multiplexing)
如图所示:
2_14.jpg
e.HTTP2全部性能加强的核心在于新的二进制分帧层(再也不以文本格式来传输了),它定义了如何封装http消息并在客户端与服务器之间传输。
2_15.jpg
f.看上去协议的格式和HTTP1.x彻底不一样了,实际上HTTP2并无改变HTTP1.x的语义,只是把原来HTTP1.x的header和body部分用frame从新封装了一层而已
2_16.jpg
g.问题:被封装后,不用每次携带header,可是header里这个body的长度,这怎么处理呢?
方法:body上加上length解决
Headers Frame: 帧头
2_17.jpg
h.问题一:body分了许多个strem,怎么肯定完结?
抓包分析:
2_18.jpg
2_19.jpg
2_20.png
分了三个包分别为:8192+8192+5281
当前看到的是分包后,最大的包大小是 8192
展现图以下:
2_21.jpg
i.问题二:怎么肯定没丢包,错没错,秩序乱没乱,怎么合包
tcp会保证包有序,而且保证了不会丢包
HTTP2全部性能加强的核心在于新的二进制分帧层(再也不以文本格式来传输了),它定义了如何封装http消息并在客户端与服务器之间传输。
j.抓包分析请求:
2_22.jpg
观察http2的浏览器网络请求加载图以下:
2_23.jpg
2_24.jpg