携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情 >>
http发展:http1.0 → http1.1→ http/2 → http/3
http1.0 缺陷
每发起⼀个请求,都要新建⼀次 TCP 连接(三次握⼿),⽽且是串⾏请求,做了⽆谓的 TCP 连接建⽴和断开,增加了通信开销(短连接)
http1.1对于http1.0的改进
支持长连接 这种⽅式的好处在于减少了TCP 连接的᯿复建⽴和断开所造成的额外开销,减轻了服务器端的负载。
管道(pipeline)网络传输 即可在同⼀个 TCP 连接⾥⾯,客户端可以发起多个请求,只要第⼀个请求发出去了,不必等其回来,就可以发第⼆个请求出去,可以减少整体的响应时间。(客户端无需等待前一个请求的响应即可发送下一个请求)这样的请求方式看上去是一个请求队列,响应也是按照队列进行响应。这样就会有队头阻塞的问题。
队头阻塞:因为当顺序发送的请求序列中的⼀个请求因为某种原因被阻塞时,在后⾯排队的所有请求也⼀同被阻塞了,会招致客户端⼀直请求不到数据,这也就是「队头阻塞」。好比上班的路上塞⻋。
http1.1缺陷
仅对请求体进行压缩
冗余首部
队头阻塞
没有请求优先级别控制
无法进行服务器推送
https所解决的http的问题
窃听风险→信息加密
冒充风险→认证机制
篡改风险→身份证书
http/2对于http1.1的优化
头部压缩(HPACK算法)消除重复部分
HPACK 算法:在客户端和服务器同时维护⼀张头信息表,所有字段都会存入这个表,生成⼀个索 引号,以后就不发送同样字段了,只发送索引号,这样就提⾼速度了。
不在使用文本形式的报文,采用二进制进行编码,传输时无需进行转换提高了传输效率
数据流
HTTP/2 的数据包不是按顺序发送的,同⼀个连接⾥⾯连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。 每个请求或回应的所有数据包,称为⼀个数据流( Stream )。每个数据流都标记着⼀个独⼀无二的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数。 客户端还可以指定数据流的优先级。优先级⾼的请求,服务器就先响应该请求。
多路复用
在一个连接中并发多个请求的回应,不用按顺序串行回应。解决了队头阻塞的问题。
服务器推送
举例来说,在浏览器刚请求 HTML 的时候,就提前把可能会⽤到的 JS、CSS ⽂件等静态资源主动发给客户端,减少延时的等待,也就是服务器推送(Server Push,也叫 Cache Push)
http/2缺陷
在复用TCP连接的情况下若其中一个http发生丢包现象,就会触发TCP重传机制,则使用这个TCP连接的所有http请求都必须等待丢失的包重传回来。
http/3(直接把下层的TCP协议更换成了UDP协议)
UDP 发生是不管顺序,也不管丢包的,所以不会出现 HTTP/1.1 的队头阻塞 和 HTTP/2 的⼀个丢包全部重传问题。
QUIC 有自己的⼀套机制可以保证传输的可靠性。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响。
TLS 升级成了最新的 1.3 版本,头部压缩算法也升级成了 QPack 。
HTTPS 要建⽴⼀个连接,要花费 6 次交互,先是建⽴三次握⼿,然后是 TLS/1.3 的三次握⼿。QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次,减少了交互次数。
http协议发展过程
ref:小林coding:图解网络介绍 | 小林coding (xiaolincoding.com)