前言
HTTP (Hypertext Transfer Protocol) 是一种用于传输超文本的应用层协议。它是万维网的基础,用于在客户端和服务器之间传输资源,如 HTML 页面、图像、视频等。
HTTP
的发展史可以追溯到互联网的早期阶段, 那个时候的数据是写死的,只能传输纯文本数据。从最早的HTTP/0.9
到如今的HTTP/3
,HTTP
协议发生了许多的变化,今天我们就来聊聊HTTP
各个版本叭。
HTTP/0.9
HTTP/0.9是HTTP协议的最早版本,也是最简单的版本,于1991年由蒂姆·伯纳斯-李(Tim Berners-Lee)创建。它的设计目标是简单、易于实现,用于传输超文本。
- 客户端发送GET请求,请求一个 xxxx/index.html
- 服务器接受到请求后,读取对应的html文件,以ASCII的字符流返回给客户端
特征
- 只支持GET请求:
- HTTP/0.9只支持一种请求方法,即GET方法。这意味着客户端只能请求服务器上的资源,并不能向服务器发送任何数据。例如,通过GET请求可以请求一个HTML页面,但不能通过HTTP/0.9协议向服务器提交表单数据。
- 只支持纯文本:
- HTTP/0.9只能传输纯文本数据,不能传输二进制数据或其他类型的数据。因此,它主要用于传输HTML页面和超文本链接。
- 只有请求行,没有请求头和请求体
- 没有响应头
- 传输的内容是以ASCII的字符流
HTTP/1.0
HTTP/1.0是HTTP协议的一个重要版本,它于1996年发布。HTTP/1.0在HTTP/0.9的基础上引入了许多新的功能和改进,使得它更加灵活和功能强大。
- 相比于
HTTP/0.9
,HTTP/1.0
可以支持多种类型文件的传输, 且不限于ASCII
编码方式 - 因为
Http/1.0
支持多种类型文件的传输,那么就需要告诉浏览器需要以哪种方式去加载这些文件,通过引入请求头和响应头来让客户端和服务端更加深入的交流,key-value形式。
特征
- 支持多种请求方法:
- HTTP/1.0引入了多种请求方法,包括GET、POST、HEAD、PUT、DELETE等。这些请求方法允许客户端向服务器发送不同类型的请求,如获取资源、提交数据、获取资源头部信息等。
- 响应状态码:
- HTTP/1.0引入了响应状态码,用于指示服务器对请求的处理结果。常见的状态码包括200(OK,请求成功)、404(Not Found,资源未找到)、500(Internal Server Error,服务器内部错误)等。
HTTP/1.1
HTTP/1.1是HTTP协议的一个重要版本,于1999年发布。它在HTTP/1.0的基础上引入了许多改进和新特性,提高了性能、效率和安全性。
- 持久连接:
- HTTP/1.1默认支持持久连接,即在单个TCP连接上可以发送和接收多个HTTP请求和响应,而不必为每个请求建立新的连接。这减少了连接建立和关闭的开销,提高了性能和效率。但是持久连接会带来
队头阻塞
的问题。
队头阻塞:如果某个请求因为某种原因被阻塞,那么后续的请求也会被阻塞,从而导致页面加载速度下降。
页面中的所有不可能一次性的请求回来,所以可能会存在多条TCP持久连接,浏览器默认支持 6个TCP持久连接
- Chunk transfer 机制:
- 将数据分割成若干个任意大小的数据块,每个数据块标记好长度,最后发送一个长度为0的数据块为标志发送完毕
在http/1.0
中,需要在响应头中设置数据的大小,例如content-Length: 1024
,但是后端并不清楚自己所发的数据的大小,数据有可能是动态的。所以http/1.1
中推出Chunk transfer
去解决这个问题。
- 虚拟主机的默认支持:
- HTTP/1.1将虚拟主机的支持作为默认功能,不再需要通过特殊的头部信息指定主机。这使得托管多个域名的服务器更容易配置和管理。
- Host头部:
- HTTP/1.1引入了Host头部,用于指定请求的目标主机。这使得在同一台服务器上托管多个域名的虚拟主机更加灵活和简单。
HTTP/2.0
- 1.1 的问题: 带宽用不满
- TCP的慢启动: 拥塞控制导致一定会慢启动,慢启动导致页面关键资源加载时间推后
- 多条TCP连接竞争带宽导致每条TCP连接中能被分配的带宽大大降低
- 队头阻塞,前一个请求延迟,后一个请求便无法发送,导致带宽浪费
HTTP/2.0
通过引入多路复用
来优化
多路复用
- 一个域名只使用一个TCP长连接
- 将每一个请求分成一帧一帧的数据进行传输并打上标记,同时发送给服务端,且可以在重要资源 请求中编辑为加急,服务端接受到带有各种标号的数据帧后,可以区分哪个数据帧加急,优先整理 和响应该请求的数据帧 (通过引入了二进制分帧层实现多路复用)
HTTP/3.0
2.0的缺陷:
- TCP的队头阻塞: 当单个数据包丢失时,TCP会暂停后续的包的传输,先重传丢失的包数据
- TCP的慢启动
基于 QUIC 协议:
- HTTP/3 使用 QUIC(Quick UDP Internet Connections)作为传输协议,取代了 TCP。QUIC 是基于 UDP 的协议,结合了传输层和应用层协议的功能,提供了更快的连接建立、更灵活的拥塞控制和更强的安全性。QUIC 还支持多路复用和头部压缩等功能,有助于提高性能和效率。