前言
HTTP协议是一种用于在网络上传输信息的应用层协议,它为万维网的运作提供了基础。
最早的版本是HTTP/0.9,它是HTTP协议的第一个版本,诞生于1991年,其设计初衷是为了在计算机之间传输简单的超文本文档,即HTML。
在HTTP2之前,HTTP一直都是基于文本的协议,足够的简单、良好的可读性是HTTP协议能取得如此成功的重要原因之一。
然而,随着互联网的发展和网页内容的复杂性增加,基于文本的HTTP协议逐渐暴露出一些性能上的限制。为了解决这些问题,才有了HTTP2。
HTTP协议
版本 | 发布年份 | 主要特点 |
---|---|---|
HTTP 0.9 | 1991年 | 最初版本,用于传输超文本(HTML)文档 |
HTTP 1.0 | 1996年 | 支持多种类型的数据和HTTP头部 |
HTTP 1.1 | 1997年 | 长连接、管道化、缓存机制,提高了性能和效率 |
HTTP/2 | 2015年 | 二进制协议、多路复用、头部压缩、服务器推送、流量控制 |
HTTP/0.9
HTTP/0.9是最早的HTTP协议版本,于1991年发布。它非常简单,典型的请求-响应模型,没有定义任何HTTP头部信息,只支持传输HTML。它的主要特点如下:
- 只支持GET
- 无HTTP头部
- 纯文本协议
请求示例:
GET /index.html
响应示例:
<html><body>content</body>
</html>
HTTP/1.0
HTTP/1.0是HTTP协议的一个重要版本,于1996年发布。
HTTP/1.0相对于HTTP/0.9,增加了以下内容和特性:
- 新增POST、HEAD请求方法
- 引入请求头信息
- 引入响应状态码,如:200表示成功
请求示例:
GET /path/file.html HTTP/1.0
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
响应示例:
HTTP/1.0 200 OK
Date: Fri, 08 Jul 2023 18:30:00 GMT
Server: Apache/2.4.7 (Ubuntu)
Content-Length: 256
Content-Type: text/html<html>
<body>...
</body>
</html>
HTTP/1.1
HTTP/1.1相对于HTTP/1.0,增加了以下内容和特性:
- 持久连接:HTTP/1.1默认使用持久连接,即在单个TCP连接上可以发送多个请求和获得多个响应。这样可以减少建立和关闭连接的开销,提高性能。
- 管道化:在一个连接上可以同时发送多个请求,而无需等待每个请求的响应。服务器也可以按照请求的顺序回复响应,进一步提高了性能。
- 分块传输编码:允许服务器将响应分成多个部分进行传输,这对于传输大文件或者流式数据非常有用。
- Host头部:允许在一个物理服务器上托管多个域名或多个虚拟主机,服务器根据不同的 Host 头部字段来选择不同的网站或虚拟主机进行请求处理。
HTTP2
为什么命名不是HTTP/1.2?因为HTTP2协议关于数据传输的部分改动很大,从一个基于文本的协议升级到了二进制协议,属于是大版本的升级。
相较于HTTP/1.1,HTTP2的特点是:
- 二进制分帧消息:从一个文本协议升级到了二进制协议,HTTP2把消息切分成多个二进制帧Frame发送,为了区分不同的消息,帧有很多类型,例如传输请求头的HEADERS帧,传输消息体的DATA帧等。
- 多路复用:HTTP2在单个连接上可以同时开辟多个逻辑上的流Stream,消息是基于Stream发送的,意味着请求和响应可以并发处理。
- 头部压缩:之前是消息体可以压缩,在HTTP2上,消息头也支持压缩了。
- 服务端推送:不止是客户端请求服务端,现在服务端也可以主动推送数据给客户端了。
- 流量控制:HTTP1因为在单个连接上,请求-响应都是串行的,因此直接依赖于底层TCP的流控就好了。HTTP2有了多路复用,单个连接上可以同时有多个Stream,此时必须要实现更精细化的流量控制。
HTTP2会把消息拆分成多个Frame发送,这些Frame是基于二进制传输的,无法直接拆看,必须使用对应的工具或三方库来处理这些Frame。
关于HTTP2的各种Frame的格式,以及其它介绍,可以查看这篇文档:https://httpwg.org/specs/rfc9113.html#FrameTypes