前言
虽然我们的主战场是前端,但是面对一部分大厂的时候他们也喜欢问关于Http的问题。其中就很有可能会问到Http版本之间的区别。
HTTP 0.9 超文本传输协议
这个时候电脑主要还是由科学家使用,因此这个时期的Http开发出来主要是为了科学家之间的交流,主要还是为了科研,并没有往娱乐方向发展。因此 0.9 有着以下几个特点
- 基于TCP协议
- 只有请求行和响应行
- 只能发送get请求
- 以 ASCII 字符流的编码方式进行传输
这个时候还只是局限于传递一些文本。
HTTP 1.0
这个时候电脑的价格和体积都被打了下来,有一些比较富裕的家庭也开始使用电脑。因此开始出现了娱乐方面的需求。因此也就开发出了 HTTP 1.0,主要就是拓展了可传输的资源类型。
- 支持 js,css,图片,音频,视频各种类型资源
- 可以设置请求头和响应头
同时还出现了一个问题:
- content-type(请求头):这个是设置请求文件的长度的,方便知道文件是否传递完成。但是浏览器中不一定只有静态资源,可能还有一些动态的资源。面对这些动态资源就没法知道文件的长度,也就不知道该在content-type中填写什么。
HTTP 1.1
这个时候大家的审美和其他技术的革新导致一个浏览器页面需要的资源文件开始变大,变多。但是每一个资源文件我们都需要发送一个Http请求。这个不断的断开和连接的过程就显得过于浪费,也会导致页面的渲染速度非常的慢。1.1 的开发就是为了解决这个问题。
- 持久连接,减轻了服务器的负担
- 同时最多维护6个持久连接
- 解决了动态资源长度的问题:
使用Chunk transfer机制,将文件处理成若干个数据块并编辑数据块的大小,最后发送一个标记为0的数据块来告诉客户端资源传输完成。 - 解决了可能会出现虚拟机发送请求无法确认ip地址的情况 通过请求头的HOST字段指明了请求服务器的域名/IP地址和端口号
HTTP的长连接也出现了一个至今仍未能完美解决的问题:
队头阻塞:前一个http请求没有得到响应,后一个http请求无法响应。
除此之外长连接还有个带宽利用率低的问题:
- 同时开启多条持久连接,会相互之间竞争带宽
- TCP 的慢启动,拖延了页面首次渲染的时间
HTTP 2.0
在2.0中主要就是为了解决1.1的长连接所带来的带宽利用率低和优化队头阻塞的问题。
- 一次只能维持一个长连接,解决了多个长连接相互竞争带宽的问题,并解决了多个长连接可能会多个队头阻塞更加减慢速度。
- 使用多路复用技术
将每一个请求处理成一帧一帧的请求片段(二进制分帧层),并给每一帧打上标记,服务端接收到所有的帧之后,会将标记相同的帧组合成完整的请求,然后进行解析,响应请求,最后将响应数据发送给客户端,响应体同样会被处理成一帧一帧的请求。
HTTPS
这个主要是对 2.0 进行了一个加密的处理 HTTP 2.0+TLS加密。 而TLS加密是使用对称加密和非对称加密混合加密来获得更高的安全性。
对称加密
双方都要拥有相同的密钥,密钥用于对数据的加密和解密,如何让双方具有相同的密钥?使用网络传输,一旦在传输密钥的阶段被截获,接下来的加密就没有意义
非对称加密
为了解决密钥被截获的问题,引入了非对称加密,使用公钥加密,使用私钥解密。
首先服务端创建公钥和私钥,并将公钥发布出去,客户端创建密钥,通过密钥加密传递给客户端,服务端通过独有的私钥进行解密得到正确的密钥
HTTP 3.0
这个3.0目前其实仍未能普及。但是我们在面试中也能够提上一嘴。 首先来总结一下 HTTP 2.0的一些缺点 2.0 的缺点
- TCP 队头阻塞:当存在数据包丢失时,TCP会重传一个新的包,在新包传递前,后续的数据包会被暂停传输
- TCP 握手 也是时间的开销大
我们能够很明显的发现,这两个其实都是TCP连接的缺点。TCP协议在这么多年的发展中显得有一些僵化。但是由于TCP协议过于底层我们又无法轻易的对其进行修改。因此我们就另辟蹊径,使用UDP协议。 UDP协议相较于TCP协议它有几个特点
- 速度快
- 安全性不高
- 没有超时重传机制,可能会丢失数据包
而3.0就是在UDP协议的基础上进行优化
- 在UDP上实现了TCP的拥塞控制,可靠性传输
- 继承了TLS加密功能
- 实现了多路复用
- 快速握手
最后成为了HTTP 3.0.
尾声
想要面试大厂,很多都是会问到HTTP协议相关的内容,这次带大家一次性走完HTTP整个的发展史,如果对大家的面试有帮助的话希望大家能够给我点个赞,谢谢。