HTTP——浏览器和服务器之间的通信语言
【HTTP/0.9】
- 目的:用来传输体积很小的HTML文件。
- 特点:只有请求行,没有请求头和请求体;没有返回头信息,只返回了数据;返回的文件内容是以ASCII字符流来传输的;
【HTTP/1.0】
- 核心诉求:支持多种类型文件的下载。
- 引入请求头(期望返回的文件类型、采用什么类型压缩、提供什么语言的文件、文件的具体编码)和响应头(压缩类型、返回文件类型)
- 为了减轻服务器的压力,HTTP1.0中提供了cache机制,用来缓存已经下载过的数据。
- 服务器需要统计客户端的具体信息,所以请求头中加入了用户代理的字段。
【缝缝补补的HTTP/1.1】
- 增加长连接(减少了TCP连接的建立以及断开次数,减少了服务器压力);
- 浏览器为每个域名最多同时维护6个TCP持久链接;
- 出现队头阻塞的问题;
- 提供虚拟主机的支持(请求头增加Host字段);
- Chunk transfer 机制(对动态生成的内容进行了完美的支持);
- 客户端的cookie、安全机制
虽然HTTP/1.1在HTTP/1.0基础上做了大量的优化,但依然存在很多性能瓶颈,所以最终还是被HTTP/2所取代。HTTP/1.1对带宽的利用也不理想。
【HTTP/1.1的主要问题】
对带宽的利用率不理想。(带宽:每秒最大能发送或者接收的字节数)
原因:
- TCP的慢启动;(通常TCP连接建立好了之后就会请求一些关键的资源文件,由于慢启动,推迟了页面首次渲染的时常)(慢启动是TCP为了减少网络阻塞的策略,不能改变)
- 同时开启了多条TCP连接,这些连接会竞争固定的带宽。
- 队头阻塞问题。(假如有的请求被阻塞了 5 秒,那么后续排队的请求都要延迟等待 5 秒,在这个等待的过程中,带宽、CPU 都被白白浪费了)(队头阻塞使得这些数据不能并行请求,所以队头阻塞是很不利于浏览器优化的)
【HTTP/2】
HTTP/1.1 所存在的一些主要问题:慢启动和 TCP 连接之间相互竞争带宽是由于 TCP 本身的机制导致的,而队头阻塞是由于 HTTP/1.1 的机制导致的。
解决办法:
- 规避TCP的慢启动以及TCP连接之间的竞争问题——一个域名只使用一个TCP长连接来传输数据(只经历一次慢启动,避免了TCP连接之间对带宽的竞争)
- 解决队头阻塞问题——实现资源的并行请求
所以,HTTP/2 的解决方案可以总结为:一个域名只使用一个 TCP 长连接和消除队头阻塞问题(多路复用机制)。
HTTP/2 使用了多路复用技术,可以将请求分成一帧一帧的数据去传输,这样带来了一个额外的好处,就是当收到一个优先级高的请求时,比如接收到 JavaScript 或者 CSS 关键资源的请求,服务器可以暂停之前的请求来优先处理关键资源的请求。
一个域名只使用一个TCP长连接, 每个请求都有一个对应的 ID。
【HTTP/2特性】
- 多路复用
- 可设置请求的优先级
- 服务器推送(直接将数据提前推送到浏览器)
- 压缩请求头和响应头