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

2024-06-22 09:28

本文主要是介绍http发展史(http0.9、http1.0、http1.1、http/2、http/3)详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 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发展史(http0.9、http1.0、http1.1、http/2、http/3)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083898

相关文章

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述   在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特点和优势,适用于不同的应用场景和需求。   Kafka 是一个高性能、可扩展的分布式消息队列系统,被设计用于处理大规模的数据流和实时数据传输。它

Linux中拷贝 cp命令中拷贝所有的写法详解

This text from: http://www.jb51.net/article/101641.htm 一、预备  cp就是拷贝,最简单的使用方式就是: cp oldfile newfile 但这样只能拷贝文件,不能拷贝目录,所以通常用: cp -r old/ new/ 那就会把old目录整个拷贝到new目录下。注意,不是把old目录里面的文件拷贝到new目录,

笔记-python之celery使用详解

Celery是一个用于处理异步任务的Python库,它允许你将任务分发到多个worker进行处理。以下是Celery的使用详解: 安装Celery 使用pip安装Celery: pip install celery 创建Celery实例 首先,需要创建一个Celery实例,指定broker(消息中间件)和backend(结果存储)。 from celery import Celeryap

微服务中RPC的强类型检查与HTTP的弱类型对比

在微服务架构中,服务间的通信是一个至关重要的环节。其中,远程过程调用(RPC)和HTTP是两种最常见的通信方式。虽然它们都能实现服务间的数据交换,但在类型检查方面,RPC的强类型检查和HTTP的弱类型之间有着显著的差异。本文将深入探讨这两种通信方式在类型检查方面的优缺点,以及它们对微服务架构的影响。 一、RPC的强类型检查 RPC的强类型检查是其核心优势之一。在RPC通信中,客户端和服务端都使