了解 HTTP 各个版本以及特点
什么是 HTTP
HTTP超文本传输协议,是一种应用层协议。它允许客户端(如Web浏览器)通过Internet从服务器获取网页内容。HTTP协议使用TCP/IP协议层次上的一个应用层协议,主要负责在客户端和服务器之间传输Web内容。它定义了客户端和服务器之间交互的格式和规则,包括请求方法、请求头、请求体、响应状态码、响应头、响应体等。
HTTP协议是无状态的,意味着每个请求都是独立的,服务器不会保留关于客户端的任何会话信息。为了保持会话状态,可以使用Cookie或Session等机制。
HTTP协议经历了多个版本的发展,从HTTP/0.9到HTTP/3,每个版本都在不断地优化性能、安全性和功能。
HTTP 0.9
- 最早的
HTTP版本,于1991年发布,设计非常简单。
- 没有在通讯中指定版本号。
- 只支持
GET方法请求资源
- 不支持状态码。
- 该版本没有头部信息,只能用于传输获取纯文本格式(通常是
HTML)的超文本内容。
HTTP 0.9 具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。
HTTP 1.0
- 在
1996年发布,是第一个正式版HTTP协议。
- 定义了基本的
HTTP协议架构,包括请求行、状态行、请求头、响应头和消息体等组成部分。HTTP 的请求和回应格式也发生了变化,除了要传输的数据之外,每次通信都包含头信息,用来描述一些信息。
- 引入了多种
HTTP方法,如GET、POST、HEAD等。传输的数据不再局限于 0.9 版本的纯文本格式,根据头信息中的 Content-Type 属性,可以支持多种数据格式。
- 默认情况下,每个请求都会建立一个新的
TCP连接,并在请求完成后关闭连接,这被称为短链接。每个新的HTTP请求都需要建立一个新的TCP连接,TCP 连接的建立成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢。所以效率较低。
- 随着网页加载的外部资源越来越多,这个问题就愈发突出了。为了解决这个问题,有些浏览器在请求时,即在请求头部加上
Connection:keep-alive 要求服务器不要关闭TCP连接,以便其他请求复用。 服务器同样回应这个字段。一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接。但是,这不是一个标准字段, 不同浏览器实现的行为可能不一致,因此不是根本的解决办法。
- 支持缓存机制,通过
Expires等头部字段控制缓存策略,就是当客户端在规定时间内访问同一网站,直接访问cache即可。
- 其他的新增功能还包括状态码,提供了状态码来标识请求结果的成功与否以及原因。多字符集支持、多部分发送、权限、内容编码等。
HTTP 1.1
- 在
1999年发布,成为目前广泛使用的版本。
- 引入了持久连接
HTTP Keep-Alive,TCP 连接默认不关闭,允许在一个TCP连接上发送多个HTTP请求和响应,从而减少每次请求时新建和关闭连接的开销,从而显著提高性能。不用声明 Connection: keep-alive。客户端在最后一个请求时,可以发送 Connection: close,明确要求服务器关闭TCP连接。
- 增加了更多的
HTTP方法,例如PUT、DELETE、OPTIONS、TRACE等。
- 支持管道化,理论上允许客户端在一个连接上连续发送多个请求而不需等待前一个请求的响应,一个
TCP 连接现在可以传送多个回应。但是需要有一种机制,区分数据包是属于哪一个回应的。这就是 Content-length 字段的作用,声明本次回应的数据长度。
- 分块传输编码
Chunked Transfer-Encoding:允许服务器动态生成响应并在数据可用时逐步传输给客户端,无需预先知道内容长度。可以不使用Content-Length 字段,而使用"分块传输编码"chunked transfer encoding。只要请求或回应的头信息有Transfer-Encoding字段,就表明回应将由数量未定的数据块组成。
- 强化了缓存机制, 增加了
Cache-Control等更多缓存控制相关的头部字段。
- 引入了
Host头域,客户端请求的头信息新增了Host字段,用来指定服务器的域名,使得单一服务器可以托管多个网站。
HTTP 1.1 支持文件断点续传,RANGE:bytes,HTTP 1.0 每次传送文件都是从文件头开始,即 0 字节处开始。RANGE:bytes=XXXX 表示要求服务器从文件 XXXX 字节处开始传送,断点续传,即返回码是 206。
HTTP 2.0
HTTP/2.0是最新的HTTP版本,于2015年5月作为互联网标准正式发布。
- 二进制分帧,
HTTP 1.1 版的头信息肯定是文本,数据体可以是文本,也可以是二进制。HTTP 2.0 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧":头信息帧和数据帧。
- 多路服用,
HTTP 2.0 复用 TCP 连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。
- 头信息压缩,
HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,HTTP 2.0 对这一点做了优化, 引入了头信息压缩机制。
- 一方面,头信息使用
gzip 或 compress 压缩后再发送;
- 另一方面,客户端和服务器同时维护一张头信息表, 所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
- 服务器推送,
HTTP 2.0 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。
HTTP 3 正在推广阶段