http发展史(http0.9、http1.0、http1.1、http/2、http/3)详解

news2024/11/26 22:23:39

文章目录

  • HTTP/0.9
  • HTTP/1.0
  • HTTP/1.1
  • @队头阻塞(Head-of-Line Blocking)
        • 1. TCP 层的队头阻塞
        • 2. HTTP/1.1 的队头阻塞
  • HTTP/2
  • HTTP/3

在这里插入图片描述


HTTP/0.9

发布时间:1991年

特点

  • 只支持 GET 方法
  • 没有 HTTP 头部
  • 响应中只有 HTML 内容,没有任何元数据。

缺点

  • 功能极其有限,只能传输纯文本内容。
  • 没有状态码和头部信息,无法提供有关请求或响应的额外信息。

HTTP/1.0

发布时间:1996年

改进点

  • 引入更多的请求方法,如 POST 和 HEAD。
  • 支持 HTTP 头部,允许传输元数据。
  • 引入状态码,用于指示请求的结果。
  • 支持内容类型,允许传输非 HTML 内容。

缺点

  • 每个请求/响应对话都需要新建一个 TCP 连接,导致高延迟和低效率(http协议的瞬时性,如图
  • 没有缓存控制,导致频繁的重复请求
    http协议的瞬时性

HTTP/1.1

发布时间:1997年

改进点

  • 引入持久连接(Persistent Connections),允许在一个 TCP 连接上传输多个请求/响应,减少连接开销。但必须等待上次一次请求结束,才能开启下一次请求

  • 注:由于一个TCP连接同一时间只能做一次http请求,为了提高效率,主流浏览器往往同时并发6个TCP连接tcp connection,6个管道,这也是一种解决瞬时协议的办法,这是浏览器的机制,不是http自身机制 此外多个并发的TCP connection也非常消耗服务器资源

  • 支持分块传输编码(Chunked Transfer Encoding),允许服务器逐块发送响应数据。

  • 引入管道化(Pipelining),允许在发送第一个请求的响应之前发送后续请求

    • 注:虽然对于该方案,虽然http1.1支持,服务器支持,但是主流浏览器并不支持,chrome官方解释:https://www.chromium.org/developers/design-documents/network-stack/http-pipelining/ HTTP2 提供了新的编码方案,解决了这个问题

  • 增加了更多的缓存控制头部,如 Cache-Control,优化缓存机制。

  • 支持内容协商,允许服务器根据客户端的能力和偏好提供不同版本的资源

缺点

  • 仍然存在队头阻塞(Head-of-line Blocking)问题
  • 每个资源仍需单独的请求,导致大量小文件请求时效率低下

@队头阻塞(Head-of-Line Blocking)

  • 队头阻塞(Head-of-Line Blocking, HOL 阻塞)是指在一个数据包队列中,当前端的数据包被阻塞时,后续的数据包也无法被处理的现象。这种现象会导致延迟增加、带宽利用率降低和整体网络性能下降。HOL 阻塞可以发生在多种网络协议和传输层次上
1. TCP 层的队头阻塞
  • 在 TCP 连接中,数据包按顺序传输和接收。TCP 使用序列号来确保数据包按正确的顺序到达。如果某个数据包在传输中丢失,接收方必须等待重新传输该数据包后才能继续处理后续的数据包。这种等待会导致队头阻塞。

  • 示例:假设有一个包含数据包1、2、3的TCP连接。如果数据包2在传输过程中丢失,接收方必须等待重新传输数据包2,然后才能处理数据包3,即使数据包3已经到达。这会导致数据包3的处理被阻塞,直到数据包2被成功接收。

2. HTTP/1.1 的队头阻塞
  • 在 HTTP/1.1 中,引入了持久连接和管道化(Pipelining),允许在一个连接中发送多个请求。然而,由于串行处理方式,如果一个请求处理变慢或被阻塞,后续所有的请求都会受到影响。这也是对头阻塞的一种表现。

  • 示例:一个浏览器发送了多个HTTP请求(A、B、C)给服务器。如果请求A处理得很慢或被阻塞,浏览器必须等待请求A完成后才能处理请求B和请求C,尽管请求B和C可以并行处理。这会导致对头阻塞。

HTTP/2

发布时间:2015年

改进点

  • 二进制分帧层 (Binary framing layer)
  • 单一连接上的多路复用(Multiplexing over Single Connection)
  • 压缩(头部数据)Header Compress(HPACK)
  • 服务器推送(Server Push)
  • 默认安全(必须TLS加密)(Secure by default (must use TLS encryption))
  • TLS期间的协议协商(ALPN)(Protocol Negotiation during TLS (ALPN))

二进制分帧层和多路复用请看文章:http://t.csdnimg.cn/7hrH2
头部压缩请看文章:http://t.csdnimg.cn/rXuDw
应用层安全协商请看文章:http://t.csdnimg.cn/a3P6i

Multiplexing:多路复用

  • 一个TCP流里面有多个流多个帧,通过ID在组装。在HTTP/2中,通过二进制分帧层,HTTP消息被分解成独立的帧,这些帧可以交错发送并在接收端重新组装,从而实现了请求和响应的多路复用。这意味着在一个TCP连接上可以同时处理多个请求和响应,大大提高了并发性和效率。

服务推送案列

  1. 假设有一个网页index.html,它依赖两个资源:style.css和script.js。在传统的HTTP/1.1中,浏览器需要先请求index.html,然后解析HTML文件,发现需要加载style.css和script.js,再分别发送请求获取这两个资源。
    2.而在HTTP/2中,当服务器接收到浏览器对index.html的请求后 (服务器已经知道了Client需要访问index.html,所以肯定index.html上的资源一起展示),它可以主动将style.css和script.js与index.html一起推送给浏览器。这样,当浏览器解析HTML文件时,它发现需要的资源已经预先加载完成,可以立即渲染页面并执行JavaScript代码,从而提高了网页的加载速度和用户体验。
  • 需要注意的是,服务器推送并不是无条件地推送所有资源,而是根据一定的策略和算法来确定哪些资源应该被推送。这些策略和算法可以基于服务器的缓存情况、用户的历史访问记录、资源的优先级等因素来制定。同时,服务器推送也需要与浏览器的缓存策略相配合,以避免推送已经缓存过的资源造成浪费。

HTTP/2 的 ALPN(应用层协议协商)

  • 建立 TLS 连接的过程中协商使用的应用层协议,如 HTTP/1.1 或 HTTP/2。ALPN 通过在 TLS 握手过程中嵌入协议协商信息,使得客户端和服务器可以快速确定使用哪种协议进行通信,而无需额外的往返通信。

解决的问题

  • 通过二进制分帧多路复用提高了传输效率,解决了HTTP1.1的队头阻塞(http层的)问题
  • 通过头部压缩服务器推送减少了延迟和带宽消耗

缺点

  • TCP 层仍会发生队头阻塞
    在这里插入图片描述

  • 服务推送机制存在安全问题

HTTP/3

发布时间:2019年

改进点

  • 基于 QUIC 协议而非 TCP,使用 UDP 进行传输,解决 TCP 的队头阻塞问题。
  • 内置加密TLS1.3,简化了 HTTPS 的实现。
  • 改进连接建立速度,减少延迟。
  • 保留了 HTTP/2 的多路复用、头部压缩和服务器推送等特性。

解决的问题

  • 通过使用 QUIC 协议彻底解决了 TCP 层的队头阻塞问题。
  • 改善了连接建立速度,特别是在移动网络和高延迟环境下。

关于HTTP3及QUIC码字更新中,24小时内会发布…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1848904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言入门系列:可迁移的数据类型

文章目录 1,精确宽度类型(exact-width integer type)2,最小宽度类型(minimum width type)3,最快的最小宽度类型(fast minimum width type)4,可以保存指针的整数类型。5, …

云原生微服务开发日趋成熟:有效拥抱左移以改善交付

在软件工程和应用程序开发方面,云原生已经成为许多团队的常用术语。当人们调查云原生的世界时,他们经常会得出这样的观点:云原生的整个过程都是针对大型企业应用程序的。几年前,情况可能确实如此,但随着 Kubernetes 等…

Redis-使用 jedis 操作数据

文章目录 1、Jedis简介2、环境准备3、创建maven普通项目,导入如下依赖4、测试JAVA程序和Redis之间的通信 1、Jedis简介 "Jedis" 通常是作为 "Java Redis" 的缩写或简称来理解的。Java Embedded Data Structures Interface 表示 Java嵌入式数据结构接口 2、…

45、基于深度学习的螃蟹性别分类(matlab)

1、基于深度学习的螃蟹性别分类原理及流程 基于深度学习的螃蟹性别分类原理是利用深度学习模型对螃蟹的图像进行训练和识别,从而实现对螃蟹性别的自动分类。整个流程可以分为数据准备、模型构建、模型训练和性别分类四个步骤。 数据准备: 首先需要收集包…

C# 中的隐式和显式类型转换

当你需要转换值的类型时,可以使用类型转换。只有当你要转换的两种类型兼容时,才有可能。 当你收到错误“无法隐式将一种类型转换为另一种类型”时,说明你转换的两种类型不兼容。 int integer; // 声明一个名为 integer 的整型变量 integer …

【Gradio】如何设置 Gradio 数据框的样式

简介 数据可视化是数据分析和机器学习的关键方面。Gradio DataFrame 组件是一种流行的方式,在网络应用程序中显示表格数据(特别是以 pandas DataFrame 对象的形式)。 本文将探讨 Gradio 的最新增强功能,这些功能允许用户整合 pand…

解决vmware “处理器不支持 XSAVE。无法打开此虚拟机的电源。“

1,打开windows 10-11 的 虚拟机平台 选择 “开始”,输入“Windows 功能”,然后从结果列表中选择“打开或关闭 Windows 功能 ”。 在刚刚打开的 “Windows 功能”窗口中,找到“虚拟机平台 ”并将其选中。 选择“确定”。 可能需要重启电脑。…

节能减排如何替电子行业巨头降低成本

尖端科技与环境之间的矛盾,已经不再是科幻小说家笔下的虚构。 先进芯片制造从熔化硅开始,到使用大功率激光进行光刻,再到创造和维护真空状态,以及持续清洁工作,每一个环节都需要大量的电力支持。据统计,半…

在Windows上用MinGW编译OpenCV项目运行全流程

一、准备软件 OpenCV源码CMake工具MinGW工具链(需要选用 posix 线程版本:原因见此) 二、操作步骤 官网提供了VC16构建版本的二进制包,但是没有给出GCC编译的版本。所以如果使用MinGW进行构建,那就只能从源码开始构建…

聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言 dynamic 是一种有别于传统变量类型的动态类型声明,刚开始接触可能在理解上会有些困难,可以简单地把它理解为一个盲盒,你可以任意猜测盒子有什么东西,并认为这些东西真正存在而进行处理,等到真正打开时&#xff0…

【尚庭公寓SpringBoot + Vue 项目实战】预约看房与租约管理(完结)

【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理(完结) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理(完结)1、业务说明2、接口开发2.1、预约看房管理2.1.1.保存或更新看房预约2.1.2. 查询个人预约…

mysql的安装以及分享navicat for MySQL

前言 根据网上分享的安装方法以及自己遇到的问题解决方法 一、mysql是什么? mysql 是一个开放源码的小型关联式数据库管理系统 二、安装过程 1.下载安装包 下载地址:MySQL :: Download MySQL Community Server 跳过直接下载,解压即可 …

10.华为路由器使用ospf动态路由连通两个部门网络

目的:实验ospf动态路由协议连通A与B部门 AR1配置 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei]vlan batch 10 [Huawei]int Vlanif 10 [Huawei]int e0/0/0 [Huawei-Ethernet0/0/0]port link-type access [Huawei-Ethernet0/0/0]por…

Spring Bean 生命周期详解

Spring Bean 生命周期详解 在 Spring 框架中,Bean 的生命周期由 Spring 容器全权管理。了解和掌握 Bean 的生命周期对于使用 Spring 开发稳定且高效的应用程序至关重要。本文将详细介绍 Spring Bean 生命周期的五个主要阶段:实例化、属性注入、初始化、…

Avue-data数据大屏显示饼图(附Demo)

目录 前言1. Sql查询2. 颜色细节 前言 对于这部分知识,原先有过柱状图实战:Avue-data数据大屏显示柱状图(附Demo讲解) 以下直奔主题,以Sql数据库数据为主 1. Sql查询 以饼图为例,需要返回的形式如下&am…

在敏捷项目管理中实施 Scrum 方法

在本文中,我将阐明敏捷项目管理中的 Scrum 流程。我将深入探讨 Scrum 方法论中不可或缺的角色。本文将全面概述敏捷开发中的 Scrum 流程。我将解释 Scrum 的核心组件,详细探索端到端 Scrum 流程。在本文结束时,您将清楚地了解 Scrum 的工作原…

Ant Design Vue Cascader 级联选择 错位问题

当Cascader 多个的时候 对应的下列会错位 如果滚动 他不会跟着元素 而是会跟着屏幕滚动&#xff0c;如下效果 解决方法 在Cascader 标题添加 getPopupContainer 属性监听对应的位置&#xff0c;返回对应的元素 <a-cascader class"smart-width-100 " v-model:…

QThread 与QObject::moveToThread在UI中的应用

1. QThread的两种用法 第一种用法就是继承QThread&#xff0c;然后覆写 virtual void run()&#xff0c; 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程&#xff0c;创建一个对象&#xff0c;再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

Android-Android Studio-FAQ

1 需求 2 接口 3 Android Studio xml布局代码补全功能失效问题 最终解决方案就是尝试修改compileSdk 为不同SDK版本来解决问题&#xff0c;将原本34修改为32测试会发现xml代码补全功能有效了&#xff01; 参考资料 Android Studio xml布局代码补全功能失效问题_android studi…

华为DCN技术:M-LAG

M-LAG&#xff08;Multichassis Link Aggregation Group&#xff09;即跨设备链路聚合组&#xff0c;是一种实现跨设备链路聚合的机制。M-LAG主要应用于普通以太网络、VXLAN和IP网络的双归接入&#xff0c;可以起到负载分担或备份保护的作用。相较于另一种常见的可靠性接入技术…