web项目开发中,我们通过http来传输数据,这里我们来看一下,http是什么以及发展历程。
what
HTTP,超文本传输协议。
在我们非常页面的开发中,用来传输html、css、js、图片、cgi等。
HTTP 0.9
HTTP 0.9版本,很简单,只有一行请求(请求方法+路径),响应只有一个HTML。
HTTP 1.0
正式的版本是HTTP 1.0
请求:请求版本 + 首部
响应:响应状态 + 首部(响应对象可以包含任何类型:html、纯文本、图片等)
HTTP 1.1
HTTP 1.1 是对于HTTP 1.0的优化,减少延迟。下面看下1.1增加的新功能。
持久链接
1.1的持久链接可以说是1.1的一大特色。
在1.0中,每次http链接都要进行tcp的三次握手和四次挥手。如果说请求不多的话,影响倒是不大,但是请求多的话,那么请求的总时间就会大大延长。
于是,1.1支持了持久链接(keep-alive),第一次链接之后,如果客户端&服务器都没有进行断开的操作,那么,tcp链接就一直保持。这样,当http请求多的时候,自然,速度相比于1.0的话就快得多了。
我们可以抓一下掘金的请求,响应头中可以看到,使用的是http 1.1 ,并且connection的状态是keep-alive。
HTTP管道
http的请求队列,是一个先进先出的队列,在1.0的时候,这个队列是由客户端控制的,每次发送请求的时候,需求等待上一个请求回包之后,再继续发下一个请求。这样会出现服务器会有大部分时间是属于空闲状态的。
所以1.1的版本,把http请求队列放到了服务器,客户端可以不用等待回包就可以继续发送下一个请求,服务器直接在队列中获取请求,然后一个一个处理,这样,就可以有效提升请求的效率。
使用多个tcp链接
http请求队列的处理移动到服务端之后,确实速度可以加快,不过这也是串行的,要提升服务器的效率,那我们需要进行并行的操作。
所以,1.1做的就是可以同时开多个tcp链接,这样就可以做到并行啦。不过,由于浏览器限制,每个域名的tcp链接最多只能开6个。
当然,如果页面想开更多的tcp链接,也是有办法的,tcp链接数是按域名区分的,那么我们只要再添加域名就可以增加tcp链接数啦~
HTTP 2.0
2.0是第二个正式的版本,对1.1做了更多的优化。
二进制分帧层
1.1版本传输的数据是文本,相比于文本,二进制传输起来更加方便,底层不用再进行解析。
多路复用
1.1的时候,为了解决并行,开了多个tcp链接。多路服用,就是为了解决并行而出现的。
1.1传输的数据是文本,不能乱序传输,所以只能串行。
2.0传输的是二进制,帧是最小的单位,这里对帧标志顺序,既然有顺序,传输就可以并行了,接受数据方再根据数据帧进行拼接,就可以得到正确的信息。
于是,多路复用解决了单个tcp并行传输的问题。
首部压缩
客户端&服务器对首部表进行存储
第一次发送整个首部,之后根据diff来更新diff部分的数据。
虽然首部内容不多,但是每条数据都少一点的话,世界也将更加美好。
服务器推送
服务器推送,有点像websocket。
当用户请求页面的时候,服务器先返回html,然后客户端再根据html解析请求需要的资源,这样子客户端其实要进行多个请求。
那么服务器推送的效果呢?当客户端访问html之后,服务器就先把客户端需要的资源发送给客户端,那么,客户端需要资源的时候,就不用发送请求来,因为客户端预先就拿到来资源,从而减少请求的时间。
HTTP 3.0
3.0的版本,可以说是改头换貌。
我们知道http 2.0之前,都是基于tcp的,因为tcp稳定。
而3.0却抛弃来tcp,拥抱udp,稳定的事情就交给上层来做,也就是quic。
这个后面再细讲,先留白。
写在最后
http无处不在,无论是开发需求也好,还是优化项目也好,都要熟悉http,才能更好的理解。
最后补充一下楼主之前的文章 HTTP1.1 vs HTTP2.0