只有光头才能变强
HTTP博文回顾:
PC端:HTTP就是这么简单
PC端:HTTP面试题都在这里
本文力求简单讲清每个知识点,希望大家看完能有所收获
二、HTTP协议的今生来世最近在看博客的时候,发现有的面试题已经考HTTP/2了,于是我就顺着去了解一下。
到现在为止,HTTP协议已经有三个版本了:
HTTP1.0
HTTP1.1
HTTP/2
下面就简单聊聊他们三者的区别,以及整理一些必要的额外知识点。
2.1HTTP版本之间的区别 2.1.1HTTP1.0和HTTP1.1区别HTTP1.0和HTTP1.1最主要的区别就是:
HTTP1.1默认是持久化连接!
在HTTP1.0默认是短连接:
简单来说就是:每次与服务器交互,都需要新开一个连接!
试想一下:请求一张图片,新开一个连接,请求一个CSS文件,新开一个连接,请求一个JS文件,新开一个连接。HTTP协议是基于TCP的,TCP每次都要经过三次握手,四次挥手,慢启动...这都需要去消耗我们非常多的资源的!
在HTTP1.1中默认就使用持久化连接来解决:建立一次连接,多次请求均由这个连接完成!(如果阻塞了,还是会开新的TCP连接的)
相对于持久化连接还有另外比较重要的改动:
HTTP 1.1增加host字段
HTTP 1.1中引入了Chunked transfer-coding,范围请求,实现断点续传(实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输)
HTTP 1.1管线化(pipelining)理论,客户端可以同时发出多个HTTP请求,而不用一个个等待响应之后再请求
注意:这个pipelining仅仅是限于理论场景下,大部分桌面浏览器仍然会选择默认关闭HTTP pipelining!
所以现在使用HTTP1.1协议的应用,都是有可能会开多个TCP连接的!
参考资料:
https://www.cnblogs.com/gofighting/p/5421890.html
2.1.2HTTP2基础在说HTTP2之前,不如先直观比较一下HTTP2和HTTP1.1的区别:
https://http2.akamai.com/demo
上面也已经说了,HTTP 1.1提出了管线化(pipelining)理论,但是仅仅是限于理论的阶段上,这个功能默认还是关闭了的。
管线化(pipelining)和非管线化的区别:
HTTP Pipelining其实是把多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应;只不过,客户端还是要按照发送请求的顺序来接收响应!
就像在超市收银台或者银行柜台排队时一样,你并不知道前面的顾客是干脆利索的还是会跟收银员/柜员磨蹭到世界末日(不管怎么说,服务器(即收银员/柜员)是要按照顺序处理请求的,如果前一个请求非常耗时(顾客磨蹭),那么后续请求都会受到影响。
在HTTP1.0中,发送一次请求时,需要等待服务端响应了才可以继续发送请求。
在HTTP1.1中,发送一次请求时,不需要等待服务端响应了就可以发送请求了,但是回送数据给客户端的时候,客户端还是需要按照响应的顺序来一一接收
所以说,无论是HTTP1.0还是HTTP1.1提出了Pipelining理论,还是会出现阻塞的情况。从专业的名词上说这种情况,叫做线头阻塞(Head of line blocking)简称:HOLB
2.1.3HTTP1.1和HTTP2区别HTTP2与HTTP1.1最重要的区别就是解决了线头阻塞的问题!其中最重要的改动是:多路复用 (Multiplexing)
多路复用意味着线头阻塞将不在是一个问题,允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息,合并多个请求为一个的优化将不再适用。
(我们知道:HTTP1.1中的Pipelining是没有付诸于实际的),之前为了减少HTTP请求,有很多操作将多个请求合并,比如:Spriting(多个图片合成一个图片),内联Inlining(将图片的原始数据嵌入在CSS文件里面的URL里),拼接Concatenation(一个请求就将其下载完多个JS文件),分片Sharding(将请求分配到各个主机上)......
使用了HTTP2可能是这样子的:
HTTP2所有性能增强的核心在于新的二进制分帧层(不再以文本格式来传输了),它定义了如何封装http消息并在客户端与服务器之间传输。