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