HTTP协议(1.0/1.1/2.0/3.0)发展历程

HTTP协议,即超文本传输协议,最近刷面经经常看到有面试官提到HTTP不同版本的发展历程,特此记录一下。

HTTP协议是超文本传输协议的缩写,是用于从万维网传输超文本到浏览器的传输协议。HTTP基于TCP/IP通信协议来传递数据(HTML文件,图片文件、查询结果等)。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

最早期的时候,采用的是HTTP0.9协议(只有短连接),这里就不谈该协议了。

首先是HTTP1.0,HTTP1.0协议是较早提出的且应用广泛的HTTP协议,它仍然默认采用的是短连接的方式,但是提出了长连接的概念。

我们都知道,HTTP协议的特性就是无状态、无连接,HTTP1.0可以说是完美继承了这一特点。由于其短连接的特性客户端,每次向服务端发送请求,都需要等待服务端处理完毕发送回响应才能继续发送请求,这样实际上会出现很严重的队头阻塞问题。

因此,HTTP1.1应运而生,HTTP1.1协议通过在响应头加上Connection:keep-alive子段,可以使该TCP连接变为长连接,并使用pipelining技术(管道化,即打包请求过去,再打包响应回来,会出现粘包问题,采用Content-Length首部 来区分数据长度)解决了客户端的队头阻塞,如下图所示:

HTTP协议(1.0/1.1/2.0/3.0)发展历程_第1张图片

 虽然客户端的队头阻塞解决了,但是由于HTTP协议本身是无状态的,所以服务端必须要按序返回响应才行,但是由于网络本身是乱序的,后来的请求可能会先一步到达,但即使该请求已处理完毕,同样要等待之前的请求处理完才能响应,所以服务端还是存在着队头阻塞的问题。并且,HTTP1.1协议头部较长,可能本身携带的数据远远小于头部的长度。

为了解决这两个问题,于是有了HTTP2.0协议,HTTP2.0协议针对这两个问题,提出了以下两个解决方案:

  1. 开发了专门的“HPACK”算法,大大压缩了Header信息。
  2. 将请求和响应数据分割为更小的帧,并且它们采用二进制编码,并提出了multiplexing即多路复用(单个连接上可以进行并行交错的请求和响应,之间互不干扰)

由此,头部过大以及队头阻塞的问题就解决了,但是还是存在另一个问题——TCP队头阻塞问题,众所周知,TCP协议过滑动窗口这么一个机制来进行包之间的传递的,当服务端接收到某个序列号靠前的包在网络中丢失了,那么后续的包都需要等待该数据包到达才能进行发送(本身TCP协议为了解决该问题也有快重传以及快恢复机制),这就是TCP队头阻塞问题。

HTTP3.0的提出主要就是解决了该问题,既然TCP协议这么多问题,那干脆就不使用它了。HTTP3.0协议采用了基于 UDP协议 的 QUIC协议 来实现,本质上是将多个并行连接合并在一起,减少建立握手挥手的次数。

这里再附加一个HTTP常见状态码:
100:继续,客户端应继请求;
200:请求成功;
301:资源(网页等)被永久转移到其他 URL;
302:暂时重定向;
403: Forbidden —禁止访问;
404:请求的资源(网页等)不存在;
500:内部服务器错误。

你可能感兴趣的:(http,网络,服务器)