你清楚HTTP超文本传输协议的发展史吗?(从0.9到3.0)

HTTP的发展史往往是面试的常客,所以你清楚HTTP超文本传输协议的发展史吗?这篇文章就让我们来好好捋一捋它的进化史,如果能帮助到你,那就最好不过了。

首先让我们来了解下HTTP是什么。

前言

HTTP(Hypertext Transfer Protocol) 是一种应用层协议,用于在全球计算机网络中传输超文本(即文本、图片、视频等)和其他资源。它是构建万维网(World Wide Web)的基础之一,允许客户端(如浏览器)向服务器发出请求,以获取所需的网络资源。

HTTP的主要作用 : 用于建立客户端和服务器之间的通信。客户端通过发送HTTP请求,指定所需的资源和操作,而服务器则通过HTTP响应,将请求的资源和相关信息返回给客户端。这种请求-响应模型使得用户可以在Web上浏览和访问各种内容,如网页、图片、视频等。

HTTP协议的特点 :

  1. 简单性
  2. 无状态性
  3. 灵活性
  4. 连接性
  5. 可扩展性

总的来说,HTTP协议的设计目标是简单、灵活、可靠,并且易于扩展,这使得它成为了互联网上应用最为广泛的一种网络协议。

HTTP的发展史如下:

HTTP/0.9

HTTP/0.9是HTTP协议的最早版本,于1991年提出。它是一个非常简单的协议,设计用于传输超文本文档,只支持传输HTML格式的文本数据,并且没有任何头部信息。HTTP/0.9没有定义请求方法,只支持一种方法,即GET方法,且每个请求只能获取一个HTML文件。

流程即为:

  1. 客户端发送GET请求,请求一个 xxxx/index.html
  2. 服务器接收到请求后,读取对应的html文件,以ASCII的字符流返回给客户端

特点:

  1. 只有请求行,没有请求头和请求体
  2. 没有响应头
  3. 传输的内容是以ASCII的字符流

作为最早的版本,HTTP/0.9 仅适用于简单的、仅需要获取HTML文档的场景,随着互联网的发展以及浏览器的出现,单纯的文本内容已经无法满足用户需求了,我们需要一个协议,该协议不仅可以服务于超文本文档,还可以提供有关请求和响应的更丰富的数据(如脚本、图片、音频和视频等不同类型的文件)。

所以在1996年HTTP/1.0出现了!

HTTP /1.0

HTTP/1.0 是HTTP协议的第一个正式标准化版本。相较于 HTTP/0.9 有一系列的改进和功能,对互联网的发展产生了重大影响。

它通过引入请求头和响应头来让客户端和服务端更加深入的交流, 这些头部信息以键值对(key-value)的形式组织,提供了关于请求或响应的各种元数据信息。这使得互联网不仅可以传输文字,还能传输图像、视频、文件等等。这为互联网的发展奠定了坚实的基础

请求头部包括客户端发送给服务器的信息,通常包括:

  • Host: 请求的主机名和端口号。
  • User-Agent: 客户端的类型和版本信息。
  • Accept: 客户端能够处理的数据类型。
  • Content-Type: 请求的数据类型,例如表单数据的编码类型。
  • Authorization: 客户端的身份认证信息。
  • Cookie: 客户端的会话信息。

响应头部包括服务器发送给客户端的信息,通常包括:

  • Content-Type: 响应的数据类型。
  • Content-Length: 响应数据的长度。
  • Date: 响应生成的日期时间。
  • Server: 服务器的软件类型和版本信息。
  • Set-Cookie: 服务器设置的会话信息。
  • Location: 重定向URL。

不过 HTTP/1.0 也存在一个非常致命的缺点:每次请求都需要建立新的TCP连接,而TCP连接的建立和关闭过程会消耗时间和资源。 这意味着每次请求一个资源(比如一个JS文件或CSS文件),都会单独发起一个HTTP请求,这就会导致多次的网络往返,每次往返都会产生额外的延迟和开销。

HTTP /1.1

HTTP/1.1于1997年发布,在HTTP/1.0的基础上引入了一些重要的改进和新特性,以提高性能、效率和安全性。 新特性为:

  1. 持久连接(Keep-Alive): HTTP/1.1引入了持久连接的概念,允许在单个TCP连接上发送多个HTTP请求和响应,而不需要在每次请求之后关闭连接。
  2. 管道化(Pipeline): 允许客户端发送多个请求而无需等待之前的请求的响应,这使得可以并行发送多个请求。(很少被使用)
  3. 增强的缓存控制: HTTP/1.1引入了更多的缓存控制机制,包括新的Cache-Control头部字段、ETag标识符、If-Modified-Since和If-None-Match等条件请求,以及Vary头部字段等。
  4. 新增了Host 头字段: HTTP/1.1引入了Host头部字段,允许在同一个服务器上托管多个域名,从而支持虚拟主机的部署,提高了网络资源的利用率。

虽然 HTTP/1.0 允许复用 TCP 连接,但是同一个 TCP 连接里面,每个请求必须等待前一个请求的响应完成后才能发送下一个请求,导致了请求的串行处理。这种串行处理会导致"队头堵塞"(Head-of-line blocking)问题 。(这也是自从HTTP/1.0就存在的问题)

HTTP/1.1 中想要用管道化技术来解决这个问题,但它并不能完全解决。

主要原因是在HTTP/1.1中,所有的请求和响应都是按顺序传输的。管道化技术的作用在于允许客户端在不等待前一个请求的响应返回的情况下发送下一个请求,从而可以在一定程度上提高并发性。然而,由于HTTP/1.1的限制,即使使用了管道化,客户端也必须按照请求的顺序发送请求,并且服务器也必须按照请求的顺序返回响应。因此,如果某个请求由于某种原因被延迟,它之后的所有请求仍然会被阻塞,导致头部阻塞问题。

HTTP1.1的缺陷:

  1. 性能限制: HTTP/1.1 的性能受限于同时打开的TCP连接数,浏览器为了减轻服务器的压力,限制了同一个域名下的 HTTP 连接数,即 6 ~ 8 个。
  2. 队头阻塞: 在 HTTP/1.1 中,每个请求必须等待前一个请求的响应完成后才能发送下一个请求,导致了请求的串行处理。这种串行处理会导致"队头阻塞"(Head-of-Line Blocking)问题。
  3. 明文传输: HTTP/1.1 默认是明文传输,数据在网络上传输时不加密,可能被窃听或篡改。这会导致安全隐患,尤其是对于敏感信息的传输。
  4. 头部信息冗余: 每个请求和响应都包含大量的头部信息,这些信息在每次通信时都需要传输,导致了额外的带宽消耗和网络延迟。

HTTP /2.0

HTTP/2.0于2015年发布,是HTTP/1.1的后续版本。

以下是HTTP/2.0的一些主要特点:

  • 多路复用(Multiplexing): 可以在同一个TCP连接上并行发送多个请求和响应,废弃了 1.1 里的管道
  • 二进制协议: HTTP/2.0使用二进制格式传输数据,而不是像先前那样使用文本格式。二进制协议更加高效和紧凑,减少了传输数据的大小和开销,
  • 头部压缩: 支持对请求和响应的头部信息进行压缩,减少了头部信息的大小,
  • 服务器推送(Server Push): HTTP/2.0允许服务器在客户端请求之前推送资源到客户端,从而避免了客户端发起额外的请求。
  • 安全性 : HTTP/2要求使用TLS协议进行加密通信,提高了数据的安全性。

多路复用

HTTP/2中,一个域名(或者说一个源站)通常只会使用一个 TCP 长连接,这就是因为 HTTP/2 的多路复用(Multiplexing)机制允许在单个 TCP 连接上同时传输多个请求和响应。

其中多路复用的实现基于数据流 的概念,在HTTP/2连接上,每个请求和响应被划分为一个或多个独立的数据流(Stream)。每个数据流都有一个唯一的标识符(Stream ID),用于标识该数据流和区分不同的请求和响应。多个数据流可以在同一个TCP连接上并行传输,这意味着即使一个数据流由于某种原因被延迟,其他数据流仍然可以继续传输,不会受到影响.并且每个数据流可以按需调整优先级,以确保重要的请求能够更快地得到处理。

HTTP/2.0同时引入了https

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)是HTTP协议的安全版本,通过在HTTP和TCP之间添加一层SSL/TLS协议来对通信数据进行加密和认证,可以理解为HTTPS = HTTP + SSL/TLS

其中的TLS位于传输层之上,应用层之下,TLS中包含了对称加密非对称加密

  1. 对称加密(Symmetric Encryption): 对称加密使用相同的密钥来加密和解密数据。在TLS握手过程中,客户端和服务器会协商一个会话密钥。
  2. 非对称加密(Asymmetric Encryption): 非对称加密使用一对密钥(公钥和私钥)来加密和解密数据。即服务端生成公钥和私钥,将公钥发布出来,客户端接收到公钥后生成一个秘钥,再利用公钥加密改秘钥传输给服务端,服务端用独有的私钥解密得到秘钥

HTTPS特点:

  1. 数据加密: HTTPS通过使用SSL/TLS协议对通信数据进行加密,使得数据在传输过程中变得不可读。
  2. 身份认证: HTTPS通过数字证书对通信双方进行身份认证,确保通信的对方是合法的,并且没有被篡改。服务器会向客户端发送数字证书,证书包含了服务器的公钥以及相关的信息,客户端通过验证证书的有效性来确认服务器的身份。客户端也可以选择向服务器发送自己的数字证书,用于服务器对客户端的身份进行验证。
  3. 数据完整性: HTTPS使用消息认证码(MAC)或哈希函数来保护通信数据的完整性,防止数据在传输过程中被篡改。

HTTP /3.0

HTTP/3是HTTP协议的最新版本,它是基于Google开发的QUIC(Quick UDP Internet Connections)协议而来。

那为什么我们不继续使用之前的TCP协议呢?

HTTP/2.0 自身是很完美的,但TCP却给它带来了不可以忽视的缺陷。

TCP的缺陷

  1. 连接建立延迟: TCP在建立连接时需要进行三次握手,这导致了连接建立的延迟。尤其在高延迟的网络环境下,连接建立时间可能会显著增加,影响通信的实时性和性能。
  2. TCP的队头阻塞: 当单个数据包丢失时,TCP会暂停后续的包的传输,先重传丢失的包数据
  3. TCP慢启动: 在TCP连接建立时和网络拥塞恢复时,以较慢的速度逐渐增加发送窗口(cwnd)的大小,以防止过度拥塞和网络资源的浪费。

正是TCP上存在种种缺陷,所以我们就必须绕过TCP,创造一个新的传输协议。

QUIC协议

QUIC是一种由基于UDP协议的传输协议,能将传输层和应用层的功能整合在一起,具有以下特点:

  1. 基于UDP: QUIC是基于UDP协议的,与TCP不同,它不需要进行TCP三次握手和四次挥手,从而减少了连接建立和断开的延迟。同时,UDP协议的灵活性和适应性也使得QUIC更适合于移动网络和高延迟网络环境。
  2. 多功能性: QUIC整合了传输层和应用层的功能,支持多种网络协议和特性,如HTTP/2多路复用、TLS加密、拥塞控制、丢包重传、流量控制等。
  3. 快速连接建立: QUIC支持0-RTT(Zero Round-Trip Time)握手,允许客户端在首次连接时发送数据,而无需等待服务器的响应。这可以加速连接建立过程,减少了握手的延迟。
  4. 实时性和安全性: QUIC提供了更快速、更可靠的网络通信,适用于对实时性要求较高的应用场景,如在线游戏、实时视频和语音通话等。同时,QUIC使用TLS协议对通信数据进行加密,确保了通信的安全性和隐私保护。
  5. 适应性: QUIC具有良好的网络适应性,可以在不同网络环境下自动调整拥塞控制算法和传输参数,以提供最佳的网络性能和用户体验。

虽然HTTP/3.0很好,但从 2.0 到 3.0 存在一定的困难和挑战,比如:

  1. 将传输协议从TCP切换到QUIC需要对网络栈进行较大的改变。这涉及到底层的协议栈、操作系统和网络设备等多方面的变动
  2. HTTP/3.0和HTTP/2.0在协议上有较大的差异,因此需要确保现有的服务器、客户端和中间件能够兼容新版本的协议。这可能需要进行软件升级或替换。

总结 🌸🌸🌸🌸

  1. HTTP/0.9: 是HTTP的最早版本。它是一种非常简单的协议,只支持传输HTML文档,没有请求头和响应头,也没有状态码等功能。
  2. HTTP/1.0: 是HTTP的第一个正式版本。它引入了请求头和响应头,以及状态码等功能,提供了更多的控制和信息交换机制。
  3. HTTP/1.1: 是HTTP的主流版本。HTTP/1.1在1.0版本的基础上进行了优化和改进,引入了持久连接、管线化、虚拟主机、分块传输编码等功能,提高了性能和效率。
  4. HTTP/2.0: 是HTTP的重大升级版本。HTTP/2.0采用了二进制协议,引入了多路复用、头部压缩、服务器推送等功能,提高了网络通信的效率和性能,适应了当今高速网络的需求。
  5. HTTP/3: HTTP/3采用了QUIC作为传输协议,基于UDP协议,具有更快速的连接建立和更好的适应性。它将进一步提高网络通信的效率和安全性,适应未来网络发展的需求。
相关推荐
Caramel_biscuit1 小时前
C++专业面试真题(1)学习
c++·学习·面试
杰哥在此8 小时前
Java面试题:讨论持续集成/持续部署的重要性,并描述如何在项目中实施CI/CD流程
java·开发语言·python·面试·编程
青青草原上的梦想家10 小时前
Cocos Creator 游戏性能优化指南
游戏·面试·性能优化·typescript
EthanWsir10 小时前
嵌入式C语言面试相关知识——关键字(不定期更新)
c语言·开发语言·面试
tq0212 小时前
JavaSE面试题(二)
java·开发语言·面试
熊出没14 小时前
【面试八股文】java基础知识
java·面试·职场和发展
自由的巨浪15 小时前
HTTP 协议基础知识 - 认识 HTTP 报文
http
桔筐17 小时前
HTTP-概述
网络·网络协议·http
许良辰19 小时前
vue入门:创建并理解你的vue项目
前端·vue.js·面试
Bao_Lee19 小时前
MyBatis 框架核心及面试知识要点
java·面试·mybatis