关于Http2和Http3的区别
前言:
- 首先先来介绍一下http1与http2,以下简称http2为h2,其他类似;h2相较于h1来说有很大的性能提高,这种性能主要是在网页性能,只要升级了协议就能减少很多以前需要做的性能优化问题。但是在兼容问题还有如何降级方面导致国内还是没有普遍使用。
- h2虽然性能进行了提升,但是有些问题还是存在的,这个时候就推出了h3
HTTP协议
- HTTP就是HyperText Transfer Protocol(超文本传输协议)的缩写,所有的www文件必须遵守标准。他主要是处于计算机网络的应用层。并且是建立在TCP协议上的,所以如果要优化也是 HTTP基于TCP协议本身的特性,比如tcp协议建立连接的3次握手和断开连接的4次挥手以及每次建立连接带来的RTT延迟时间。
关于HTTP1的缺陷
- 连接没办法复用:无法复用会导致的问题就是每次请求都会经历三次握手和慢启动;三次握手主要是在高延迟的场景下影响明显,慢启动则是对大量小文件请求影响大。
- 在这里HTTP1.1可以用keep-alive复用一部分连接,但是仍然耗费资源,给服务器压力。
- 队头阻塞:导致宽带无法被充分利用,以及后续请求被阻塞;实际上就是一系列包因为第一个包被阻挡;当页面中需要请求很多资源的时候,队头阻塞会导致达到最大请求数量时候,队头需要等待其他资源请求完成后才能发起请求。(在这里HTTP1.0使用了pipeling来解决,也就是浏览器可以发出多个请求,但是pipeling是按序返回的,如果前面要加载一个很大的图片,后面的请求全部完成,后面的请求也是要等待前面的请求处理完才能进行有序返回,它只解决了部分队头阻塞)
- 协议开销大:header里携带的内容很多,增加了传输成本,并且header基本不发生变化,增加用户流量
- 安全因素:传输数据时候使用的内容都是明文,无法保证安全性。
过渡阶段:SPDY协议
- 谷歌研究的SPDY协议,改造了HTTP协议本身。能够降低延迟,压缩Header;被视为Http2的基础。
HTTP2
- 最大的目标就是在用户和网站之间只建立一个连接
HTTP2的新特性
- 二进制传输 对比于1的文本格式传输,2采用了二进制格式传输。1的请求和响应报文都是由起始行,首部和实体正文组成,各部分之间是用文本换行符分割的。 Http2主要是讲请求和相应数据分割了更小的帧,并且采用二进制编码
- 多路复用 :多路复用可以更高的解决浏览器限制在同一域名下的请求数量问题,更容易实现全速传输。
- Header压缩 :在1中,Header携带cookie的时候,可能需要每次重复传输几百到几千字节,这一部分极大地消耗了资源。Http2对这一部分采用了压缩策略。
- 在客户端和服务端使用首部表来跟踪和存储之前发送的键值对,重复的不用发送
- 首部表在连接续期内一直存在,由客户端和服务端共同更新
- Server Push:就是服务器能通过push的方式将客户端需要的内容推送过去。也叫 cache push;也就是某些资源客户端一定会访问,服务器通过push直接推送过去会减少延迟时间;比如服务器主动把css和js文件发送过去就不需要客户端解析HTML中在发送这些请求了。
HTTP3
- http2虽然解决了很多问题但是主要是底层支撑的tcp协议造成的。
- 比如上文提到的多路复用情况,可能会产生丢包情况,那么就会导致HTTP2的情况不如HTTP1的情况
- 丢包的话,tcp就会重新传递,后面的数据都会阻塞,但是对于版本1来说,可以开启多个TCP连接,如果出现这种情况,只会影响一个连接,剩余的tcp连接还会正常传输数据。
- 基于这个原因,谷歌基于UDP协议又重新产生了一个QUOC协议,并将其使用在HTTP3中
- 其中QUIC的新功能就是O-RTT:
- 技术核心就是使用类似TCP快速打开的技术,缓存当前会话上下文,下次恢复会话的时候,需要将之前的缓存传递给服务端验证通过之后就可以进行传输。