当前位置: 首页 > news >正文

HTTP/2:让网络飞起来

文章目录

    • 一、HTTP/2 的基本概念和背景
    • 二、HTTP/2 的主要特性和优势
      • 2.1 二进制帧
      • 2.2 多路复用
      • 2.3 头部压缩
      • 2.4 服务器推送
    • 三、HTTP/2 的实现和部署
    • 四、HTTP/2 与现有技术的比较
    • 五、HTTP/2 与 Web 性能优化
    • 六、结束语:让 HTTP/2 助力你的 Web 开发

今天我们来聊聊一个让网络飞起来的技术——HTTP/2。你可能已经听说过 HTTP/2,但是你知道它是什么吗?为什么我们需要它?它和我们正在使用的 HTTP/1.1 有什么区别?别急,接下来我们将一一揭晓。

一、HTTP/2 的基本概念和背景

HTTP/2,全名是 Hypertext Transfer Protocol Version 2,是 HTTP 协议的最新版本。它的起源可以追溯到 Google 的 SPDY 项目,该项目的目的是解决 HTTP/1.1 的一些性能问题。HTTP/2 继承了 SPDY 的许多优点,并在此基础上进行了进一步的改进。

那么,为什么我们需要 HTTP/2 呢?这是因为 HTTP/1.1 虽然经过了多年的使用和改进,但仍然存在一些问题,如头部冗余、无法并行处理请求等。HTTP/2 正是为了解决这些问题,提高网络性能而诞生的。

二、HTTP/2 的主要特性和优势

HTTP/2 引入了许多新的特性,如二进制帧、多路复用、头部压缩、服务器推送等,这些都让 HTTP/2 比 HTTP/1.1 更强大。

2.1 二进制帧

在 HTTP/2 中,所有的通信都是通过二进制帧进行的。每个帧都由一个小的固定大小的头部和一个可选的负载组成。头部包括帧的长度、类型、标志以及帧关联的流的标识符。每个帧的结构如下:

+-----------------+-----------------+-----------------+
| Frame Length    | Frame Type      | Flags           |
+-----------------+-----------------+-----------------+
| Stream Identifier (Associated Stream)              |
+-----------------+-----------------+-----------------+
| Optional Payload                                  
+---------------------------------------------------+
  • Frame Length:帧的长度。
  • Frame Type:帧的类型。
  • Flags:帧的标志。
  • Stream Identifier:帧关联的流的标识符。
  • Optional Payload:可选的负载。

这种二进制帧的结构使得协议的解析、实现和解耦变得更加容易。而且,由于帧的头部固定,可以减少不必要的网络开销。

2.2 多路复用

多路复用是 HTTP/2 中的一种关键特性。在 HTTP/1.1 中,如果要并行发送多个请求,需要创建多个 TCP 连接,这会消耗大量的资源。而在 HTTP/2 中,多个请求和响应可以在同一个连接上并行传输。这是通过将每个请求或响应分割成多个帧,然后在同一个连接上交错发送这些帧来实现的。每个帧都关联一个流,流的标识符用于区分不同的请求或响应。这种机制大大提高了网络的利用率。

以下是一个简单的示意图,描述了HTTP/2 中帧、流、流的标识符、请求或响应的关系:

+-------------------------------------------------+
| TCP Connection                                  |
|                                                 |
| +------------------+ +------------------+       |
| | Stream 1        | | Stream 2        |  ...  |
| | (Request/Response A) | (Request/Response B) |       |
| | +------+ +------+ | +------+ +------+ |       |
| | |Frame1| |Frame2| | |Frame1| |Frame2| |       |
| | +------+ +------+ | +------+ +------+ |       |
| +------------------+ +------------------+       |
+-------------------------------------------------+

在这个图中,每个 TCP 连接上可以有多个流(Stream 1,Stream 2,…),每个流对应一个请求或响应(Request/Response A,Request/Response B)。每个请求或响应又被分割成多个帧(Frame 1,Frame 2),这些帧交错在同一个连接上发送。

2.3 头部压缩

在 HTTP/1.1 中,每个请求和响应都会发送大量的头部信息,这会占用大量的带宽。HTTP/2 通过引入 HPACK 压缩格式,有效地解决了这个问题。HPACK 使用两个主要的技术来压缩头部:一是静态哈夫曼编码,用于压缩单个头部字段;二是动态表,用于在整个连接过程中缓存和复用之前发送的头部字段。这种机制大大减少了头部的大小,从而节省了带宽。

2.4 服务器推送

服务器推送允许服务器未经客户端请求就发送资源。这是通过服务器发送一个 PUSH_PROMISE 帧来实现的,该帧包含了服务器将要发送的资源的头部字段。然后,服务器可以开始发送这个资源的数据帧,就好像这个资源是由客户端请求的一样。这种机制可以使得客户端更早地获取到资源,从而提高页面的加载速度。

三、HTTP/2 的实现和部署

那么,如何在服务器和客户端实现 HTTP/2 呢?其实大多数现代的 web 服务器和浏览器都已经支持 HTTP/2。你只需要更新你的 web 服务器和浏览器到最新版本,就可以使用 HTTP/2 了。

部署 HTTP/2 也很简单。由于 HTTP/2 完全兼容 HTTP/1.1,你不需要修改任何应用代码,只需要在你的 web 服务器上启用 HTTP/2 即可。

四、HTTP/2 与现有技术的比较

当我们谈论 HTTP/2 时,我们经常会把它和 HTTP/1.1、SPDY、QUIC 等其他网络传输协议进行比较。

相比 HTTP/1.1,HTTP/2 的性能有了显著的提升,如我们前面所说的二进制帧、多路复用、头部压缩、服务器推送等。

相比 SPDY,HTTP/2 在其基础上进行了进一步的改进,如引入了二进制帧,改进了头部压缩算法等。

相比 QUIC,HTTP/2 更加稳定和成熟,而 QUIC 还在实验阶段,但 QUIC 有一些更先进的特性,如基于 UDP 的传输,我们可以期待其未来的发展。

五、HTTP/2 与 Web 性能优化

最后,我们来谈谈 HTTP/2 如何影响现有的 Web 性能优化策略。

在 HTTP/1.1 的时代,我们有很多优化策略,如文件合并、图片雪碧图、域名分片等,这些都是为了解决 HTTP/1.1 的限制。但在 HTTP/2 中,这些优化策略可能就不再需要了,甚至可能会适得其反。

  • 文件合并:在 HTTP/2 中,由于支持多路复用,我们不再需要将多个文件合并为一个文件,以减少请求次数。反而,保持文件的独立,可以让浏览器更好地进行缓存和并行处理。

  • 图片雪碧图:在 HTTP/2 中,由于支持多路复用,我们不再需要将多个图片合并为一个雪碧图,以减少请求次数。反而,保持图片的独立,可以让浏览器更好地进行缓存和并行处理。

  • 域名分片:在 HTTP/2 中,由于支持多路复用,我们不再需要将资源分散到多个域名,以增加并行连接数。反而,使用一个域名,可以让浏览器更好地进行连接复用。

因此,我们在 HTTP/2 下,需要重新思考我们的 Web 性能优化策略,以充分利用 HTTP/2 的特性。

六、结束语:让 HTTP/2 助力你的 Web 开发

好了,通过上面的介绍,相信你对 HTTP/2 有了更深的理解。HTTP/2 是一个强大的网络传输协议,它为我们的 Web 开发带来了许多优势。希望你能在你的项目中尝试使用 HTTP/2,让你的网站飞起来!

相关文章:

HTTP/2:让网络飞起来

文章目录 一、HTTP/2 的基本概念和背景二、HTTP/2 的主要特性和优势2.1 二进制帧2.2 多路复用2.3 头部压缩2.4 服务器推送 三、HTTP/2 的实现和部署四、HTTP/2 与现有技术的比较五、HTTP/2 与 Web 性能优化六、结束语:让 HTTP/2 助力你的 Web 开发 今天我们来聊聊一…...

C++ primer plus 第17 章 输入、输出和文件:刷新输出缓冲区

C primer plus 第17 章 输入、输出和文件:刷新输出缓冲区 C primer plus 第17 章 输入、输出和文件:刷新输出缓冲区 文章目录 C primer plus 第17 章 输入、输出和文件:刷新输出缓冲区17.2.3刷新输出缓冲区 17.2.3刷新输出缓冲区 如果程序使…...

项目总结2

文件的分片上传 格外功能是:秒传,断点续传。 今天最惨,上午找bug,下午一直在修改,晚上脑子what了,混乱的很,数据表之间的逻辑不清晰,导致我传值,还有操作数据库一直有问…...

PXE实现自动批量安装部署操作系统

PXE简介 PXE(Preboot eXecution Environment)是一种在计算机启动时使用网络接口从远程服务器获取操作系统安装和启动信息的技术。通过PXE,计算机可以从局域网中的PXE服务器上下载操作系统安装文件,并进行自动化的操作系统部署或故…...

Cyber Weekly #18

赛博新闻 1、Google 狂卷小模型,2B 参数 Gemma 2 赶超 GPT-3.5 Google本周发布了开源的轻量级、高性能模型 Gemma 2 2B。它拥有 20 亿参数,是从更大规模的模型中提炼而来的,在 LMSYS 大模型竞技场的得分超越了 GPT-3.5 和 Mixtral 8x7B。该…...

Open Interpreter - 开放解释器

文章目录 一、关于演示它是如何工作的?与 ChatGPT 的代码解释器比较 二、快速开始三、更多操作1、互动聊天2、程序化聊天3、开始新的聊天4、保存和恢复聊天5、自定义系统消息6、更改模型7、在本地运行 Open Interpreter终端Python上下文窗口,最大令牌 8、…...

“八股文”:程序员的福音还是梦魇?

——一场关于面试题的“代码战争” 在程序员的世界里,“八股文”这个词儿可谓是“如雷贯耳”。不,咱们可不是说古代科举考试中的那种八股文,而是指程序员面试中的那些固定套路的题目。如今,各大中小企业在招聘程序员时&#xff0…...

数据结构第2天作业 8月3日

单向链表 typedef int datatype; //由于有效数据不一定是正数,所以将数据重命名。typedef struct lklst{ //不能是无名结构体了,因为定义指针域的时候需要使用union{int len; //头结点时候使用;datatype data; …...

设计界的新宠:5款热门UI在线设计软件评测

随着用户界面设计行业的蓬勃发展,越来越多的设计师进入用户界面设计。选择一个方便的用户界面设计工具尤为重要!除了传统的用户界面设计工具,在线用户界面设计工具也受到越来越多设计师的青睐。这种不受时间、地点、计算机配置限制的工作方法…...

github添加ssh密钥,通过ssh方式推送代码

左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。 公众号:一点sir,关注领取python编程资料 很多人在使用github的时候,如果还是使用https的方式推送代码的话,可能会…...

Python设计模式 - 抽象工厂模式

定义 抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 产品等级结构与产品族 为了更好地理解抽象工厂模式,先引入两个概念: 产品等级结构:就是产品的…...

【JavaEE初阶】懒汉模式与饿汉模式及指令重排序问题

目录 📕 单例模式 🌳 饿汉模式 🚩 线程安全 🎍 懒汉模式 🚩 懒汉模式-单线程版 🚩 懒汉模式-多线程版 🎄 指令重排序 📕 单例模式 单例模式是一种经典的设计模式,…...

Vue3使用Cascader 级联选择器如何获取值并提交信息

我写了一个用户对象&#xff0c;有address地址字段&#xff0c;我怎么将用户选择的级联数据selectedValue值传给address&#xff0c;并将对象返回给后端&#xff0c;核心代码实现了该问题。 <script> 核心代码&#xff1a; //获取住址并更新给addresslet selectedValue…...

Python面试整理-第三方库

Python社区提供了大量的第三方库,这些库扩展了Python的功能,覆盖了从数据科学到网络应用开发等多个领域。以下是一些非常流行和广泛使用的第三方库: 1. NumPy ● 用途:数值计算。 ● 特点:提供了一个强大的N维数组对象和大量用于数学运算的函数。 ● 应用场景:科学计算、…...

电脑添加虚拟网卡与ensp互联,互访

一、按照过程 1、打开设备管理器 2、点击网络适配器&#xff0c;点击左上角操作&#xff0c;点击“添加过时硬件” 3、下一页 4、选择“安装我手动从列表选择的硬件”&#xff0c;下一页 5、下拉&#xff0c;选择“网络适配器”&#xff0c;下一页 6、厂商选择“Microsoft”&…...

悬而未决:奇怪的不允许跨域CORS policy的问题

我在本地HBuilderX中进行预览写好的前端网页&#xff0c;它里面用了ajax访问了远程服务器的后端API网址&#xff0c;不出意外地报不允许跨域访问的错了&#xff1a;Access to XMLHttpRequest at ‘http://xxx.com/MemberUser/login’ from origin ‘http://mh.com’ has been b…...

索引优化秘籍:SQL Server数据库填充因子的调优艺术

索引优化秘籍&#xff1a;SQL Server数据库填充因子的调优艺术 在SQL Server的性能优化中&#xff0c;索引起着至关重要的作用。而索引填充因子&#xff08;Fill Factor&#xff09;则是控制索引页填充程度的重要参数&#xff0c;它直接影响索引的存储效率和查询性能。本文将深…...

ffmpeg 的内存分配架构

------------------------------------------------------------ author: hjjdebug date: 2024年 08月 01日 星期四 18:00:47 CST descripton: ffmpeg 的内存分配架构1 ------------------------------------------------------------ ffmpeg 的内配分配搞的人晕菜&#…...

Vue+live2d实现虚拟人物互动(一次体验叙述)

目录 故事的开头&#xff1a; 最终的实现效果&#xff1a; 实现步骤&#xff1a; 第一步&#xff1a;下载重要文件 第二步&#xff1a;创建vue项目文件&#xff0c;将刚下载文件拷贝到public目录下 第三步&#xff1a;在index.html文件中引入js 第四步&#xff1a;使用&…...

内联函数的概念和用途以及区别

内联函数&#xff08;Inline Function&#xff09;是C&#xff08;以及C99之后的C语言&#xff09;中的一个特性&#xff0c;旨在通过减少函数调用的开销来提高程序的执行效率。在正常情况下&#xff0c;当程序调用一个函数时&#xff0c;会发生一系列的操作&#xff0c;包括保…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...