一、http1.1
特点
-
明文传输:
没有对报文进行加密,可以直接看到报文内容。 -
报文压缩:
只对报文主体压缩,不压缩报文首部 -
持久连接(keep-alive):
只握手一轮,不需要对每个请求进行一轮握手,请求和响应都可以放在一个连接里面,但是每个浏览器都对每个域持久连接数量有限制 -
一次一份:
一次只能请求一个,只有收到上一个请求响应才能进行下一个请求 -
队头阻塞:
如果在请求中有发生错误,之后的请求就无法接收了
管线化技术:单个连接可以发送多个请求,但是响应的时候必须按照发送的顺序接收,如果响应有失败的情况就会很难处理
二、http2.0
特点
-
报文压缩
引入了HPACK
的压缩算法对报文首部及报文主体全部压缩
HPACK
: 要求浏览器和服务器都保存一张静态只读的表,比如:HTTP/1.1 200 OK
起始行 在http2.0中变为:status:200
-
多路复用
1、主要解决 http1.1队头阻塞的问题
2、单个TCP连接进行交错发送请求和响应,请求和响应之间互不影响
3、请求和响应报文被划分为各个不同的帧,首部帧(报文首部)和数据帧(报文实体),每帧上具有流标识符,正因为有流标识符,使得帧不用按照顺序抵达对方那里,即使没有按照顺序抵达,最终有这个流标识符就可以按照顺序进行组合成完整的内容,并且帧类型里可以设置优先级,这样来标注流的权重 -
服务器推送
将浏览器进行请求的时候,服务器可以不像以往一样等浏览器解析html时再一个一个的响应,而是把浏览器后续可能需要的文件一次性全部发送过去
缺点:1、点错一个网页就会多出很多缓存;2、隐含安全性问题:造成DDos非对称攻击
http2只解决了HTTP层面的队头阻塞,还存在TCP层面的队头阻塞
三、http3.0
1、使用 UDP 协议,并在 UDP 协议之上新增一个协议 QUIC 协议。 QUIC 是因为要能够广泛部署才只能使用 UDP 的, 实际上的机制大部分还是采用的TCP的
2、将 TCP 握手和 TLS 握手整合到一起 变成 QUIC 握手
QUIC
1、http3.0 在应用层上并没有所谓的数据帧的概念,把数据帧移到了 QUIC 里面,相当于在传输层就有了数据帧,从源头解决了队头阻塞的问题, 实现多路复用。
2、QUIC协议会将从应用层过来的数据封装成 QUIC 帧(和http2.0的帧很像,也是加了流标识符)封装为 QUIC 数据包, QUIC 数据包会加上一些信息, 最重要的是加上了 Connection ID(连接ID),如果网络发生全面变化,比如从wifi变成 4G 网络,虽然IP 地址发生改变,但是 connection ID 是没有变化的,那么就可以使用 Connection ID 来识别为同一个连接,避免再次握手,这是QUIC 其中一个速度快的原因。
3、QUIC 数据包会把里面的QUIC帧加密,接着QUIC数据包会被UDP 封装成数据段,UDP 就会加上端口号