说一说http的发展史

前言

HTTP (Hypertext Transfer Protocol) 是一种用于传输超文本的应用层协议。它是万维网的基础,用于在客户端和服务器之间传输资源,如 HTML 页面、图像、视频等。

HTTP的发展史可以追溯到互联网的早期阶段, 那个时候的数据是写死的,只能传输纯文本数据。从最早的HTTP/0.9到如今的HTTP/3,HTTP协议发生了许多的变化,今天我们就来聊聊HTTP各个版本叭。

HTTP/0.9

HTTP/0.9是HTTP协议的最早版本,也是最简单的版本,于1991年由蒂姆·伯纳斯-李(Tim Berners-Lee)创建。它的设计目标是简单、易于实现,用于传输超文本。

  1. 客户端发送GET请求,请求一个 xxxx/index.html

  2. 服务器接受到请求后,读取对应的html文件,以ASCII的字符流返回给客户端

特征

  1. 只支持GET请求

    • HTTP/0.9只支持一种请求方法,即GET方法。这意味着客户端只能请求服务器上的资源,并不能向服务器发送任何数据。例如,通过GET请求可以请求一个HTML页面,但不能通过HTTP/0.9协议向服务器提交表单数据。
  2. 只支持纯文本

    • HTTP/0.9只能传输纯文本数据,不能传输二进制数据或其他类型的数据。因此,它主要用于传输HTML页面和超文本链接。
  3. 只有请求行,没有请求头和请求体

  4. 没有响应头

  5. 传输的内容是以ASCII的字符流

HTTP/1.0

HTTP/1.0是HTTP协议的一个重要版本,它于1996年发布。HTTP/1.0在HTTP/0.9的基础上引入了许多新的功能和改进,使得它更加灵活和功能强大。

  1. 相比于HTTP/0.9, HTTP/1.0可以支持多种类型文件的传输, 且不限于ASCII编码方式

  2. 因为Http/1.0支持多种类型文件的传输,那么就需要告诉浏览器需要以哪种方式去加载这些文件,通过引入请求头和响应头来让客户端和服务端更加深入的交流,key-value形式。

特征

  1. 支持多种请求方法

    • HTTP/1.0引入了多种请求方法,包括GET、POST、HEAD、PUT、DELETE等。这些请求方法允许客户端向服务器发送不同类型的请求,如获取资源、提交数据、获取资源头部信息等。
  2. 响应状态码

    • HTTP/1.0引入了响应状态码,用于指示服务器对请求的处理结果。常见的状态码包括200(OK,请求成功)、404(Not Found,资源未找到)、500(Internal Server Error,服务器内部错误)等。

HTTP/1.1

HTTP/1.1是HTTP协议的一个重要版本,于1999年发布。它在HTTP/1.0的基础上引入了许多改进和新特性,提高了性能、效率和安全性。

  1. 持久连接

    • HTTP/1.1默认支持持久连接,即在单个TCP连接上可以发送和接收多个HTTP请求和响应,而不必为每个请求建立新的连接。这减少了连接建立和关闭的开销,提高了性能和效率。但是持久连接会带来队头阻塞的问题。

队头阻塞:如果某个请求因为某种原因被阻塞,那么后续的请求也会被阻塞,从而导致页面加载速度下降。

页面中的所有不可能一次性的请求回来,所以可能会存在多条TCP持久连接,浏览器默认支持 6个TCP持久连接

  1. Chunk transfer 机制 :
    • 将数据分割成若干个任意大小的数据块,每个数据块标记好长度,最后发送一个长度为0的数据块为标志发送完毕

http/1.0中,需要在响应头中设置数据的大小,例如content-Length: 1024,但是后端并不清楚自己所发的数据的大小,数据有可能是动态的。所以http/1.1中推出Chunk transfer去解决这个问题。

  1. 虚拟主机的默认支持

    • HTTP/1.1将虚拟主机的支持作为默认功能,不再需要通过特殊的头部信息指定主机。这使得托管多个域名的服务器更容易配置和管理。
  2. Host头部

    • HTTP/1.1引入了Host头部,用于指定请求的目标主机。这使得在同一台服务器上托管多个域名的虚拟主机更加灵活和简单。

HTTP/2.0

  • 1.1 的问题: 带宽用不满
    1. TCP的慢启动: 拥塞控制导致一定会慢启动,慢启动导致页面关键资源加载时间推后
    2. 多条TCP连接竞争带宽导致每条TCP连接中能被分配的带宽大大降低
    3. 队头阻塞,前一个请求延迟,后一个请求便无法发送,导致带宽浪费

HTTP/2.0通过引入多路复用来优化

多路复用

  1. 一个域名只使用一个TCP长连接

  2. 将每一个请求分成一帧一帧的数据进行传输并打上标记,同时发送给服务端,且可以在重要资源 请求中编辑为加急,服务端接受到带有各种标号的数据帧后,可以区分哪个数据帧加急,优先整理 和响应该请求的数据帧 (通过引入了二进制分帧层实现多路复用)

HTTP/3.0

2.0的缺陷:

  1. TCP的队头阻塞: 当单个数据包丢失时,TCP会暂停后续的包的传输,先重传丢失的包数据
  2. TCP的慢启动

基于 QUIC 协议

  • HTTP/3 使用 QUIC(Quick UDP Internet Connections)作为传输协议,取代了 TCP。QUIC 是基于 UDP 的协议,结合了传输层和应用层协议的功能,提供了更快的连接建立、更灵活的拥塞控制和更强的安全性。QUIC 还支持多路复用和头部压缩等功能,有助于提高性能和效率。
相关推荐
程序猿进阶13 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
彭世瑜22 分钟前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript
FØund40423 分钟前
antd form.setFieldsValue问题总结
前端·react.js·typescript·html
Backstroke fish24 分钟前
Token刷新机制
前端·javascript·vue.js·typescript·vue
小五Five25 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序25 分钟前
vue3 封装request请求
java·前端·typescript·vue
临枫54126 分钟前
Nuxt3封装网络请求 useFetch & $fetch
前端·javascript·vue.js·typescript
前端每日三省27 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
小刺猬_98528 分钟前
(超详细)数组方法 ——— splice( )
前端·javascript·typescript
渊兮兮29 分钟前
Vue3 + TypeScript +动画,实现动态登陆页面
前端·javascript·css·typescript·动画