HTTP/0.9
0.9版本是第一个定稿的HTTP版本,相对较为简陋。它有以下特点:
只有一个命令GET
没有header等描述数据的信息
服务器发送完毕,就关闭TCP连接
HTTP/1.0
1.0版本在0.9版本上做出了很多创新和优化,该版本:
增加了新的命令(POST命令和HEADER命令)
增加status code(状态码)和header
增加多字符集支持、多部分发送、authorization(权限)、cache(缓存)等
在这个版本,基本实现了HTTP协议的框架。
HTTP/1.1
1.1版本解决了大量1.0版本的痛点,该版本新增了以下功能:
持久连接(keep alive)
管道化(pipeline)
host和其他一些命令
在1.1版本以前,每次HTTP请求,都会重新建立一次TCP连接,服务器响应后,就立刻关闭。众所周知,建立TCP连接的新建成本很高,因为需要三次握手,并且有着慢启动的特性导致发送速度较慢。而1.1版本添加的持久连接功能可以让一次TCP连接中发送多条HTTP请求,值得一提的是默认是,控制持久连接的Connection
字段默认值是keep-alive
,也就是说是默认打开持久连接,如果想要关闭,只需将该字段的值改为close
。
而管道化则赋予了客户端在一个TCP连接中连续发送多个请求的能力,而不需要等到前一个请求响应,这大大提高了效率。值得一提的是,虽然客户端可以连续发送多个请求,但是服务器返回依然是按照发送的顺序返回。
host
字段指定了服务器的域名,这允许一个物理服务器上可以建立多个虚拟服务器。
HTTP/1.1是使用最广泛的HTTP协议。
SPDY
优势:
复用连接,可在一个TCP连接上传送多个资源。应对了TCP慢启动的特性。
请求分优先级,重要的资源优先传送。
HTTP头部数据也被压缩,省流量。
服务器端可主动连接客户端来推送资源(Server Push)。
缺点:
单连接会因TCP线头阻塞(head-of-line blocking)的特性而传输速度受限。加上存在可能丢包的情况,其负面影响已超过压缩头部和优先级控制带来的好处。
HTTP/2
HTTP/2 是 HTTP 协议的第二个主要版本,该版本关注于减少延迟时间,从而提高页面加载速度。HTTP/2 是基于 SPDY 协议的,打开一个 TCP 连接并重复使用,这使得许多请求得以并行发送,而无需等待响应
优势是:
多路复用
压缩头信息
请求划分优先级
支持服务器端主动推送
多路复用:
浏览器对同一域名下的并发连接数量有限制,一般为6个,HTTP1中的Keep-Alive用于长连接而不必重新建立连接,然而keep-alive必须等本次请求彻底完成后才能发送下一个请求,而HTTP2的请求与响应以二进制帧的形式交错进行,只需建立一次连接,即一轮三次握手,实现多路复用。
请求优先级:
HTTP2帧具有优先级,允许客户端提供排序思路,以让服务器优先处理一部分请求,仍然是以二进制帧的形式返回数据。每个Frame Header中都有一个表示此Frame的 Stream ID,通过stream ID表示可以使所有的请求和响应同时在一条TCP连接上进行,当流并发时,流会有优先级,图片的优先级低于css文件或者js文件的优先级,这样设计可使重要的文件先下载。
压缩消息头:
HTTP1的消息头很大冗余,而HTTP2.0利用HPACK对消息头进行压缩传输,假设将常用的请求GET/index.html用1表示,POST/index.html用2表示,即是将消息头中的不同的部分分别用不用的索引进行表示,且会用哈夫曼编码压缩字符串,最后封装成frame。索引表分为动态索引和静态索引,动态索引表在客户端和服务器端共同维护,静态索引采用硬编码形式。
服务端推送:
HTTP2.0中服务器会主动将资源推送给客户端,例如把js和css文件主动推送给客户端而不用客户端解析HTML后请求再响应。HTTP2目前在实际使用中,只用于HTTPS协议场景下
http1与http2的请求的对比:
我们看出http2的请求都是在同一时间发起,这样极大的减少了页面的加载时间
共同学习,写下你的评论
评论加载中...
作者其他优质文章