前言
面试官:你刚刚提到http,那你说说http1.0、1.1、2.0分别有什么区别呢。
我:...💥
HTTP的发展历程
早在 HTTP 建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的HTML页面将要放在我们的 web 服务器上,用户端通过浏览器访问url地址来获取网页的显示内容,但是到了 WEB2.0 以来,我们的页面变得复杂,不仅仅单纯的是一些简单的文字和图片,同时我们的 HTML 页面有了 CSS,Javascript,来丰富我们的页面展示,当 ajax 的出现,我们又多了一种向服务器端获取数据的方法,这些其实都是基于 HTTP 协议的。同样到了移动互联网时代,我们页面可以跑在手机端浏览器里面,但是和 PC 相比,手机端的网络情况更加复杂,这使得我们开始了不得不对 HTTP 进行深入理解并不断优化过程中。
1.0 => 1.1的演变
- 连接方面的区别,
http1.1 默认使用持久连接
,而http1.0 默认使用非持久连接
。http1.1 通过使用持久连接来使多个 http 请求复用同一个 TCP 连接
,以此来避免使用非持久连接时每次需要建立连接的时延。 - 资源请求方面的区别,在 http1.0 中,存在一些
浪费带宽
的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能
,http1.1 则在请求头引入了range 头域
,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 - 缓存方面的区别,在 http1.0 中主要使用 header 里的
If-Modified-Since,Expires
来做为缓存判断的标准,http1.1 则引入了更多的缓存控制策略例如Etag、If-Unmodified-Since、If-Match、If-None-Match
等更多可供选择的缓存头来控制缓存策略。
- http1.1 中还新增了
host 字段
,用来指定服务器的域名
。http1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了 host 字段,就可以将请求发往同一台服务器上的不同网站。 - http1.1 相对于 http1.0 还
新增了很多请求方法,如 PUT、HEAD、OPTIONS
等。
1.1 => 2.0的演变
二进制协议
:HTTP/2 是一个二进制协议。在 HTTP/1.1 版中,报文的头信息必须是文本(ASCII 编码)
,数据体可以是文本,也可以是 二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制
,并且统称为"帧",可以分为头信息帧和数据帧。帧的概念是它实现多路复用的基础
。多路复用
: HTTP/2 实现了多路复用,HTTP/2 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应
,而且不用按照顺序一一发送,这样就避免了"队头堵塞
"的问题。数据流
: HTTP/2 使用了数据流的概念,因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。因此,必须要对数据包做标记,指出它属于哪个请求。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流 ID ,用来区分它属于哪个数据流。头信息压缩
: HTTP/2 实现了头信息压缩,由于HTTP 1.1 协议不带有状态
,每次请求都必须附上所有信息。所以,请求的很多字段都是 重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表
,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引 号,这样就能提高速度了。服务器推送
: HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送
。使用服务器推送,提前给客户端推送必要的资源 ,这样就可以相对减少一些延迟时间。这里需要注意的是http2 下服务器主动推送的是静态资源
,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。