http1、http2、http3总结
# http1.0
HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,是一种无状态、无连接的应用层协议,几年后被HTTP1.1代替并广泛使用
# http1.1
- http1.1基于文本解析,把所有请求和响应作为纯文本
- http1.1加入了缓存处理(强缓存和协商缓存)
- http1.1拥有长连接,并支持请求管道化(
pipelining
), - http1.1流控制基于tcp连接。当连接建立时,两端通过系统默认机制建立缓冲区。并通过ack报文来通知对方接收窗口大小,因为http1.1 依靠传输层来避免流溢出,每个tcp连接需要一个独立的流控制机制
# 缓存处理(强缓存和协商缓存)
浏览器缓存能优化性能,而浏览器缓存分为强缓存和协商缓存,都是从客户端读取缓存 强缓存
- 强缓存不发送请求,直接读取资源,可以获得返回200的状态码
- 利用http头中的
Expires
和Cache-Control
两个字段来控制,都用来表示资源的缓存时间,Expires能设置失效时间,而Cache-Control能做到更多选项更细致,如果同时设置的话,其优先级高于Expires
协商缓存
- 通过服务器来确定缓存资源是否可用,通过request header判断是否命中请求,命中后返回304状态码,并返回新的request header通知客户端从缓存里取
- 普通刷新会启用弱缓存,忽略强缓存。只有在地址栏或收藏夹输入网址、通过链接引用资源等情况下,浏览器才会启用强缓存
- 如果时间过期,则向服务器发送header带有If-None-Match和If-Modified-Since的请求,回到1
# http2
- http2相比于http1.1,性能大幅度提升
- http2通过一个连接来多路复用
- http2拥有头部压缩
- http2拥有新的二进制格式,使用二进制框架层把所有消息封装成二进制,且仍然保持http语法
- http2允许客户端和服务器端实现他们自己的流控制机制,而不是依赖传输层,两端在传输层交换可用的缓冲区大小,来让他们在多路复用流上设置自己的接收窗口
- http2让服务器可以将响应主动“推送”到客户端缓存中
# htpp2头部压缩
- http2头部压缩又称为HAPCK,设计简单而灵活,是因为HPACK格式有意地
简单
且不灵活
能降低由于实现错误而导致的互操作性或安全问题的风险 - http1.1没有头部压缩,随着请求增加,冗余头部字段会不必要地占用带宽,从而显着增加延迟,而头部压缩可消除冗余报头字段,限制已知安全攻击的漏洞,并且在受限环境中使用有限的内存要求
# http2多路复用
- http 性能优化的关键并不在于高带宽,而是低延迟
- tcp 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度,这种调谐则被称为 tcp 慢启动,由于这种原因,让原本就具有突发性和短时性的 http 连接变的十分低效
- http/2 通过让所有数据流共用同一个连接,可以更有效地使用 tcp 连接,让高带宽也能真正的服务于 http 的性能提升。而http1.1存在低性能的线头阻塞,一旦有一个请求超时,便会出现阻塞等待的情况
# http3
之前说了http2,那么http3就是为了解决http2相关问题而诞生,它基于一个新的传输层协议QUIC,而http3就是建立一个在QUIC上运行的HTTP新规范,而http3之前的版本都是基于TCP,QUIC就是为了替代TCP,解决TCP的一些缺陷
# tcp
- 不支持流级复用,TCP会将所有对象序列化在同一个流中,因此,它不知道TCP段的对象级分区,无法在同一个流中复用数据包
- 会产生冗余通信,tco三次连接握手会有冗余的消息交换序列
- 可能会间歇性地挂起数据传输,tcp中有个因为序列顺序处理丢失的问题的缺陷称为行头阻塞
# QUIC
- 同样拥有头部压缩,并优化了对乱序发送的支持,也优化了压缩率
- 放弃tcp,通过udp建立,提高了连接建立的速度,降低了延迟
- tcp本身是无法解决队头拥塞,quic则解决了这个问题
- Connection ID使得http3支持连接迁移以及NAT的重绑定
# 参考文章链接
一文总结http1.0,http1.1,http2,http3,面试强心剂 (opens new window)
解读 HTTP1/HTTP2/HTTP3 (opens new window)