首先说下1.0和1.1之间的区别
缓存处理的角度说,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
资源请求方面,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
连接方面,http1.0 默认使用非持久连接,而 http1.1 默认使用持久连接。1.0每次连接只能处理一个请求响应事务,1.1每次连接可以处理多个请求响应事务。这样的话减少了每次建立连接的时延。
错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
host头处理方面,http1.1 中新增了 host 字段,用来指定服务器的域名。http1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了 host 字段,这样就可以将请求发往到同一台服务器上的不同虚拟主机。
再来说一下1.1和2.0之间的区别
首先是性能惊人,官方演示说用1.1和2.0同时请求300张照片时间是1.1的零头
新的二进制格式1.x版本中报文的头信息必须是文本(ascii编码),数据体可以是文本也可以是二进制,2.0版本中是一个彻底的二进制协议,头信息和数据体都是二进制,这样做实现起来更加方便且健壮。
多路复用在1.x中会出现队头堵塞的现象,因为规定报文必须是一发一收按顺序处理,这样的话就是串联的队列,如果有一个请求应答处理的过慢就会阻塞后面的请求应答的执行。2.0有一个多路复用的特性,在一个连接里客户端和服务器都可以同时请求和响应多次,不用按照顺序一一请求响应,避免了队头堵塞的问题
头部信息压缩1.x版本中报文的头信息带有大量信息,而且每次都要重复发送,既浪费带宽又影响速度。2.0中对这一点做了优化,一方面对头部信息进行压缩后在发送,另一方面,客户端和服务器都要维护一张头部信息表,这张表会对发送的字段进行记录,不会重复发送相同字段,只发送表中记录的索引号,大大提高了速度。
服务端推送方面,2.0允许服务器未经请求,主动向客户端发送资源,比如说网页有一个css文件的请求,客户端在收到css文件的同时服务端会将对应的js文件推送给客户端,当客户端要用到js文件时就直接去缓存里面去取就行,大大提升了性能。
传输协议:HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC(Quick UDP Internet Connections) 协议来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。你可以将 QUIC 看作是 UDP 的升级版本,在其基础上新增了很多功能比如加密、重传等等。HTTP/3.0 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC。
连接建立:HTTP/2.0 需要经过经典的 TCP 三次握手过程(由于安全的 HTTPS 连接建立还需要 TLS 握手,共需要大约 3 个 RTT)。由于 QUIC 协议的特性(TLS 1.3,TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接。头部压缩:HTTP/2.0 使用 HPACK 算法进行头部压缩,而 HTTP/3.0 使用更高效的 QPACK 头压缩算法。队头阻塞:HTTP/2.0 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。由于 QUIC 协议的特性,HTTP/3.0 在一定程度上解决了队头阻塞(Head-of-Line blocking, 简写:HOL blocking)问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其数据流不受影响(本质上是多路复用+轮询)。
连接迁移:HTTP/3.0 支持连接迁移,因为 QUIC 使用 64 位 ID 标识连接,只要 ID 不变就不会中断,网络环境改变时(如从 Wi-Fi 切换到移动数据)也能保持连接。而 TCP 连接是由(源 IP,源端口,目的 IP,目的端口)组成,这个四元组中一旦有一项值发生改变,这个连接也就不能用了。错误恢复:HTTP/3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地进行恢复和重传。而 HTTP/2.0 则需要依赖于 TCP 的错误恢复机制。安全性:在 HTTP/2.0 中,TLS 用于加密和认证整个 HTTP 会话,包括所有的 HTTP 头部和数据负载。TLS 的工作是在 TCP 层之上,它加密的是在 TCP 连接中传输的应用层的数据,并不会对 TCP 头部以及 TLS 记录层头部进行加密,所以在传输的过程中 TCP 头部可能会被攻击者篡改来干扰通信。而 HTTP/3.0 的 QUIC 对整个数据包(包括报文头和报文体)进行了加密与认证处理,保障安全性。