HTTP的更迭换代

963 阅读6分钟

【前言】

博主马上就要春招了,本着学习最好的方法是教别人学习的态度,将自己的一些学习内容记录下来。若文中有错误之处,望大佬们在评论区中指正。

什么是HTTP?

http是一种超文本传输协议,是请求-响应协议,它基于TCP/IP通信协议来传输数据,通常运行在TCP上面,它指定了客户端可以发给服务器什么样的消息,以及能得到什么样的响应。属于TCP/IP应用层的一部分。http自发布以来历经了多个版本,每个版本都有不少更新,这里便简单说一下各个版本的不同和区别。

HTTP 0.9

它是最传统的request-response模式,简单到极点,仅支持GET方法发送请求,且不支持请求头。

HTTP 1.0

它是无状态无连接的应用层协议 HTTP1.0中规定浏览器和服务器仅可保持短暂连接,每次发送请求都要和服务器建立一个TCP连接,服务器处理完后会马上断开TCP(无连接),而且服务器不会跟踪客户端也不会记录过去的请求(无状态)

变化

  1. HTTP1.0可以认为是HTTP0.9的拓展版本,它加入了HTTP版本号,具备了版本管理能力,也是它开始工程化的标志
  2. HTTP支持header了,req和res都有。
  3. 增加了状态码,让请求方和相应方对于管理程序有统一的认识,可以清晰知道是发生了什么错误,让控制错误和业务错误分离,提高了工作效率。
  4. 多了content-type,可以传输多种格式的文件。

缺点

  1. 无法复用: 由于HTTP1.0是无连接的协议,每次服务器处理完请求后便会断开TCP连接。所以客户端每次请求一个资源都要新建一个TCP连接,并且都是串行请求。TCP连接为了保持数据的可靠性会进行三次握手,这个操作是比较费事的,所以在网络的利用率上会很低,即使你的网络很快,打开网页的速度也很慢。

  2. 队头堵塞 HTTP1.0规定客户端发起下一个请求必须在前一个请求到达时才能发送,如果前一个请求响应没有到达,下一个请求就不会发送,造成堵塞。

HTTP1.1

HTTP1.1对网络性能问题上做出了巨大的优化

变化

  1. 长连接: HTTP1.1中加入了connection字段,通过对其设置keep-alive可以让HTTP重用TCP连接,节省了三次握手带来的巨大开销。当你不想对TCP进行重用时对connection设置false即可。

自1.1加入了connection字段后,通过将字段引入1.0,也可实现长连接,不过是默认关闭状态,而在1.1中是默认开启的。

  1. 管线化 在HTTP1.0当中,下一个请求必须在前一个请求到达时才能发送。而在HTTP1.1中,第一个请求发出去后不必等它回来,可以直接发送第二个,减少了响应时间。其实是把多个Http请求放到一个TCP连接中一一发送,在发送过程中不需要等待服务器对前一个请求的响应。实现了“并行”发送请求。但这并不是真正的并行。

因为服务器必须得按照客户端请求的先后顺序返回响应的结果,以保证客户端可以区分每次请求的响应内容。相当于将原来在客户端的先入先出队列移到了服务端。它不允许两个并行响应,所以并没有正真意义上解决对头堵塞,而且很多浏览器不支持这个操作。

  1. 加了缓存

相对于HTTP1.0中的使用的Expires强缓存标识,增添了cache-control,Expires所使用的GMT时间受限于客户端的时间,而cache-control使用max-age来设置缓存的生命时间,是相对于客户端的值,而不是Expires那样的绝对值。

还增添了ETag、if-none-match等协商缓存标识,在此不多讲解。

  1. HOST字段

加了HOST字段后,服务器可以从HTTP中得到域名信息,而不是被DNS转换的IP信息,所以多个域名可以解析到同一个服务器上了,使服务器可以创建多个站点。

  1. 安全性增加、支持多种网络协议

HTTP2.0

HTTP1.1虽然在多方面做出了优化,但仍然存在性能问题。比如发送请求依然是串行发送,无法做到真正的并行。且HTTP1.1传输以文本方式利用zip压缩来发送,传输成本大。所以HTTP2.0出现了。

变化

1.二进制分帧

http2.0是一个二进制协议,相较于http1.1的文本传输,它采用二进制格式传输,它将请求和响应切成更小的帧,采用二进制编码,解析更加高效。

  1. 多路复用

HTTP2.0实现了真正意义上的并行传输,它能在一个TCP连接上进行任意数量的HTTP请求,而这并行传输的实现,基于二进制分帧的特性

  • 数据流以消息的形式发送,消息由一个或多个帧组成,可以乱序发送,最后根据流标识重新组装
  • 同域名下的所有通信在单个连接中完成,只需要一个TCP连接,消除了多个TCP连接带来的延时和内存消耗。
  1. 服务器推送

服务器可以在发送HTML时主动推送其它资源,而不是等到浏览器解析到响应位置时再发送(遵循同源,且若已缓存过该资源,也可以拒收)

例如在发送HTML时候会主动推送其它资源。

  1. 头部压缩

2.0中采用encoder来减小传输header的大小,双方会各cache一份header fields表,避免重复传输,且通过算法压缩header。

缺点

由于多个HTTP请求复用一个TCP连接,TCP不知道上层HTTP请求有多少个,一旦发生丢包,所有请求都要等丢了的包传回。

HTTP1.x 与 HTTP2.0区别

  1. HTTP1.x基于文本传输,而2.0基于二进制,速度更快
  2. HTTP1.x必须按照请求顺序获取响应,而2.0可以乱序,是真正的并行
  3. HTTP1.x解决队头阻塞的方法是开多个TCP消耗巨大,而2.0一个TCP连接搞定
  4. HTTP1.x单个TCP连接一次只能处理一个请求,而2.0可以同时发送多个

HTTP3.0

前文说了HTTP2.0中,多个HTTP共用一个TCP连接,一旦发生丢包,整个连接都要等待重传。这个缺陷来源于底层协议TCP。HTTP1.1采取开多个TCP协议方式来解决队头阻塞虽然开销性能大,但是其中一个阻塞并不影响其它五个,但HTTP/2只有一个TCP连接,阻塞的问题便被放大了。

而TCP协议已经被广泛使用,我们很难对其做出改变,所以HTTP/3.0选择了一个折衷的方法——UDP协议,HTTP/2在UDP的基础上实现多路复用、0-RTT、TLS加密、流量控制、丢包重传等功能。

后言

本文引用资料《图解HTTP》

文章juejin.cn/post/696393… 文章coolshell.cn/articles/19…