HTTP协议的发展过程-CSDN博客

98 阅读4分钟

前言

HTTP协议是一种用于在网络上传输信息的应用层协议,它为万维网的运作提供了基础。
最早的版本是HTTP/0.9,它是HTTP协议的第一个版本,诞生于1991年,其设计初衷是为了在计算机之间传输简单的超文本文档,即HTML。
在HTTP2之前,HTTP一直都是基于文本的协议,足够的简单、良好的可读性是HTTP协议能取得如此成功的重要原因之一。
然而,随着互联网的发展和网页内容的复杂性增加,基于文本的HTTP协议逐渐暴露出一些性能上的限制。为了解决这些问题,才有了HTTP2。

HTTP协议

版本发布年份主要特点
HTTP 0.91991年最初版本,用于传输超文本(HTML)文档
HTTP 1.01996年支持多种类型的数据和HTTP头部
HTTP 1.11997年长连接、管道化、缓存机制,提高了性能和效率
HTTP/22015年二进制协议、多路复用、头部压缩、服务器推送、流量控制

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,增加了以下内容和特性:

  1. 新增POST、HEAD请求方法
  2. 引入请求头信息
  3. 引入响应状态码,如: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,增加了以下内容和特性:

  1. 持久连接:HTTP/1.1默认使用持久连接,即在单个TCP连接上可以发送多个请求和获得多个响应。这样可以减少建立和关闭连接的开销,提高性能。
  2. 管道化:在一个连接上可以同时发送多个请求,而无需等待每个请求的响应。服务器也可以按照请求的顺序回复响应,进一步提高了性能。
  3. 分块传输编码:允许服务器将响应分成多个部分进行传输,这对于传输大文件或者流式数据非常有用。
  4. 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的格式,以及其它介绍,可以查看这篇文档:httpwg.org/specs/rfc91…