前言:
全称为超文本传输协议,本文将会尽量精简的将http发展中经历的几个版本介绍出来。
HTTP 0.9
非常简单,纯文本格式,没有状态码以及错误代码等。
只支持请求
单次链接只接受一次请求,请求完毕后链接会关闭。
请求示例:
响应示例
HTTP 1.0
我们现在使用的HTTP 1.1版本的一个雏形,
增加了、等方法。
HEAD:请求资源头部信息,可以用来预检测信息,节约服务器资源,比如判断资源大小、或者判断资源是否存在
增加相应状态码(HTTP Status Code)
1xx 信息,服务器收到请求,需要请求者继续执行操作(这个状态码是HTTP1.1新增的,为了方便查看,所以写在了这里)
2xx 成功,操作被成功接收并处理
3xx 资源重定向
4xx 客户端错误
5xx 服务端错误
多字符集支持
多部分发送()
权限()
缓存()
内容编码()
可传输图片、js、css等文件
缺点:
连接无法复用,每次请求完成后连接会关闭,每次请求都需要重新建立连接
消息请求时没有传递,导致请求的资源必须存储在当前服务器。
数据未加密
注意:
队头阻塞:
当前请求发送后,服务器处理请求,当请求处理时间过长时,会发生队头阻塞,只有在当前请求响应后才会发出下一次请求。
HTTP 1.1(目前正在使用的版本)
支持头,允许不同域名配置在同一地址的服务器上。
连接可复用,同一TCP连接可以发送多个请求,当前请求被服务器处理完毕才会处理下一请求,如果当前请求回应特别慢,这时候就会发生队头堵塞。
每个域名浏览器规定最多同时开6个。
持久连接(),默认开启,如果客户端或浏览器没有断开操作,那么连接会一直保持。
新增PUT、 DELETE等方法。(风格接口)
注意:队头阻塞:
允许一个连接发送多个请求,不必等到上一个请求响应,就可以发送下一个请求,但是,服务器响应需要根据请求接收顺序,先接受的请求先响应回去。如果最先发出的请求响应慢的话,就会影响其他请求的响应,这样就造成了对头阻塞。
管道化
赋予了客户端在一个连接中连续发送多个请求的能力,而不需要等到前一个请求响应,这大大提高了效率。
HTTP 2.0
1. 头部压缩
为什么要进行头部压缩?
在普通请求中分为三部分,[请求头、消息主体、状态行],其中消息主体可以通过压缩,而请求头跟状态行没办法进行压缩,随着功能越来越复杂,一个页面的请求也越来越多,而头信息中有着大量的数据不会频繁变动,但是又要随每次请求发送,导致大量流量浪费,所以HTTP2.0引入了头部压缩技术。
头部压缩详解
在请求中header内会有很多重复的信息发送,使用 ,服务器客户端各缓存一份表,用来避免重复的信息传输。
2. 二进制分帧
数据采用二进制格式传输,这样解析效率更高效,其中头信息会放入HEADERS帧,信息体会放入帧,这些帧可以乱序发送,服务器接收到后根据每个帧的流标识符重新组装。(数据传输采用的是文本格式传输)
HTTP2.0把协议通信的基本单位缩小为一个一个的帧,这些帧并行的在同一个TCP请求上交换消息。
2. 多路复用
为什么用多路复用?浏览器限制同域名下最多建立6个链接,每个链接如果其中一个请求的响应卡主,后面的请求就会一直等待响应,会造成阻塞。
多路复用所有请求都是通过一个链接并发完成。多路复用对同一域名下的请求都是基于流,
每个请求都可以看做是一个流,每个帧上都有一个流标识,而不同的流在交错发送,当服务器收到消息后会拼接同一个流的帧组成一整块数据。
3. 请求优先级
图片优先级
每个中的流都有个优先级,高优先级的流会优先发送。
4. 服务器推送
服务器可以对一个客户端请求发送多个响应。当客户端请求某个页面时,服务器可以主动将页面内引入的图片、、主动推送至客户端,节约请求时间以及流量。
总结:
的多路复用以及二进制分帧可以使请求通过帧交错的请求至服务器,而且同一域名只需要建立一个连接,这样一来,我们在中使用的合并就没有意义了(js合并是为了减少请求数)。
领取专属 10元无门槛券
私享最新 技术干货