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

HTTP/2概览及内核解析

目录

1. HTTP/2特性概览

1.1. 兼容 HTTP/1

1.2. “语法”层面的改造

1.3. 协议栈

1.4. HTTP/2实验环境

1.5. Question:

2. HTTP/2内核剖析

2.1. 连接前言

2.2. 头部压缩

2.3. 二进制帧

2.4. 流与多路复用

2.5. 流状态转换


1. HTTP/2特性概览

  1. HTTP 协议取消了小版本号,所以 HTTP/2 的正式名字不是 2.0;
  2. HTTP/2 在“语义”上兼容 HTTP/1,保留了请求方法、URI 等传统概念;
  3. HTTP/2 使用“HPACK”算法压缩头部信息,消除冗余数据节约带宽;
  4. HTTP/2 的消息不再是“Header+Body”的形式,而是分散为多个二进制“(Frame)”;
  5. HTTP/2 使用虚拟的“(Stream)”传输消息,解决了困扰多年的“队头阻塞”问题,同时实现了“多路复用”,提高连接的利用率;
  6. HTTP/2 也增强了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密码套件。

1.1. 兼容 HTTP/1

HTTP/2 把 HTTP 分解成了“语义”和“语法”两个部分,“语义”层不做改动,与 HTTP/1 完全一致(即 RFC7231)。

比如请求方法、URI、状态码、头字段等概念都保留不变,这样就消除了再学习的成本,基于 HTTP 的上层应用也不需要做任何修改,可以无缝转换到 HTTP/2。

与 HTTPS 不同,HTTP/2 没有在 URI 里引入新的协议名,仍然用“http”表示明文协议,用“https”表示加密协议。

1.2. “语法”层面的改造

1. 头部压缩

HTTP/2 把“头部压缩”作为性能改进的一个重点, HTTP/2 没有使用传统的压缩算法,而是开发了专门的“HPACK”算法,在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,还釆用哈夫曼编码来压缩整数和字符串,可以达到 50%~90% 的高压缩率。

2. 二进制格式

HTTP/2 的报文不再使用肉眼可见的 ASCII 码,而是向下层的 TCP/IP 协议“靠拢”,全面采用二进制格式。

HTTP/2把 TCP 协议的部分特性挪到了应用层,把原来的“Header+Body”的消息“打散”为数个小片的二进制“帧”(Frame),用“HEADERS”帧存放头数据、“DATA”帧存放实体数据。

3. 虚拟的“流”

HTTP/2 定义了一个“流”(Stream)的概念,它是二进制帧的双向传输序列,同一个消息往返的帧会分配一个唯一的流 ID。你可以想象把它成是一个虚拟的“数据流”,在里面流动的是一串有先后顺序的数据帧,这些数据帧按照次序组装起来就是 HTTP/1 里的请求报文和响应报文。

因为“流”是虚拟的,实际上并不存在,所以 HTTP/2 就可以在一个 TCP 连接上用“流”同时发送多个“碎片化”的消息,这就是常说的“多路复用”( Multiplexing)——多个往返通信都复用一个连接来处理。

在“流”的层面上看,消息是一些有序的“帧”序列,而在“连接”的层面上看,消息却是乱序收发的“帧”。多个请求 / 响应之间没有了顺序关系,不需要排队等待,也就不会再出现“队头阻塞”问题,降低了延迟,大幅度提高了连接的利用率。

为了更好地利用连接,加大吞吐量,HTTP/2 还添加了一些控制帧来管理虚拟的“流”,实现了优先级和流量控制,这些特性也和 TCP 协议非常相似。

HTTP/2 还在一定程度上改变了传统的“请求 - 应答”工作模式,服务器不再是完全被动地响应请求,也可以新建“流”主动向客户端发送消息。比如,在浏览器刚请求 HTML 的时候就提前把可能会用到的 JS、CSS 文件发给客户端,减少等待的延迟,这被称为“服务器推送”(Server Push,也叫 Cache Push)。

4. 强化安全

出于兼容的考虑,HTTP/2 延续了 HTTP/1 的“明文”特点,可以像以前一样使用明文传输数据,不强制使用加密通信,不过格式还是二进制,只是不需要解密。

但由于 HTTPS 已经是大势所趋,而且主流的浏览器 Chrome、Firefox 等都公开宣布只支持加密的 HTTP/2,所以“事实上”的 HTTP/2 是加密的。也就是说,互联网上通常所能见到的 HTTP/2 都是使用“https”协议名,跑在 TLS 上面。

为了区分“加密”和“明文”这两个不同的版本,HTTP/2 协议定义了两个字符串标识符:“h2”表示加密的 HTTP/2,“h2c”表示明文的 HTTP/2,多出的那个字母“c”的意思是“clear text”。

在 HTTP/2 标准制定的时候(2015 年)已经发现了很多 SSL/TLS 的弱点,而新的 TLS1.3 还未发布,所以加密版本的 HTTP/2 在安全方面做了强化,要求下层的通信协议必须是 TLS1.2 以上,还要支持前向安全和 SNI,并且把几百个弱密码套件列入了“黑名单”,比如 DES、RC4、CBC、SHA-1 都不能在 HTTP/2 里使用,相当于底层用的是“TLS1.25”。

1.3. 协议栈

HTTP/2 是建立在“HPack”“Stream”“TLS1.2”基础之上。

1.4. HTTP/2实验环境

实验环境在新的域名“www.metroid.net”上启用了 HTTP/2 协议。

可以用开发者工具或抓包去实验之前的测试用例。

本节使用http://www.metroid.net/30-1,可以看到服务器输出了 HTTP 的版本号“2”和标识符“h2”,表示这是加密的 HTTP/2,如果改用“https://www.chrono.com/30-1”访问就会是“1.1”和空。

注意到 URI 里的一个小变化,端口使用的是“8443”而不是“443”。这是因为 443 端口已经被“www.chrono.com”的 HTTPS 协议占用,Nginx 不允许在同一个端口上根据域名选择性开启 HTTP/2,所以就不得不改用了“8443”。

1.5. Question:

对比一下 HTTP/2 与 HTTP/1、HTTPS 的相同点和不同点:

相同点:

特性

HTTP/1.1

HTTP/2

HTTPS

基础协议

基于 TCP 传输

基于 TCP 传输

在 HTTP 基础上增加 SSL/TLS 加密层

核心功能

客户端-服务器请求/响应模型

客户端-服务器请求/响应模型

客户端-服务器安全通信

请求方法

GET、POST 等标准方法

支持相同的方法

支持相同的方法

状态码

200、404、500 等状态码

相同的状态码

相同的状态码

URL 格式

使用 http://

https://

通常通过 https://

使用

强制使用 https://

不同点:

  1. 协议设计目标

特性

HTTP/1.1

HTTP/2

HTTPS

核心目标

文本传输,兼容早期 Web 需求

高性能传输(多路复用、头部压缩等)

安全传输(加密、身份验证、数据完整性)

性能优化

多路复用、二进制分帧、头部压缩、服务器推送

无(但加密可能影响性能)

  1. 传输特性

特性

HTTP/1.1

HTTP/2

HTTPS

连接复用

需要多个 TCP 连接(默认 6-8 个)

单 TCP 连接支持多路复用(虚拟流)

复用底层 TCP 连接(与 HTTP 版本无关)

数据格式

明文文本传输

二进制分帧传输

加密传输(HTTP 协议内容被加密)

队头阻塞

存在(一个请求阻塞后续请求)

通过多路复用解决

与 HTTP 版本相关(若使用 HTTP/1.1 仍存在)

  1. 安全性

特性

HTTP/1.1

HTTP/2

HTTPS

加密

无(明文传输)

通常与 HTTPS 结合使用(非强制)

强制加密(SSL/TLS)

身份验证

依赖 HTTPS 的证书机制

通过数字证书验证服务器身份

数据完整性

依赖 HTTPS 的 MAC 机制

防止数据篡改(哈希校验)

  1. 性能与兼容性

特性

HTTP/1.1

HTTP/2

HTTPS

握手开销

TCP 三次握手

同 HTTP/1.1

额外 SSL/TLS 握手(增加 1-2 往返延时(RTT))

兼容性

广泛支持

需服务器和客户端支持 HTTP/2

需服务器配置证书,客户端支持 SSL/TLS

实际应用

仍广泛使用

现代网站主流(需 HTTPS)

所有现代网站的强制安全标

2. HTTP/2内核剖析

  1. HTTP/2 必须先发送一个“连接前言”字符串,然后才能建立正式连接;
  2. HTTP/2 废除了起始行,统一使用头字段,在两端维护字段“Key-Value”的索引表,使用“HPACK”算法压缩头部;
  3. HTTP/2 把报文切分为多种类型的二进制帧,报头里最重要的字段是流标识符,标记帧属于哪个流;
  4. 流是 HTTP/2 虚拟的概念,是帧的双向传输序列,相当于 HTTP/1 里的一次“请求 - 应答”;
  5. 在一个 HTTP/2 连接上可以并发多个流,也就是多个“请求 - 响应”报文,这就是“多路复用”。
  6. 课下作业

实验环境的 URI 是“/31-1”,使用wireshark抓包:

2.1. 连接前言

HTTP/2“事实上”是基于 TLS,所以在正式收发数据之前,会有 TCP 握手和 TLS 握手。

TLS 握手成功之后,客户端必须要发送一个“连接前言”(connection preface),用来确认建立 HTTP/2 连接。

这个“连接前言”是标准的 HTTP/1 请求报文,使用纯文本的 ASCII 码格式,请求方法是特别注册的一个关键字“PRI”,全文只有 24 个字节:

PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n

在 Wireshark 里,HTTP/2 的“连接前言”被称为“Magic”,意思就是“不可知的魔法”。

只要服务器收到这个“有魔力的字符串”,就知道客户端在 TLS 上想要的是 HTTP/2 协议,而不是其他别的协议,后面就会都使用 HTTP/2 的数据格式。

2.2. 头部压缩

确立了连接之后,HTTP/2 就开始准备请求报文。

“HPACK”算法来压缩头部数据。

“HPACK”算法是专门为压缩 HTTP 头部定制的算法,与 gzip、zlib 等压缩算法不同,它是一个“有状态”的算法,需要客户端和服务器各自维护一份“索引表”,也可以说是“字典”(这有点类似 brotli),压缩和解压缩就是查表和更新表的操作。

为了方便管理和压缩,HTTP/2 废除了原有的起始行概念,把起始行里面的请求方法、URI、状态码等统一转换成了头字段的形式,并且给这些“不是头字段的头字段”起了个特别的名字 —“伪头字段”(pseudo-header fields)。而起始行里的版本号和错误原因短语也废除了。

为了与“真头字段”区分开来,这些“伪头字段”会在名字前加一个“:”

HTTP 报文头就变成了“Key-Value”形式的字段,于是 HTTP/2 就为一些最常用的头字段定义了一个只读的“静态表”(Static Table)。

动态表”(Dynamic Table),它添加在静态表后面,结构相同,但会在编码解码的时候随时更新。

比如说,第一次发送请求时的“user-agent”字段长是一百多个字节,用哈夫曼压缩编码发送之后,客户端和服务器都更新自己的动态表,添加一个新的索引号“65”。那么下一次发送的时候就不用再重复发那么多字节了,只要用一个字节发送编号就好。

随着在 HTTP/2 连接上发送的报文越来越多,两边的“字典”也会越来越丰富,最终每次的头部字段都会变成一两个字节的代码,原来上千字节的头用几十个字节就可以表示了,压缩效果比 gzip 要好得多。

2.3. 二进制帧

头部数据压缩之后,HTTP/2 就要把报文拆成二进制的帧准备发送。

帧结构:

1. 帧开头是 3 个字节的长度;

默认上限是 2^14,最大是 2^24,也就是说 HTTP/2 的帧通常不超过 16K,最大是 16M。

2. 第4个字节是帧类型,大致可以分成数据帧和控制帧两类;

HEADERS 帧和 DATA 帧属于数据帧,存放的是 HTTP 报文,而 SETTINGS、PING、PRIORITY 等则是用来管理流的控制帧。

HTTP/2 总共定义了 10 种类型的帧,但一个字节可以表示最多 256 种,所以也允许在标准之外定义其他类型实现功能扩展。

3. 第 5 个字节是非常重要的帧标志信息,可以保存 8 个标志位,携带简单的控制信息;

常用的标志位有END_HEADERS表示头数据结束,相当于 HTTP/1 里头后的空行(“\r\n”),END_STREAM表示单方向数据发送结束(即 EOS,End of Stream),相当于 HTTP/1 里 Chunked 分块结束标志(“0\r\n\r\n”)。

4. 报文头里最后 4 个字节是流标识符,也就是帧所属的“流”,接收方使用它就可以从乱序的帧里识别出具有相同流 ID 的帧序列,按顺序组装起来就实现了虚拟的“流”。

流标识符虽然有 4 个字节,但最高位被保留不用,所以只有 31 位可以使用,也就是说,流标识符的上限是 2^31,大约是 21 亿。

Wireshark抓包实例:

注意:1字节=8位,这里的1个字节为2位16进制数

在这个帧里,开头的三个字节是“00010a”,表示数据长度是 266 字节。

帧类型是 1,表示 HEADERS 帧,负载(payload)里面存放的是被 HPACK 算法压缩的头部信息。

标志位是 0x25,转换成二进制有 3 个位被置 1。PRIORITY 表示设置了流的优先级,END_HEADERS 表示这一个帧就是完整的头数据,END_STREAM 表示单方向数据发送结束,后续再不会有数据帧(即请求报文完毕,不会再有 DATA 帧 /Body 数据)。

最后 4 个字节的流标识符是整数 1,表示这是客户端发起的第一个流,后面的响应数据帧也会是这个 ID,也就是说在 stream[1] 里完成这个请求响应。

2.4. 流与多路复用

流与多路复用是 HTTP/2 最核心的部分。

流是二进制帧的双向传输序列。

在 HTTP/2 连接上,虽然帧是乱序收发的,但只要它们都拥有相同的流 ID,就都属于一个流,而且在这个流里帧不是无序的,而是有着严格的先后顺序。

比如在这次的 Wireshark 抓包里,就有“0、1、3”一共三个流,实际上就是分配了三个流 ID 号,把这些帧按编号分组,再排一下队,就成了流。

在概念上,一个 HTTP/2 的流就等同于一个 HTTP/1 里的“请求 - 应答”。在 HTTP/1 里一个“请求 - 响应”报文来回是一次 HTTP 通信,在 HTTP/2 里一个流也承载了相同的功能。

HTTP/2 的流的特点:

  1. 流是可并发的,一个 HTTP/2 连接上可以同时发出多个流传输数据,也就是并发多请求,实现“多路复用”;
  2. 客户端和服务器都可以创建流,双方互不干扰;
  3. 流是双向的,一个流里面客户端和服务器都可以发送或接收数据帧,也就是一个“请求 - 应答”来回;
  4. 流之间没有固定关系,彼此独立,但流内部的帧是有严格顺序的;
  5. 流可以设置优先级,让服务器优先处理,比如先传 HTML/CSS,后传图片,优化用户体验;
  6. 流 ID 不能重用,只能顺序递增,客户端发起的 ID 是奇数,服务器端发起的 ID 是偶数;
  7. 在流上发送“RST_STREAM”帧可以随时终止流,取消接收或发送;
  8. 第 0 号流比较特殊,不能关闭,也不能发送数据帧,只能发送控制帧,用于流量控制。

深层知识点:

HTTP/2 在一个连接上使用多个流收发数据,那么它本身默认就会是长连接,所以永远不需要“Connection”头字段(keepalive 或 close)。

因为客户端和服务器两端都可以创建流,而流 ID 有奇数偶数和上限的区分,所以大多数的流 ID 都会是奇数,而且客户端在一个连接里最多只能发出 2^30,也就是 10 亿个请求。

流ID 用完了可以再发一个控制帧“GOAWAY”,真正关闭 TCP 连接。

2.5. 流状态转换

HTTP/2 借鉴了 TCP,根据帧的标志位实现流状态转换。当然,这些状态也是虚拟的,只是为了辅助理解。

流的状态转换过程:

1. 最开始的时候流都是“空闲”(idle)状态,也就是“不存在”,可以理解成是待分配的“号段资源”。

2. 当客户端发送 HEADERS 帧后,有了流 ID,流就进入了“打开”状态,两端都可以收发数据,然后客户端发送一个带“END_STREAM”标志位的帧,流就进入了“半关闭”状态。

这个“半关闭”状态很重要,意味着客户端的请求数据已经发送完了,需要接受响应数据,而服务器端也知道请求数据接收完毕,之后就要内部处理,再发送响应数据。

3. 响应数据发完了之后,也要带上“END_STREAM”标志位,表示数据发送完毕,这样流两端就都进入了“关闭”状态,流就结束了。

刚才也说过,流 ID 不能重用,所以流的生命周期就是 HTTP/1 里的一次完整的“请求 - 应答”,流关闭就是一次通信结束。

4. 下一次再发请求就要开一个新流(而不是新连接),流 ID 不断增加,直到到达上限,发送“GOAWAY”帧开一个新的 TCP 连接,流 ID 就又可以重头计数。

Question: HTTP/2 是如何基本解决“队头阻塞”问题的?

HTTP/2 通过引入多路复用(Multiplexing) 和 流优先级(Stream Prioritization) 机制,显著缓解了 HTTP/1.x 中的“队头阻塞”(Head-of-Line Blocking, HoL)问题。

HTTP/1里的请求都是排队处理的,所以有队头阻塞。HTTP/2的请求是乱序的,彼此不依赖,所以没有队头阻塞。

相关文章:

HTTP/2概览及内核解析

目录 1. HTTP/2特性概览 1.1. 兼容 HTTP/1 1.2. “语法”层面的改造 1.3. 协议栈 1.4. HTTP/2实验环境 1.5. Question: 2. HTTP/2内核剖析 2.1. 连接前言 2.2. 头部压缩 2.3. 二进制帧 2.4. 流与多路复用 2.5. 流状态转换 1. HTTP/2特性概览 HTTP 协议…...

AI生成视频推荐

以下是一些好用的 AI 生成视频工具: 国内工具 可灵 :支持文本生成视频、图片生成视频,适用于广告、电影剪辑和短视频制作,能在 30 秒内生成 6 秒的高清视频(1440p),目前处于免费测试阶段。 即…...

每日一题洛谷T534125 合数c++

字符串输入,看所有位数加起来的数是不是3的倍数 是,直接输出,不是,删除1或2 特判全是1和全是2的情况 直接检测末尾数字可以特判2 特判1时,还要特判11和111,其他数字,k是奇数时是质数&#x…...

AI大模型学习十七、利用Dify搭建 AI 图片生成应用

一、说明 随着图像生成技术的兴起,涌现了许多优秀的图像生成产品,比如 Dall-e、Flux、Stable Diffusion 等。 本文将使用图像生成模型,学习使用 Dify 快速开发一个 AI 图片生成应用 二、获取Stablility API 密钥 1、注册 Stability AI - De…...

分布式锁原理

1.锁是什么 一个线程拿到锁,另一个线程就拿不到,满足互斥性。 2.Redis的setnx实现 加锁后解锁,但是要先判断是否是当前线程持有的锁,只能释放本线程的锁。 先判断后释放,两步操作Lua实现原子性 3.为什么要给锁加过期…...

近日部署跑通的若干多模态模型总结与论文概述

CLIP模型概述与落地测试 CLIP模型全称是Contrastive Language-Image Pretraining​​(对比语言图像预训练)。是OpenAI于2021年提出的多模态预训练模型,通过对比学习对齐图像和文本的表示,实现零样本(zero-shot&#x…...

torch.nn.init.uniform_

nn.init.uniform_ 是 PyTorch 中用于初始化张量(tensor)的一个函数,它的作用是将张量的值填充为从均匀分布中采样的随机数。 详细说明: 函数: torch.nn.init.uniform_(tensor, a0., b1.)tensor:需要被初始…...

类加载机制详解:双亲委派模型与打破它的方式

在复杂的 Java 系统中,类加载是最基础却常被忽略的一环。理解 JVM 的类加载机制,特别是 双亲委派模型(Parent Delegation Model),是我们深入掌握热部署、插件机制、ClassLoader 隔离、ClassNotFound 错误等问题的关键。…...

【基于 LangChain 的异步天气查询2】GeoNames实现地区实时气温查询

目录 功能简介 一、创建GeoNames账号 1、进入官网 2、创建账号 二、运行代码 weather_runnable.py main.py 运行结果 功能简介 本文主要通过Langchain,结合GeoNames实现了地区温度的实时查询,并通过GPT-4o对温度进行一段简短的描述。 一、创建Ge…...

Linux终端展示效果优化:【whiptail】使用教程

🧰 Linux终端展示效果优化:whiptail 使用教程 🧭 什么是 whiptail whiptail 是一个轻量级终端对话框工具,功能与 dialog 类似,用于在 Shell 脚本中创建图形交互界面。与 dialog 相比,它依赖更少&#xff…...

spring中的@Inject注解详情

在 Spring 框架中,Inject 是 Java 依赖注入标准(JSR-330) 的核心注解,与 Spring 原生的 Autowired 类似,但具备更标准化的跨框架特性。以下从功能特性、使用场景及与 Spring 原生注解的对比进行详细解析: 一…...

联邦学习图像分类实战:基于FATE与PyTorch的隐私保护机器学习系统构建指南

引言 在数据孤岛与隐私保护需求并存的今天,联邦学习(Federated Learning)作为分布式机器学习范式,为医疗影像分析、金融风控、智能交通等领域提供了创新解决方案。本文将基于FATE框架与PyTorch深度学习框架,详细阐述如…...

Java—— 泛型详解

泛型概述 泛型是JDK5中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式&#xff1a;<数据类型> 注意&#xff1a;泛型只能支持引用数据类型。 泛型的好处 没有泛型的时候&#xff0c;可以往集合中添加任意类型的数据&#x…...

average per-pixel disparity error: EPE及不同距离值下的误差曲线

写在前面 本文内容 介绍epe的概念&#xff0c;作用&#xff1b; 由epe推导出的不同距离下的物理误差曲线 一句话简单理解&#xff1a;epe是用于深度估计、以像素为单位的误差度量方式 平台/环境 python 转载请注明出处&#xff1a; https 目录 写在前面EPE**1. 视差与深度的关…...

解决mybatisplus主键无法自增的问题

mybatisplus&#xff0c;yml配置正确&#xff0c;实体类加上 了注解&#xff0c;数据库设置了自增 当mybatisplus配置文件完全正确&#xff0c;主键依然无法自增&#xff0c;可以这样解决&#xff1a; 删除所有雪花算法生成的id字段&#xff0c;然后执行ALTER TABLE 库名.表…...

C++ learning day 02

目录 引言 编译定义&#xff1a; 查看obj文件 1. 禁用预处理 2. CTRL F7 编译math.cpp 3. 查看obj文件 4. 查看.asm文件&#xff08;汇编程序&#xff09; 引言 今天介绍C中&#xff0c;一个Cpp文件经过汇编后得到obj文件&#xff0c;以及obj文件的内容&a…...

Qt开发经验 --- 避坑指南(12)

文章目录 [toc]1 关闭编译警告2 VS离线安装3 Qt视频播放QMediaPlayer配置4 Qt5安装包下载5 将库添加为qmake模块 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1 关闭编译警告 Qt在编译时编译器会检测代码&#xff0c;报出警告&…...

【Web】LACTF 2025 wp

目录 arclbroth lucky-flag whack-a-mole arclbroth 看到username为admin能拿到flag 但不能重复注册存在的用户 这题是secure-sqlite这个库的问题&#xff0c;底层用的是C&#xff0c;没处理好\0字符截断的问题 &#xff08;在 Node.js 中&#xff0c;由于其字符串表示方式…...

[架构之美]Windows系统安装MySQL 8.0详细图文教程(十八)

[架构之美]Windows系统安装MySQL 8.0详细图文教程&#xff08;十八&#xff09; 摘要&#xff1a;本文手把手教你从零开始完成MySQL 8.0的Windows系统安装&#xff0c;涵盖社区版下载、环境配置、服务初始化全过程&#xff0c;并提供安装失败、密码重置等常见问题的终极解决方…...

指针运算典型例题解析

1.题目1 该代码运行的结果是什么&#xff1f; #include <stdio.h> int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } 解析&#xff1a; 运行结果&#xff1a; 2.题目2 在X86…...

流式数据(Streaming Data)和非流式数据(Batch Data)区别、使用场景、优化-来自前端的浅解

流式数据(Streaming Data) 和 非流式数据(Batch Data) 是两种不同的数据处理模式,它们在数据来源、处理方式和应用场景上有显著区别。 流式数据指的是按时间顺序连续不断地产生的数据流。这些数据流可以来自于各种来源,如传感器、日志文件、社交媒体等 非流式数据是指数据…...

SQL注入问题

目录 一、SQL注入漏洞概述 二、SQL注入漏洞的产生 2.1 产生效果 2.2 产生原因 三、SQL注入漏洞的解决 3.1 使用PreparedStatement接口 3.2 预编译SQL语句 3.3 掌握的方法 3.3.1 获取PreparedStatement对象 3.3.2 设置参数 3.3.3 执行SQL语句 3.3.4 示例代码 四、总…...

python tkinter 实现 带界面(GUI)的RSA加密、签名

参考文章&#xff1a;python tkinter 实现 带界面(GUI)的RSA加密、签名 - swuxyj - 博客园 RSA加密的过程是&#xff1a;使用公钥加密&#xff0c;私钥解密 RSA签名的过程是&#xff1a;使用私钥签名&#xff0c;公钥验证 所以核心代码就是&#xff0c;生成公钥私钥&#xf…...

什么是向量数据库?向量数据库和关系数据库有什么区别?

什么是向量数据库&#xff1f; 向量数据库是一种专门设计用来存储、索引和查询向量数据的数据库系统。在当今的人工智能和机器学习领域中&#xff0c;向量数据库变得越来越重要&#xff0c;尤其是在处理高维数据如图像、音频和文本等非结构化数据时。 主要用途 相似度搜索&…...

张 SoulChat2.0:心理咨询师优化:提示词优化;构建数据集微调LLM

张 SoulChat2.0:心理咨询师优化:提示词优化;构建数据集微调LLM 是一个关于心理咨询师数字孪生大语言模型的项目,旨在解决过往心理健康大语言模型未充分考虑心理咨询师个人风格以及多轮对话数据混合微调导致回复不稳定的问题。 项目概述 自2023年5月发布 SoulChat 后,团…...

如何通过ABAP获取SAP生产订单的目标成本

SAP存储生产订单成本的主要底表包括&#xff1a; COBK: CO凭证表头COEP: CO凭证行项目COSS: 来自CO内部的汇总数据COSP: 来自CO外部部的汇总数据 先说结论&#xff1a;SAP 对生产订单的目标成本是没有保存到底表的。那么如何通过代码的方式获取呢&#xff1f; K_KKB_KKBCS_O…...

医疗信息化江湖风云再起!金仓数据库亮相CHIMA 2025

在医疗与科技深度交融的时代浪潮下&#xff0c;每一次创新都肩负着守护生命健康的崇高使命。当医疗的严谨需求邂逅无限的技术想象&#xff0c;会激荡出怎样震撼行业的力量&#xff1f; 5月9日至11日&#xff0c;第29届学术年会——中国医院信息网络大会暨医疗信息技术和产品展览…...

深入浅出 JDBC 与数据库连接池

在Java开发中&#xff0c;与数据库进行交互是几乎每个项目都离不开的功能。JDBC&#xff08;Java DataBase Connectivity&#xff09;作为Java操作数据库的标准规范&#xff0c;为开发者提供了底层的数据库访问支持。而数据库连接池则是提高数据库操作效率和性能的重要工具。本…...

Java基础 集合框架 Collection接口和抽象类AbstractCollection

集合框架 Collection接口简介核心设计目标父接口Iterable<T>基于Stream流的操作定义了所有集合类的基本操作 Collection接口方法Collection接口总结 抽象类AbstractCollection简介核心设计目标减少重复代码对 不可变集合 支持 AbstractCollection关键方法实现AbstractCol…...

PTA:jmu-ds-拓扑排序

给定一个有向图&#xff0c;求其拓扑序列&#xff0c;若有环路&#xff0c;输出error! 注意&#xff1a;本题用栈结构实现入度为0结点存储&#xff0c;否则拓扑序列输出顺序会和测试数据不一致。本题栈结构建议用数组实现&#xff0c;不用栈类。 ###你要实现的 函数接口定义&…...

Python与YOLO:自动驾驶中的实时物体检测

Python与YOLO:自动驾驶中的实时物体检测 引言:从物体检测到智能驾驶 说到自动驾驶,很多人脑海中首先想到的可能是智能汽车,它们能够自主地行驶,无需人类干预。这一切的背后,离不开一项至关重要的技术——实时物体检测。在自动驾驶中,车辆需要通过摄像头、雷达等传感器获…...

USR-M100采集数据并提交MQTT服务器

本文为记录备忘&#xff0c;不做过多解释。 模块自身带有2路数字量输入&#xff0c;2路模拟量输入&#xff0c;2路485接口 数字量接报警输入&#xff0c;模拟量接压力传感器&#xff0c;液位传感器&#xff0c;485接口分别接流量计&#xff0c;温湿度传感器。 正确接线&…...

OpenAI API JSON 格式指南与json_repair错误修复

核心参数是response_format{"type": "json_object"} ,其他支持json调用的模型也可以这样使用的&#xff0c;下面我们以Openai模型为例 指定OpenAI API返回JSON格式 基本JSON格式响应示例 import openaiclient openai.OpenAI(api_key"your-api-key…...

Java字节缓冲流高效读写文件指南

该代码展示了如何使用Java中的字节缓冲流&#xff08;BufferedInputStream和BufferedOutputStream&#xff09;进行文件的读取和写入操作。首先&#xff0c;通过BufferedInputStream从指定路径的文件中读取数据&#xff0c;然后使用BufferedOutputStream将数据写入到另一个文件…...

【生命周期分析(Life Cycle Assessment: LCA)】基于OpenLCA、GREET、R语言的生命周期评价方法、模型构建及典型案例应用

生命周期分析&#xff08;Life Cycle Assessment&#xff0c;简称LCA&#xff09;是一种用于评估产品、服务或过程从摇篮到坟墓&#xff08;即从原材料获取、生产、使用到废弃处理&#xff09;整个生命周期中对环境影响的科学方法。它可以帮助我们全面了解一个产品或系统在各个…...

jdk多版本切换,通过 maven 指定编译jdk版本不生效,解决思路

背景 在使用 Maven 构建 Java 项目时&#xff0c;有时需要通过 pom.xml 文件指定编译的 JDK 版本&#xff0c;但发现配置后并未生效。这种情况通常是由于以下几个原因导致的&#xff1a; pom.xml 配置不完整或错误 在 pom.xml 中&#xff0c;通常需要配置 maven-compiler-plug…...

一文理解扩散模型(生成式AI模型)(1)

图片扩散模型运作的大致流程如下&#xff1a; 1.加噪过程&#xff1a;给定一张原始图片&#xff0c;一步步地在这张图片中添加噪声&#xff0c;图片在加噪过程中逐渐失去所有信息&#xff0c;变成无法辨识的白噪声(用物理现象来理解这个过程的话可以理解为在清水中加入墨汁&am…...

JavaScript--Array

文章目录 数组基础数组Array.concat()合并数组Array.indexOf()Array.isArray()Array.join()连接Array.pop()删除Array.push()添加Array.shift()删除Array.unshift()添加Array.slice()切割 进阶数组Array.filter()过滤Array.forEach()添加Array.map()Array.reduce()叠加Array.so…...

Java大师成长计划之第17天:锁与原子操作

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在多线程编程中&#xff0c;如何保证…...

Tailwind CSS v4 主题化实践入门(自定义 Theme + 主题模式切换)✨

ok&#xff0c;经过学习Tailwindcss我决定将此专栏建设成为一个Tailwindcss实战专栏&#xff0c;我将在专栏内完成5050挑战&#xff1a;50天50个Tailwindcss练习项目&#xff0c;欢迎大家订阅&#xff01;&#xff01;&#xff01; Tailwind CSS v4 带来了更强大的主题定制能力…...

[C++] 大数减/除法

目录 高精度博客 - 前两讲高精度减法高精度除法高精度系列函数完整版 高精度博客 - 前两讲 讲次名称链接高精加法[C] 高精度加法(作用 模板 例题)高精乘法[C] 高精度乘法 高精度减法 void subBIG(int x[], int y[], int z[]){z[0] max(x[0], y[0]);for(int i 1; i < …...

数据链共享:从印巴空战到工业控制的跨越性应用

摘要 本文通过对印巴空战中数据链共享发挥关键作用的分析&#xff0c;引出数据链共享在工业控制领域同样具有重大价值的观点。深入阐述 DIOS 工业控制操作系统作为工业数据链共享基础技术的特点、架构及应用优势&#xff0c;对比空战场景与工业控制场景下数据链共享的相…...

加速pip下载:永久解决网络慢问题

一文教你解决 pip 下载太慢了的问题 || 下载时因为网络不好中断下载的问题 一、找到 pip 配置文件路径 1.配置文件位置&#xff1a; Windows 系统的 pip 配置文件默认不存在&#xff0c;需要手动创建&#xff0c;路径为&#xff1a; C:\Users\你的用户名\pip\pip.ini 用户目…...

无线网络设备中AP和AC是什么?有什么区别?

无线网络设备中AP和AC是什么&#xff1f;有什么区别&#xff1f; 一. 什么是AP&#xff1f;二. 什么是AC&#xff1f;三. AP与AC的关系 前言 肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都…...

软考中级数据库备考-上午篇

背景 新工作主要做大数据平台&#xff0c;考一个软考中级数据库系统工程师&#xff0c;补足一下基础知识。 基础知识 1.计算机硬件基础知识 正确答案:C 正确答案:D 正确答案:C 正确答案&#xff1a;BC 正确答案&#xff1a;B 正确答案:D 正确答案:A DMA建立内存与外设的直接…...

opencv处理图像(二)

接下来进入到程序线程设计部分 我们主线程负责图形渲染等操作&#xff0c;OpenGL的限制&#xff0c;opencv技术对传入图像加以处理&#xff0c;输出预期图像给主线程 QThread 我之前也是在想给opencv开一个专门的线程&#xff0c;但经过了解有几个弊端&#xff0c;第一资源浪…...

powerbuilder9.0中文版

经常 用这个版本号写小软件,非常喜欢这个开发软件 . powerbuilder9.0 非常的小巧,快捷,功能强大,使用方便. 我今天用软件 自己汉化了一遍&#xff0c;一些常用的界面都已经翻译成中文。 我自己用的&#xff0c;以后有什么界面需要翻译&#xff0c;再更新一下。 放在这里留个…...

Linux510 ssh服务 ssh连接

arning: Permanently added ‘11.1.1.100’ (ECDSA) to the list of known hosts. rooot11.1.1.100’s password: Permission denied, please try again. rooot11.1.1.100’s password: Permission denied, please try again 还没生效 登不上了 失效了 sshcaozx26成功登录 …...

【25软考网工】第六章(2)信息加密技术

博客主页&#xff1a; christine-rr-CSDN博客 ​专栏主页&#xff1a; 软考中级网络工程师笔记 ​ 大家好&#xff0c;我是christine-rr !目前《软考中级网络工程师》专栏已经更新二十多篇文章了&#xff0c;每篇笔记都包含详细的知识点&#xff0c;希望能帮助到你&#xff01…...

LeetCode 热题 100 138. 随机链表的复制

LeetCode 热题 100 | 138. 随机链表的复制 大家好&#xff0c;今天我们来解决一道经典的链表问题——随机链表的复制。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求深拷贝一个带有随机指针的链表。 问题描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额…...