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

http协议版本的区别 -- 2和3

目录

http2和http3的区别

传输层协议

QUIC协议

介绍

连接建立与握手

建立安全连接的过程

RTT

建连为什么需要两个过程

原因

解决

QUIC协议的1-RTT 建连

必要性

连接过程

第一次握手(Client Hello)

版本号

key_share

其他

第二次握手

介绍

Server Hello

身份验证

生成对称密钥

QUIC协议的0-RTT 建连

介绍

连接过程

队头阻塞

如何解决队头阻塞问题

安全性

性能

连接迁移

引入

介绍

连接 ID

过程

拥塞控制算法

介绍

TCP计算RTT

QUIC计算RTT

热插拔特性

QUIC 的两级流量控制


http2和http3的区别

传输层协议

HTTP/2

基于 TCP(传输控制协议)实现

HTTP/3

在 HTTP/3 中,弃用 TCP 协议,改为使用基于 UDP 协议 QUIC 协议实现

  • QUIC(Quick UDP Internet Connections)协议(传输层协议)

QUIC协议

介绍

QUIC 协议实现在用户态,建立在内核态的 UDP 的基础之上,集成了 TCP 的可靠传输特性+ TLS1.3 协议,保证了用户数据传输的安全

  • 具有建连快,连接迁移的优秀特性
  • 解决了tcp的队头阻塞问题
  • 实现了更好的拥塞/流量控制算法

连接建立与握手

HTTP/2

需要进行 TCP 三次握手,然后再进行 TLS(传输层安全)握手

  • 总共可能需要多次往返才能建立安全连接

建立安全连接的过程

首先,当客户端使用域名访问服务器时,需要借助DNS服务器获取ip地址

  • DNS服务介绍(hosts文件,域名分级,主域名和子域名),域名解析过程(解析过程,dig命令), 面试题(输入url后会发生什么)_hosts文件中的子域名-CSDN博客

传统http的建连需要TCP和TLS两个过程

  • 三次握手需要1 RTT
  • 交换秘钥需要2 RTT -- 客户端发起握手,服务端确认TLS版本+发送证书,客户端内部进行验证+生成对称密钥+加密发送,服务器确认

对于一个小请求(用户数据量较小)而言,传输数据只需要 1 个 RTT

RTT

RTT -- (Round-Trip Time,往返时延)

  • 从发送方发送一个数据包开始,到接收到接收方返回的应答包为止的总时间

建连为什么需要两个过程

原因

因为TCP 和 TLS 没办法合并

  • TCP 是内核态协议:传统的 TCP 协议实现是在内核中的,属于操作系统内核的一部分,应用层无法修改其行为

  • TLS 是用户态协议:TLS 是应用层协议,运行在用户空间,比如浏览器或应用程序内

  • 二者在物理上就不同(内核态/用户态),所以无法合并

解决

如果把tcp挪到用户态呢?

  • 不可行,没法弃用内核里的 TCP
  • 所有操作系统和网络设备(防火墙、路由器等)都已经高度适配和优化了 TCP 协议,内核级别实现是几十年演进的结果

  • 想在用户态重写 TCP,意味着你得重新实现拥塞控制、重传机制、滑动窗口、头部格式、与 OS 协同等等,成本极高,而且还不一定跑得过内核版 TCP

  • 更关键的是,没法让全球其他服务器配合你一起改内核,这不现实

既然干不掉,那就自定义一个传输层协议放在用户态.如何呢?

  • 当然可行,既然 TCP 合并不了 TLS,那就自己造个轮子
  • 在用户态实现后,再结合 TLS.就可以把两个建连过程合二为一了
  • 这就是 QUIC协议 的实现思路

HTTP/3

QUIC 协议将握手和加密过程合并,初次建连只需一次往返即可建立安全连接,减少了连接建立的延迟

  • 并且,后续再次建连可以使用 0-RTT 特性

QUIC协议的1-RTT 建连

必要性

如果客户端与服务端初次建连(之前从未进行通信过),或者长时间没有通信过(0-RTT 过期了),只能进行 1-RTT 建连

  • 只有先进行一次完整的 1-RTT 建连,后续一段时间内的通信才可以进行 0-RTT 建连

连接过程

整个握手过程需要 2 次握手(第三次是带了数据的)

  • 所以整个握手过程只需要 1-RTT(RTT 是指数据包在网络上的一个来回)的时间
  • 分成两个部分 -- Client Hello(发送QUIC 连接信息) + Server Hello(TLS1.3 握手部分)

第一次握手(Client Hello)

QUIC连接 : 协商 QUIC 版本号、协商 quic 传输参数、生成连接 ID、确定 Packet Number 等信息

  • 类似于 TCP 的 SYN 报文
版本号

Client Hello 在扩展字段里标明了支持的 TLS 版本(Supported Version:TLS1.3)

  • 虽然这里写的是TLS1.3,但实际上ClientHello 报文中的Version 字段写的是 0x0303(TLS 1.2)

为什么要这样设计?

  • 为了兼容老旧的中间设备
  • 很多网络设备(比如负载均衡器、NAT、防火墙)会“窥探”TLS握手包内容,会根据报头中的Version字段决定是否通过
  • 但这些老旧设备 只认识 TLS 1.0、1.1、1.2 的标号,如果写入1.3到Version字段,可能会导致拒绝连接/拦截握手,甚至丢包或断链,所以只能写入1.2
  • 并且设计了一个扩展字段Supported Version明确告诉服务器:我其实支持 TLS1.3
key_share

ClientHello 中包含了非常重要的 key_share 扩展

  • 客户端在发送之前,会自己根据 DHE 算法生成一个公私钥对
  • 发送 Client Hello 报文的时候会把这个公钥(存在于 key_share 中)发过去,key_share 还包含了客户端所选择的曲线 X25519
  • 总之,key_share 是客户端提前生成好的公钥信息
其他

Client Hello 里还包括了:客户端支持的算法套、客户端所支持的椭圆曲线以及签名算法、psk 的模式等等,一起发给服务端。 

第二次握手
介绍

QUIC协议中,服务器会在第二次握手中一次性并发完成连接建立 + TLS 加密协商

  • 会发送多个 QUIC 报文 : Server Hello报文+用于服务端的身份认证和握手确认的报文
Server Hello

  • 服务端自己根据 DHE 算法也生成了一个公私钥对,同样的,Key_share 扩展信息中也包含了 服务端的公钥信息
  • 服务端通过 ServerHello 报文将这些信息发送给客户端
身份验证

生成对称密钥

至此为止,双方(客户端服务端)都拿到了对方的公钥信息,然后结合自己的私钥信息,生成 pre-master key

  • 在这里官方的叫法是(client_handshake_traffic_secret 和 server_handshake_traffic_secret)
  • pre-master key属于是一个中间结果,用于生成最终对称加密密钥的原材料
  • 然后密钥导出函数得到 key 和 iv(初始化向量),使用 key 和 iv 对 Server Hello 之后所有的握手消息进行加密

QUIC协议的0-RTT 建连

介绍

基于会话复用功能实现

  • 在握手完成之后,服务端会发送一个 New Session Ticket 报文(0-RTT 实现的基础)给客户端

作用:

  • QUIC 协议0-RTT 特性是指,在 首次建立连接后,后续连接可以利用以前的握手信息,跳过部分握手过程,直接开始数据传输,减少延迟

什么时候会再次建连呢?

  • 连接超时(QUIC 会保存一定时间的连接信息,如 0-RTT 密钥,允许客户端重新发起连接时跳过传统的 1-RTT 握手) 或 关闭(连接因某些原因被关闭或丢失(比如网络切换)后的重新连接
  • 连接断开后的重试(网络切换/设备休眠/客户端IP地址改变)
  • 客户端重新连接到同一服务器(一些场景需要客户端在之后的请求中继续与同一个服务器建立连接)
连接过程

虽然client 和 server 在建连时,仍然需要两次握手,仍然需要 1 个 rtt

  • 但是client 在发送第一个包 client hello 时,就带上了数据(HTTP 请求) -- 从何时开始发送数据这个角度上来看,的确是 0-RTT
  • 这个请求的数据并不会跟 Initial 报文(内含 Client Hello)一起发送,而是单独一个数据包(0-RTT 包)进行发送,它和 Initial 包同时发送

队头阻塞

HTTP/2

在 TCP 层面,如果发生数据包丢失,必须等待丢失的数据包被重新传输,可能导致队头阻塞,影响多路复用的效率

HTTP/3

QUIC 协议在应用层实现了多路复用即使某个数据包丢失,只会影响对应的流,其他流可以继续传输,减少了队头阻塞的影响

如何解决队头阻塞问题

这里有两个请求同时发送

  • 红色的是请求 1,蓝色的是请求 2,这两个请求在两条不同的流中进行传输

假设在传输过程中,请求 1 的某个数据包丢了

  • 如果是 TCP,即使请求 2 的所有数据包都收到了,但是也只能阻塞在内核缓冲区中,无法交给应用层 -- 所有数据(无论属于哪个请求)在传输时,都会进入一条顺序一致的队列中,一旦某个中间的数据包丢失,后面的数据即使已到达,也不能提交给应用层,因为顺序被打乱了
  • 但是 QUIC 就不一样了,请求 1 的数据包丢了只会阻塞请求 1,请求 2 不会受到阻塞 -- QUIC 在应用层实现多路复用的独立流,每个流都有自己的数据编号和确认机制

为什么只有 QUIC 才能解决呢?

  • 虽然HTTP2中也有流的概念 -- HTTP/2 在用户态实现了多路复用,用“帧”把多个请求的数据包混在一起发
  • 但这些帧最后都变成一串字节交给 TCP 发送TCP 的实现在内核态,而流的实现在用户态对于TCP来说,它是看不到“流”的
  • 所以在 TCP 中,它不知道这个数据包是请求 1 还是请求 2 的,只会根据 seq number 来判断包的先后顺序,所以无法避免队头阻塞

举个例子来说明两个协议的不同:

安全性

HTTP/2

通常与 TLS 结合使用,但在某些情况下也可以不使用加密

HTTP/3

设计上强制使用加密,确保数据传输的安全性

性能

HTTP/3在弱网/高延迟/高丢包的场景下性能提升非常明显

  • 相较于 HTTP/2 平均能提升 20%~30%
  • 并且可以在 WiFi 和蜂窝数据切换时,网络完全不断开、直播不卡顿、视频不缓冲

为什么会有这么高的性能提升呢?

  • HTTP3拥有更短的建连过程,还实现了连接迁移功能,并且优化了拥塞/流量控制

但不是说HTTP3就完爆HTTP2了,它在稳定高速网络下,提升不一定明显,甚至开销可能略高

  • 在高性能机器、内网等场景下,HTTP/2 的性能也很优秀

 

连接迁移

引入

我们经常需要在 WiFi 和 4G 之间进行切换,比如:

  • 在家里时使用 WiFi,出门在路上,切换到流量
  • 出了门,又可以连上其他场所的 WiFi
  • 所以我们的日常生活中需要经常性的切换网络

而每一次的切换网络,都变化我们的 IP 地址

介绍

传统的 TCP 协议是以四元组(源 IP 地址、源端口号、目的 ID 地址、目的端口号)标识一条连接

  • 一旦四元组的任何一个元素发生了改变,这条连接就会断掉 -> 这条连接中正在传输的数据就会断掉
  • 切换到新的网络后可能需要重新去建立连接,然后重新发送数据 -- 在用户看来,就是他的网络会“卡”一下

但是,QUIC 不再以四元组作为唯一标识,QUIC 使用连接 ID 来标识一条连接

  • 无论网络如何切换,只要连接 ID 不变,那么这条连接就不会断,这就叫连接迁移
连接 ID

每条连接拥有一组连接标识符,也就是连接 ID

  • 连接 ID 是由一端独立选择的,每个端(客户端和服务端统称为端)选择连接 ID 供对端使用
  • 也就是说,客户端生成的连接 ID 供服务端使用(服务端发送数据时使用客户端生成的连接 ID 作为目的连接 ID),反过来同理

连接 ID 的主要功能:

  • 解决连接迁移时的识别问题,确保连接不会因 IP地址 / 端口号变化而中断
过程

QUIC 限制连接迁移仅客户端可以发起 (由客户端负责发起所有迁移)

  • 如果客户端接收到了一个未知的服务器发来的数据包,客户端必须丢弃这些数据包,而不会去识别 -- 可以避免伪造包/欺骗连接的风险

连接迁移过程总共需要四个步骤:

  • 连接迁移之前,客户端使用 IP1 和服务端进行通信

  • 当客户端 IP 变成 IP2,并且使用 IP2 发送非探测帧给服务端启动路径验证(双方都需要互相验证,所以图中是两个过程)

  • 通过 PATH_CHANLLENGE 帧和 PATH_RESPONSE 帧进行验证

  • 验证通过后,后续就可以使用 IP2 进行通信

拥塞控制算法

介绍

拥塞控制算法中最重要的一个参数是 RTT,RTT 的准确性决定了拥塞控制算法的准确性

  • RTT 是数据从发送端到接收端再返回所需的总时间,可以反映网络时延变化,作为动态调整发送速率的依据

然而,TCP 的 RTT 测量往往不准确,QUIC 的 RTT 测量是准确的

TCP计算RTT

TCP协议中的原包和重传包的序号是一样的

  • 那么拥塞控制算法进行计算 RTT 的时候,无法区别是初始包还是重传包
  • 也就导致 RTT 的计算值要么偏大,要么偏小
QUIC计算RTT

  • QUIC 通过 Packet Number 来标识包的序号 (用来代替tcp的序号)
  • 它规定 Packet Number 只能单调递增,这也就解决了初始包和重传包的二义性
  • 从而保证 RTT 的值是准确的
热插拔特性

不同于实现在内核态的TCP,实现在用户态QUIC 的拥塞控制算法是可插拔的

  • 它可以根据不同的业务 / 连接灵活选择使用不同的拥塞控制算法
  • Reno、New Reno、Cubic、BBR 等算法都有自己适合的场景

QUIC 的两级流量控制

QUIC 是双级流控 -- 连接级别 + 流级别的流控

每个流都有自己的可用窗口,可用窗口的大小取决于(最大窗口数 - 发送出去的最大偏移数)

  • 跟中间已经发送出去的数据包,是否按顺序收到了对端的 ACK 无关

这与TCP中的机制在本质上不同:

  • TCP 的窗口滑动是依赖于“按序 ACK”,如果中间一个包没 ACK,后面的都不能滑动 -- 也就是基于ACK滑动流控窗口
  • 而 QUIC 是“基于 offset 的流控”,只关心你已经发送到了哪个 offset,不管你中间的 ACK 来没来 (这一点和http2类似,它在发送时可以将一个包分成多个帧,每个帧带上偏移量,接收方根据偏移量拼接报文,而不要求按序到达) -- ACK只是用来进行丢包检测和重传,不作为窗口滑动的依据

参考 -- 一文读懂QUIC协议:更快、更稳、更高效的网络通信_后端_李龙彦_InfoQ精选文章

(写的超级好啊o( ̄▽ ̄)d)

相关文章:

http协议版本的区别 -- 2和3

目录 http2和http3的区别 传输层协议 QUIC协议 介绍 连接建立与握手 建立安全连接的过程 RTT 建连为什么需要两个过程 原因 解决 QUIC协议的1-RTT 建连 必要性 连接过程 第一次握手(Client Hello) 版本号 key_share 其他 第二次握手 介绍 Server Hello 身…...

Vue2-实现elementUI的select全选功能

文章目录 使用 Element UI 的全选功能自定义选项来模拟全选 在使用 Element UI 的 el-select组件时,实现“全选”功能,通常有两种方式:一种是使用内置的全选功能,另一种是通过自定义选项来模拟全选。 使用 Element UI 的全选功能…...

Spring Boot 与 TDengine 的深度集成实践(四)

优化与扩展 批量插入数据 在实际应用中,当需要插入大量数据时,逐条插入会导致性能低下,因为每次插入都需要建立数据库连接、解析 SQL 语句等操作,这些操作会带来额外的开销 。为了提高数据插入效率,我们可以采用批量…...

2025年【山东省安全员C证】考试题及山东省安全员C证考试内容

在当今建筑行业蓬勃发展的背景下,安全生产已成为企业生存与发展的基石。安全员作为施工现场安全管理的直接责任人,其专业能力和资质认证显得尤为重要。山东省安全员C证作为衡量安全员专业水平的重要标准,不仅关乎个人职业发展,更直…...

提升Spring Boot开发效率的Idea插件:Spring Boot Helper

一、Spring Boot Helper插件介绍 Spring Boot Helper是一款专为Spring Boot开发者设计的IntelliJ IDEA插件,它提供了丰富的功能来简化和加速Spring Boot应用程序的开发过程。 该插件能够智能识别Spring Boot项目结构,提供专属的代码生成、配置辅助和运…...

【USTC 计算机网络】第三章:传输层 - 面向连接的传输:TCP

本文介绍了面向连接的传输协议:TCP,首先介绍 TCP 报文段的结构以及如何设置超时定时器,接着介绍 TCP 如何实现可靠数据传输以及流量控制,最后介绍 TCP 中最重要的三次握手与四次挥手的连接建立与关闭过程。 1. TCP 概述与段结构 …...

Linux主要开发工具之gcc、gdb与make

此系列还有两篇,大家想完整掌握可以阅读另外两篇 Linux文本编辑与shell程序设计-CSDN博客 Linux基础知识详解与命令大全(超详细)-CSDN博客 1.gcc编译系统 1.1 文件名后缀 文件名后缀 文 件 类 型 文件名后缀 文 件 类 型 .c C源…...

23种设计模式-行为型模式-观察者

文章目录 简介问题解决代码关键实现说明 总结 简介 观察者是一种行为设计模式, 允许你定义一种订阅通知机制, 可在事件发生时通知多个“观察/订阅”该对象的其他对象。 问题 假如你有两种类型的对象: 顾客和商店。顾客对某个新品非常感兴趣&#xff0…...

去中心化预测市场

去中心化预测市场 核心概念 预测市场类型: 类别型市场:二元结果(YES/NO),例如“BTC在2024年突破10万美元?” 多选型市场:多个选项(如总统候选人),赔付基于…...

springboot-ai接入DeepSeek

1、引入pom依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency><dependencyManagement><dependencies><dependency><groupId>o…...

【C语言】数据在内存中的储存(整形)

目录 前言&#xff1a; 预备知识 整数在内存中的储存 原码 反码 补码 总结&#xff1a; 前言&#xff1a; 在上两章中讲解了五大内存函数&#xff0c;其中memchr函数&#xff0c;这个函数考察到数据内存的存储。 接下来为大家讲解整数在内存中的储存。 预备知识 认识…...

PCL 树木树干粗提取(地基数据,TLS)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 主要的思路如下: 1、首先,使用之前的CSF算法提取点云的地面点,在提取的过程中我们可以得到一个布料结构(地面模型)。 2、在得到这个布料结构之后,我们也就可以得到整个地面模型的高度了,之后我们只需要遍历每…...

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定义&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 是一种设计思想&#xff1a;对象不再由你自己创建和管理&#xff0c;而是交给 Spring 容器…...

尚硅谷2019版Java集合和泛型

第十一章 Java集合框架 集合框架全景图 mindmaproot((Java集合))Collection单列List有序可重复ArrayListLinkedListVectorSet无序唯一HashSetLinkedHashSetTreeSetMap双列HashMapLinkedHashMapTreeMapHashtablePropertiesToolsCollectionsArrays三大核心接口对比 特性ListSe…...

车载诊断架构 --- 整车重启先后顺序带来的思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

华为eNSP:实验 配置单区域集成ISIS

单区域集成ISIS是一种基于中间系统到中间系统&#xff08;IS-IS&#xff09;协议的网络架构优化方案&#xff0c;主要用于简化网络设计并提升数据传输效率。其核心特点包括&#xff1a; ‌单一区域部署‌ ISIS协议在单一逻辑区域内运行&#xff0c;消除多区域间的分层复杂性&am…...

常见框架漏洞(五)----中间件IIS6

一、【PUT漏洞】 漏洞描述&#xff1a;IIS Server 在 Web 服务扩展中开启了 WebDAV &#xff0c;配置了可以写⼊的权限&#xff0c;造成任意⽂件上传。 版本&#xff1a;IIS 6.0 1. 环境 fofa搜素环境&#xff1a;"IIS-6.0" 或者环境搭建&#xff1a;本地搭建2003…...

leetcode221.最大正方形

class Solution {public int maximalSquare(char[][] matrix) {int result 0; // 记录正方形边长int m matrix.length, n matrix[0].length;int[][] dp new int[m 1][n 1];// 动态规划for (int i 1; i < m; i) {for (int j 1; j < n; j) {if (matrix[i - 1][j - …...

C++实现AVL树

一 AVL树的概念 上上节我们学习了二叉搜索树&#xff0c;他的理想查找的时间复杂度是o(log n)&#xff0c;但是如果是下面这种情况&#xff0c;那么它的时间复杂度就会变成o(n). 这种情况就是出现一边高的那种&#xff0c;它的个数和它的高度相差不大。 那么这样就会把二叉搜索…...

Linux系统安全及应用

目录 一.账号安全措施 1.1系统账号清理 1.1.1将非登录用户的shell设为无法登录 1.1.2删除无用用户 userdel 1.1.3锁定账号文件 1.1.4锁定长期不使用的账号 1.2密码安全控制 1.2.1 对新建用户 1.2.2对已有用户 1.3命令历史限制 1.3.1临时清除历史命令 1.3.2限制命令…...

JAVA反序列化深入学习(十三):Spring2

让我们回到Spring Spring2 在 Spring1 的触发链上有所变换&#xff1a; 替换了 spring-beans 的 ObjectFactoryDelegatingInvocationHandler使用了 spring-aop 的 JdkDynamicAopProxy &#xff0c;并完成了后续触发 TemplatesImpl 的流程 简而言之&#xff0c;换了一个chain&am…...

迭代器运算详解(四十二)

1. 迭代器的随机访问运算 对于 vector 和 string 这样的容器&#xff0c;它们的迭代器支持以下随机访问运算符&#xff1a; 运算符说明iter n返回一个新的迭代器&#xff0c;该迭代器比原来的迭代器 iter 向前移动了 n 个位置&#xff08;即指向后面的第 n 个元素&#xff0…...

Linux中Squid服务常用操作

在 Linux 中 Squid 服务常用操作介绍 1. Squid 基础操作 启动 Squid # 前台启动&#xff08;调试用&#xff09; squid -N -d 1# 后台启动&#xff08;-s 表示将日志输出到 syslog&#xff09; squid -s停止 Squid # 安全停止&#xff08;需配置 pid_file&#xff09; squid…...

Linux操作系统--进程的概念

目录 1.了解进程前的前景知识 冯诺依曼体系结构 操作系统(OS) 2.进程 2.1进程的概念 2.2描述进程-PCB 2.2.1task_struct 2.3查看进程 2.4通过系统调用获取进程的标识符 2.5认识fork()--创建进程 该专栏会持续更新 更新时间一周一更。下周更新内容进程状态 1.了解进程前…...

C++假期练习

思维导图 牛客练习...

HTML零基础入门笔记:狂神版

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 第1-2章&#xff1a;Java零基础入门笔记&#xff1a;(1-2)入门&#xff08;简介、基础知识&#xff09;-CSDN博客 第3章&…...

算法竞赛备赛——【图论】链式前向星

图论 图的存储方式&#xff1a; 通用的三种&#xff1a;邻接矩阵、邻接表、边集数组 有向图&#xff1a;十字链表 无向图&#xff1a;多重邻接表 刷题常用&#xff1a;邻接矩阵、链式前向星&#xff08;邻接表变形&#xff09; 链式前向星 算法题常用: 邻接矩阵、二维vector模…...

JAVA_类和对象

目录 1.面向对象的初步认知 1.1.什么是面向对象 1.2.面向对象与面向过程 2.类的定义和使用 2.1.简单认识类 2.2类的定义格式 2.3.练习 学生类 动物类&#xff08;可爱猫猫&#x1f431;&#xff09; 3.类的实例化 3.1.什么是实例化 3.2.类和对象的说明 4.this引用…...

高频面试题(含笔试高频算法整理)基本总结回顾65

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

数据库系统-数据库控制

并发控制 事务的ACID特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务包含的所有操作要么全部成功&#xff08;commit提交&#xff09;&#xff0c;要么全部失败&#xff08;rollback回滚&#xff09;一致性&#xff08;Consistency&#xff09;&a…...

Python Cookbook-5.3 根据对象的属性将对象列表排序

任务 需要根据各个对象的某个属性来完成对整个对象列表的排序。 解决方案 DSU方法仍然一如既往地有效: def sort_by_attr(sed,attr):intermed [ (getattr(x,attr),i,x) for i,x in enumerate(seg)]intermed.sort()return [ x[-1] for x in intermed def sort_by_attr_inpl…...

Java MCP SDK 开发笔记(一)

MCP 简介 AI 大模型诞生之初&#xff0c;其高度模拟人的对话之能力惊为天人。但我们肯定不希望止步于此—— 工具化就是我们希望 AI 能够完成的目标&#xff0c;由此可以从单纯的对话发展为代替繁复人力的“干活”。这条道路上毋庸置疑 AI 大模型任重道远。而 MCP(Model Contr…...

AF3 OpenFoldDataLoader类_prep_batch_properties_probs方法解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类的 _prep_batch_properties_probs 方法是为每个批次数据准备 recycling 维度 的概率分布。它将根据配置文件中的设定为每个批次数据生成 recycling 轮次的概率分布,并存储到 prop_probs_tensor 中,用于后续抽样选择特定…...

寻找字符串数组中的最长共同前缀字符串

问题描述&#xff1a;给定一个字符串数组 strs&#xff0c;编写一个函数来找到这些字符串的最长公共前缀字符串&#xff0c;如果没有则返回空字符串"" 算法思路 横向扫描法&#xff1a; 从数组的第一个字符串开始&#xff0c;逐个和后面的字符串比较&#xff0c;逐…...

leetcode_数组 56. 合并区间

56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;int…...

Jenkins学习(B站教程)

文章目录 1.持续集成CI2.持续交付CD3.持续部署4.持续集成的操作流程5.jenkins简介6.后续安装部署&#xff0c;见视频 bilibili视频 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用…...

学习笔记—C++—类和对象(一)

目录 类和对象 类的定义 类定义格式 访问限定符 类域 实例化 实例化概念 对象的大小 this指针 C和C语言实现Stack对比 类和对象 类的定义 类定义格式 ● class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后…...

PyTorch 深度学习 || 6. Transformer | Ch6.3 Transformer 简单案例

1. 简单案例 这个代码是一个简单的 Transformer 模型的实现,这个例子展示了一个基本的序列到序列(seq2seq)任务,比如将一个数字序列转换为另一个数字序列。可以用于学习和理解 Transformer 的基本结构和工作原理。 import torch import torch.nn as nn import math# 位置…...

体育风暴篮球足球体育球员综合资讯网站模板

源码名称&#xff1a;篮球足球体育球员综合资讯网站模板 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 演示地址&#xff1a;https://www.52muban.com/shop/184016.html …...

Visual Studio Code SSH 连接超时对策( keep SSH alive)

文章目录 问题解决方法一&#xff1a;配置服务端关于ClientAliveInterval和ClientAliveCountMax1、打开终端&#xff0c;打开SSH配置文件&#xff1a;输入以下命令&#xff1a;2、打开配置文件后&#xff0c;添加以下内容&#xff1a;3、添加后&#xff0c;Esc按 <Enter>…...

Docker容器中的ubuntu apt update报错 解决办法

问题现象 # apt update Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB] Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] Err:2 http://security.ubuntu.com/ubuntu noble-security InRelease At least one invalid signa…...

CV - 目标检测

物体检测 目标检测和图片分类的区别&#xff1a; 图像分类&#xff08;Image Classification&#xff09; 目的&#xff1a;图像分类的目的是识别出图像中主要物体的类别。它试图回答“图像是什么&#xff1f;”的问题。 输出&#xff1a;通常输出是一个标签或一组概率值&am…...

linux提权 corn 提权

corn提权 corn的基本使用方法 corn的作用就是可以定时的完成一下任务&#xff08;如备份一下log 或者清除一下日志文件 这些就是运维人员用的&#xff09; 先找一下定时任务的工作表 cat /bin/corntab 这个是普通用户 我们直接看都看不了 说明什么说明这个 是root高权限执…...

1Panel安装失败 国内docker安装失败

本文仅针对学习交流&#xff0c;只为了帮助计算机相关专业大学生个人技能实操而记录 非学习目的严禁学习&#xff01;&#xff01;&#xff01;否则后果自负 1、离线安装1Panel&#xff08;不需要手动安装docker&#xff0c;离线安装包里包括了docker&#xff09; 离线包下载地…...

Excel + VBA 实现“准实时“数据的方法

Excel 本身是静态数据处理工具,但结合 VBA(Visual Basic for Applications) 可以实现 准实时数据更新,不过严格意义上的 实时数据(如毫秒级刷新)仍然受限。以下是详细分析: 1. Excel + VBA 实现“准实时”数据的方法 (1) 定时刷新(Timer 或 Application.OnTime) Appl…...

请问你怎么看待测试,指导哪些测试的类型,有用过哪些测试方法?

作为深耕测试领域多年的博主,我始终认为测试是软件质量的守护者,更是推动研发流程优化的催化剂。以下从测试认知、分类体系到实战方法论,结合具体案例为你系统拆解: 一、测试的本质认知 测试≠找 Bug,而是通过系统性验证回答三个核心问题: 软件是否符合用户需求?系统在…...

详解 Redis repl_backlog_buffer(如何判断增量同步)

一、repl_backlog_buffer 复制积压缓冲区&#xff08;Replication Backlog Buffer&#xff09; 是一个环形内存区域&#xff08;Ring Buffer&#xff09;&#xff0c;用于临时保存主节点最近写入的写命令&#xff0c;以支持从节点断线重连后的增量同步。 1.1 三个复制偏移量 …...

工业操作系统国产化替代的战略路径与挑战分析

一、政策背景与战略意义 工信部提出的 2027 年替换 80 万套工业操作系统计划&#xff0c;是中国制造业向智能化转型的核心举措。该政策旨在通过国产化替代&#xff0c;解决工业领域 “缺芯少魂” 的问题&#xff0c;构建自主可控的工业软件生态体系。当前&#xff0c;中国工业操…...

JMeter接口性能测试从入门到精通

前言&#xff1a; 本文主要介绍了如何利用jmter进行接口的性能测试 1.在测试计划中添加线程组 1.1.线程组界面中元素含义 如果点击循环次数为永远&#xff1a; 2.添加HTTP取样器 2.1.填写登录接口的各个参数 2.2.在线程组下面增加查看结果树 请求成功的情况&#xff1a; 请求…...

WinForm真入门(9)——RichTextBox控件详解

WinForm中RichTextBox控件详解&#xff1a;从基础到高级应用 上一文中笔者重点介绍了TextBox控件的详细用法&#xff0c;忘记的 请点击WinForm真入门(8)——TextBox控件详解&#xff0c;那么本文中的RichTextBox与TextBox有什么区别吗&#xff0c;光看名字的话&#xff0c;多了…...