一文总结http1.0,http1.1,http2,http3,面试强心剂

6,080 阅读4分钟

本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

http1.0

HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,是一种无状态、无连接的应用层协议,几年后被HTTP1.1代替并广泛使用

http1.1

  1. http1.1基于文本解析,把所有请求和响应作为纯文本
  2. http1.1加入了缓存处理(强缓存和协商缓存)
  3. http1.1拥有长连接,并支持请求管道化pipelining),
  4. http1.1流控制基于tcp连接。当连接建立时,两端通过系统默认机制建立缓冲区。并通过ack报文来通知对方接收窗口大小,因为http1.1 依靠传输层来避免流溢出,每个tcp连接需要一个独立的流控制机制

缓存处理(强缓存和协商缓存)

浏览器缓存能优化性能,而浏览器缓存分为强缓存协商缓存,都是从客户端读取缓存 强缓存

  1. 强缓存不发送请求,直接读取资源,可以获得返回200的状态码
  2. 利用http头中的ExpiresCache-Control两个字段来控制,都用来表示资源的缓存时间,Expires能设置失效时间,而Cache-Control能做到更多选项更细致,如果同时设置的话,其优先级高于Expires 协商缓存
  3. 通过服务器来确定缓存资源是否可用,通过request header判断是否命中请求,命中后返回304状态码,并返回新的request header通知客户端从缓存里取
  4. 普通刷新会启用弱缓存,忽略强缓存。只有在地址栏或收藏夹输入网址、通过链接引用资源等情况下,浏览器才会启用强缓存
  5. 如果时间过期,则向服务器发送header带有If-None-Match和If-Modified-Since的请求,回到1

http2

  1. http2相比于http1.1,性能大幅度提升
  2. http2通过一个连接来多路复用
  3. http2拥有头部压缩
  4. http2拥有新的二进制格式,使用二进制框架层把所有消息封装成二进制,且仍然保持http语法
  5. http2允许客户端和服务器端实现他们自己的流控制机制,而不是依赖传输层,两端在传输层交换可用的缓冲区大小,来让他们在多路复用流上设置自己的接收窗口
  6. http2让服务器可以将响应主动“推送”到客户端缓存中

htpp2头部压缩

  1. http2头部压缩又称为HAPCK设计简单而灵活,是因为HPACK格式有意地简单不灵活能降低由于实现错误而导致的互操作性或安全问题的风险
  2. http1.1没有头部压缩,随着请求增加,冗余头部字段会不必要地占用带宽,从而显着增加延迟,而头部压缩可消除冗余报头字段,限制已知安全攻击的漏洞,并且在受限环境中使用有限的内存要求

http2多路复用

  1. http 性能优化的关键并不在于高带宽,而是低延迟
  2. tcp 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度,这种调谐则被称为 tcp 慢启动,由于这种原因,让原本就具有突发性和短时性的 http 连接变的十分低效
  3. http/2 通过让所有数据流共用同一个连接,可以更有效地使用 tcp 连接,让高带宽也能真正的服务于 http 的性能提升。而http1.1存在低性能的线头阻塞,一旦有一个请求超时,便会出现阻塞等待的情况

http3

之前说了http2,那么http3就是为了解决http2相关问题而诞生,它基于一个新的传输层协议QUIC,而http3就是建立一个在QUIC上运行的HTTP新规范,而http3之前的版本都是基于TCP,QUIC就是为了替代TCP,解决TCP的一些缺陷

tcp

  1. 不支持流级复用,TCP会将所有对象序列化在同一个流中,因此,它不知道TCP段的对象级分区,无法在同一个流中复用数据包
  2. 会产生冗余通信,tco三次连接握手会有冗余的消息交换序列
  3. 可能会间歇性地挂起数据传输,tcp中有个因为序列顺序处理丢失的问题的缺陷称为行头阻塞

QUIC

  1. 同样拥有头部压缩,并优化了对乱序发送的支持,也优化了压缩率
  2. 放弃tcp,通过udp建立,提高了连接建立的速度,降低了延迟
  3. tcp本身是无法解决队头拥塞,quic则解决了这个问题
  4. Connection ID使得http3支持连接迁移以及NAT的重绑定