深度解析与实践:HTTP 协议
一、引言
HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 应用程序、API、微服务以及几乎所有互联网通信的核心协议。虽然它是我们日常使用的基础技术,但要深刻理解其高效使用、优化以及如何避免性能瓶颈,我们需要从 工作原理、优化策略、工具 和 最佳实践 等多个角度进行深入分析。
本文将重点讨论 HTTP 协议在实际工作中的应用,帮助开发者理解 HTTP 协议如何在现代 Web 和 API 服务中发挥作用,并提供相关的优化和性能提升建议。
二、HTTP 协议的核心工作原理
HTTP 协议是基于请求/响应模型的客户端-服务器协议。虽然它看起来简单,但其底层的细节直接影响性能和可扩展性。我们将从请求、响应、连接管理等方面进行详细分析。
2.1 HTTP 请求和响应
-
请求结构:
- 请求行:包含 HTTP 方法(GET、POST、PUT 等)、请求的 URL 和协议版本。例如:
GET /index.html HTTP/1.1
- 请求头:包含与客户端和请求相关的元数据,如
User-Agent
、Accept-Language
等。 - 请求体:仅在某些方法(如 POST、PUT)中存在,包含实际数据。
- 请求行:包含 HTTP 方法(GET、POST、PUT 等)、请求的 URL 和协议版本。例如:
-
响应结构:
- 响应行:包含协议版本、状态码和状态描述。例如:
HTTP/1.1 200 OK
- 响应头:包含与服务器和响应相关的元数据,如
Content-Type
、Content-Encoding
等。 - 响应体:实际返回的内容(如 HTML、JSON、图像等)。
- 响应行:包含协议版本、状态码和状态描述。例如:
2.2 连接管理
HTTP 协议采用 TCP 协议进行传输,而每次建立 TCP 连接都需要进行握手,因此优化连接管理是提升性能的关键。
- 长连接(Keep-Alive):HTTP/1.1 默认启用长连接,即同一个 TCP 连接可以用于多个请求/响应周期。避免了在每个请求时建立新的连接,从而减少了延迟和开销。
- 多路复用(HTTP/2):HTTP/2 引入了流的概念,允许多个请求/响应在同一个 TCP 连接中并发进行,解决了 HTTP/1.x 中的队头阻塞问题。
2.3 状态码和缓存
状态码和缓存是 HTTP 协议中至关重要的部分,帮助客户端和服务器管理请求和响应。
-
缓存控制:通过
Cache-Control
头部,服务器可以指定资源的缓存策略。Cache-Control: no-cache
:表示该资源不应缓存。Cache-Control: max-age=3600
:表示该资源可以缓存 3600 秒。
-
状态码:合理的使用 HTTP 状态码可以帮助客户端正确理解响应。
200 OK
:请求成功。404 Not Found
:资源未找到。500 Internal Server Error
:服务器错误。
三、HTTP 协议的优化策略
在实际开发过程中,HTTP 的性能往往会成为瓶颈,尤其是在高并发、高流量的场景下。因此,针对 HTTP 协议的优化至关重要。以下是一些常见的优化手段,帮助你提高 HTTP 请求和响应的效率。
3.1 减少请求的数量
每个 HTTP 请求都伴随有网络延迟和资源消耗,因此减少请求的数量是提升性能的有效策略。以下是一些常见的做法:
-
合并请求:
- CSS 和 JS 文件合并:将多个 CSS 或 JavaScript 文件合并成一个文件,从而减少 HTTP 请求次数。
- 图像雪碧图(Sprite Image):将多个小图标合并成一个大图,从而减少多个图像请求。
-
异步加载:对于某些不需要立即加载的资源(如广告、社交插件等),可以通过 JavaScript 延迟加载,避免阻塞主页面加载。
3.2 使用压缩技术
HTTP 支持数据压缩(如 Gzip 和 Brotli),通过压缩响应体,可以有效减少数据的传输量,提升响应速度。
-
启用 Gzip/Brotli 压缩:在 Web 服务器(如 Nginx、Apache)上启用 Gzip 或 Brotli 压缩,减少响应体的大小。
-
服务器设置:
- Nginx:
gzip on;
- Apache:
SetOutputFilter DEFLATE
- Nginx:
-
缓存压缩后的内容:对于静态资源(如 CSS、JS、HTML 等),压缩后的内容可以缓存,从而避免重复的压缩操作。
3.3 优化 DNS 查询和连接
每个 HTTP 请求都需要先进行 DNS 查询,将域名解析成 IP 地址。如果每次请求都要进行 DNS 查询,会增加延迟。因此,优化 DNS 查询和连接非常重要。
- DNS 预解析:通过在 HTML
<head>
标签中使用<link rel="dns-prefetch" href="//example.com">
,浏览器会提前解析指定的域名,减少 DNS 查询时间。 - 保持 TCP 连接:利用 HTTP/1.1 的长连接和 HTTP/2 的多路复用,减少频繁的连接建立和拆卸。
3.4 采用 HTTP/2 或 HTTP/3
HTTP/2 和 HTTP/3 在 HTTP/1.x 的基础上做了很多优化,可以显著提升性能,特别是在并发请求的场景下。
-
HTTP/2:
- 多路复用:HTTP/2 支持多个请求/响应共享一个 TCP 连接,避免了 HTTP/1.x 中的队头阻塞问题。
- 头部压缩:HTTP/2 使用 HPACK 算法对 HTTP 头进行压缩,减少了带宽消耗。
-
HTTP/3:
- 基于 QUIC 协议:HTTP/3 基于 QUIC 协议,该协议使用 UDP 代替 TCP,减少了连接建立的延迟,尤其适用于高延迟或不稳定的网络环境。
- 零 RTT(0-RTT):QUIC 支持零 RTT 连接,首次连接时可以减少握手的时间。
3.5 优化缓存策略
合理配置 HTTP 缓存策略,不仅可以减少请求次数,还能减轻服务器负担。
-
设置缓存有效期:通过
Cache-Control
头部设置资源的缓存策略。对于静态资源(如图片、JS 文件),可以设置较长的缓存时间;对于动态内容,缓存时间可以设置较短。Cache-Control: max-age=86400
:表示缓存 24 小时。Cache-Control: no-store
:表示不缓存任何数据。
-
ETag 与 If-None-Match:ETag 是一个服务器生成的文件标识符,当文件内容未变化时,客户端可以通过
If-None-Match
请求头告诉服务器使用缓存的资源,从而避免无谓的下载。
四、HTTP 的高级实践与常见问题
4.1 跨域问题(CORS)
在开发 Web 应用时,跨域问题(CORS,跨源资源共享)是一个常见的挑战。为了允许跨域请求,服务器需要正确配置 Access-Control-Allow-Origin
头。
- 设置 CORS 头部:服务器可以设置 CORS 相关的 HTTP 头部,允许来自指定域的请求。
Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: Content-Type
4.2 Cookie 和 Session 管理
-
Cookie:用于在客户端存储信息,可以在 HTTP 请求中发送。需要注意的是,Cookie 会增加请求头的大小,因此不宜存储过多数据。
Set-Cookie
:服务器通过该头部向客户端发送 Cookie。Cookie
:客户端发送 Cookie 给服务器。
-
Session:通常与 Cookie 一起使用,Session 存储在服务器端,客户端通过 Cookie 存储 Session ID 来实现会话管理。
4.3 防止 DoS 和 DDoS 攻击
HTTP 协议面临的一个常见安全问题是 DoS(Denial of Service)和 DDoS(Distributed Denial of Service)攻击。为了减轻这种攻击的影响,可以采取以下措施:
- 限制请求频率:通过限制每个 IP 地址的请求频率,防止单个用户过多的请求占用服务器资源。
- 使用 Web 防火墙:部署 WAF(Web Application Firewall)来过滤恶意请求。
五、实践指导
HTTP 协议不仅是互联网通信的基石,也是构建高效、安全 Web 应用和服务的关键。通过深入理解 HTTP 协议的工作原理和各种优化策略,开发者可以显著提升系统的性能、稳定性和安全性。
在现代 Web 开发中,HTTP 协议不仅仅是一个简单的请求和响应模型。它涉及到多方面的考量,包括请求优化、连接管理、安全防护、API 设计等多个层面。通过实践中使用的一些优化策略,例如减少请求次数、启用压缩、优化缓存策略以及采用 HTTPS 加密,开发者可以有效降低延迟、提高响应速度并增强系统的安全性。
对于 Web 应用的开发者而言,理解 HTTP 协议及其优化的核心概念,不仅能帮助提升性能,也能让你更有能力在面对复杂系统架构时做出更加合理的设计选择。无论是在微服务架构中优化跨服务的通信,还是在客户端-服务器通信中减少带宽消耗和延迟,精通 HTTP 协议的各种细节和高级特性都是实现高效、可扩展系统的关键。
要在实际应用中落实这些知识,我们建议开发者不仅要具备基础的 HTTP 理解,还要学会如何通过工具(如 Nginx、API 网关等)和技术(如 HTTP/2、WebSocket、TLS 等)来进一步优化和增强应用的整体表现。通过不断测试和调整,确保你的应用能够在高并发和高流量的环境中稳定运行,最终为用户提供更加流畅和安全的体验。
HTTP 协议并不仅仅是一个技术细节,它是构建现代 Web 应用程序的基础。在深入理解其原理后,开发者可以更好地应对网络通信中的挑战,并设计出性能优越且安全可靠的系统架构
六、HTTP 协议的安全性与加密
在现代 Web 开发中,HTTP 协议的安全性至关重要。随着互联网安全问题的日益严峻,简单的 HTTP 已经无法满足保护用户数据和隐私的需求。因此,HTTP 的加密版本 HTTPS(即通过 TLS 加密的 HTTP)应当成为 Web 应用的标准。
6.1 HTTPS 与 HTTP 的区别
HTTPS(Hypertext Transfer Protocol Secure)是在 HTTP 协议的基础上引入了加密机制,通过 TLS(Transport Layer Security) 或 SSL(Secure Sockets Layer) 协议来确保数据的机密性和完整性。主要区别包括:
- 加密:HTTPS 使用 SSL/TLS 加密传输数据,确保数据在传输过程中不被窃取或篡改。
- 认证:HTTPS 通过 SSL/TLS 证书提供服务器的身份验证,避免中间人攻击(Man-in-the-Middle)。
- 完整性:HTTPS 通过哈希算法(如 HMAC)确保数据在传输过程中没有被篡改。
6.2 HTTPS 的工作原理
- 客户端发起连接:客户端向服务器发送一个加密请求,要求建立 HTTPS 连接。
- SSL/TLS 握手:服务器与客户端通过 SSL/TLS 握手协议确定加密算法、生成会话密钥等。
- 服务器返回证书,证明其身份。
- 客户端验证服务器的证书,确保它来自信任的证书颁发机构(CA)。
- 双方交换密钥,用于加密后续的数据传输。
- 数据加密传输:一旦建立了安全的连接,客户端和服务器就可以安全地交换数据。
- 断开连接:数据传输完毕后,双方可以关闭连接。
6.3 启用 HTTPS 的实践
- 获取 SSL/TLS 证书:为确保 HTTPS 的安全性,网站需要从可信的证书颁发机构(CA)购买或获取免费的证书(如 Let’s Encrypt)。
- 配置 Web 服务器:大多数 Web 服务器(如 Nginx、Apache、Tomcat 等)都支持 HTTPS 配置。配置过程通常包括:
- 配置 SSL 证书和私钥。
- 强制使用 TLS 1.2 或 TLS 1.3 协议。
- 禁止使用已知的弱加密算法(如 SSLv2、SSLv3、TLS 1.0 等)。
6.4 强制 HTTPS(HTTP Strict Transport Security,HSTS)
HSTS 是一种 HTTP 头部机制,强制客户端仅使用 HTTPS 与服务器通信,避免恶意用户通过 HTTP 攻击中间人(MITM)对通信进行篡改。
- 启用 HSTS:服务器可以通过
Strict-Transport-Security
头部来启用 HSTS。
这个头部表示客户端在接下来的 365 天内只通过 HTTPS 与服务器通信。Strict-Transport-Security: max-age=31536000; includeSubDomains
6.5 防止 HTTP 走私(HTTP Smuggling)与 HTTPS 混合内容
- HTTP 走私:攻击者通过发送恶意构造的 HTTP 请求,绕过 Web 服务器的正常处理逻辑,获取未授权的资源。为了防止这种攻击,建议仔细检查请求格式和代理配置。
- HTTPS 混合内容:在 HTTPS 页面中引用 HTTP 资源会导致浏览器警告或阻止加载。为了避免混合内容问题,确保页面中所有资源都通过 HTTPS 加载,避免加载不安全的资源。
七、HTTP 协议与现代 Web 应用架构
随着微服务架构、单页应用(SPA)、移动应用和 RESTful API 的普及,HTTP 协议的应用场景变得更加复杂和多样化。针对不同应用场景,我们可以在 HTTP 协议的基础上构建出灵活、可扩展的架构。
7.1 RESTful API 与 HTTP
在 Web 开发中,RESTful API 是一种非常流行的架构风格,它通过 HTTP 协议实现不同服务之间的通信。RESTful API 基于 HTTP 的方法(如 GET、POST、PUT、DELETE 等),并要求 API 设计遵循一定的规范和约定。
-
HTTP 方法与资源操作:
GET
:用于读取资源。POST
:用于创建资源。PUT
:用于更新资源。DELETE
:用于删除资源。
-
资源的表示:在 RESTful API 中,资源通常以 JSON 或 XML 格式表示,服务器根据客户端的请求返回相应的资源。
-
无状态性:RESTful API 是无状态的,这意味着每个请求都应当携带所有必要的认证信息、请求数据和请求上下文。
7.2 WebSocket 与 HTTP 的关系
WebSocket 是一种与 HTTP 协议兼容的协议,旨在实现全双工通信。它适用于需要实时通信的应用场景,如在线游戏、即时通讯、股票交易等。
- WebSocket 握手:WebSocket 建立连接时,客户端通过 HTTP 发起一个升级请求(
Upgrade
请求头)来升级为 WebSocket 协议。一旦建立连接,客户端和服务器可以通过 WebSocket 协议进行双向数据传输。 - 性能优势:与 HTTP/2 或 HTTP/3 不同,WebSocket 提供了更加高效的长连接传输,避免了 HTTP 请求和响应的开销,适用于高频交互的场景。
7.3 微服务架构中的 HTTP
在微服务架构中,各个服务通过 HTTP 协议(通常是 HTTP/2 或 gRPC)进行通信。为了提高性能和可扩展性,微服务架构通常采用以下模式:
- API 网关:API 网关充当客户端与后端微服务之间的中介,负责请求路由、负载均衡、安全性、认证和授权等功能。
- 服务发现与负载均衡:微服务架构中通常使用服务注册和发现机制(如 Consul、Eureka)来动态发现服务实例,并通过负载均衡算法(如轮询、加权轮询等)分配请求。
7.4 反向代理与负载均衡
HTTP 反向代理服务器(如 Nginx、HAProxy)通常用来分发客户端的请求到多个后端服务器。通过负载均衡,反向代理可以分担流量负载,提升系统的可扩展性和容错能力。
-
负载均衡算法:
- 轮询:将请求均匀分配到各个服务器。
- 最少连接数:将请求分配给连接数最少的服务器。
- 加权轮询:根据各个服务器的权重(如处理能力)分配请求。
-
SSL 终止:反向代理服务器还可以处理 SSL/TLS 终止,即解密 HTTPS 请求,然后将其以 HTTP 形式转发到后端服务,从而减轻后端服务器的负担。
八、常见 HTTP 性能问题及调试技巧
8.1 HTTP 请求延迟
请求延迟是性能优化中的关键问题之一。常见的延迟来源包括 DNS 解析、TCP 连接建立、TLS 握手等。
- DNS 优化:通过 DNS 预解析、使用 CDN 缓存 DNS 记录等方式减少 DNS 查询时间。
- TCP 连接优化:使用 HTTP/2 多路复用、持久连接等方式减少 TCP 握手次数。
- TLS 握手优化:启用 SSL 会话缓存或会话票据(Session Tickets)来减少 TLS 握手的延迟。
8.2 网络带宽限制
当网络带宽有限时,大量数据的传输可能导致 HTTP 请求和响应变慢。
- 启用压缩:通过启用 Gzip 或 Brotli 压缩来减少响应体的大小。
- 分块传输:使用 HTTP 的分块传输编码(Chunked Transfer Encoding),将大文件分成多个块进行传输,减少等待时间。
8.3 HTTP 请求失败
HTTP 请求失败通常与网络问题、服务器错误、请求头过大等因素有关。
- 监控和日志:通过集成监控工具(如 Prometheus、Grafana)和日志系统(如 ELK Stack)实时跟踪 HTTP 请求的成功率和失败原因。
- 请求重试:针对临时故障的请求,设计合理的重试机制,避免因网络波动导致的请求失败。
九、结语
HTTP 协议作为 Web 的基础协议,贯穿了从前端到后端、从请求到响应、从客户端到服务器的所有通信。虽然 HTTP 协议本身简单易懂,但要在现代 Web 和微服务架构中高效、安全地使用它,
相关文章:
深度解析与实践:HTTP 协议
一、引言 HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 应用程序、API、微服务以及几乎所有互联网通信的核心协议。虽然它是我们日常使用的基础技术,但要深刻理解其高效使用、优化以及如何避免性能瓶颈,我…...

Zookeeper是如何解决脑裂问题的?
大家好,我是锋哥。今天分享关于【Zookeeper是如何解决脑裂问题的?】面试题。希望对大家有帮助; Zookeeper是如何解决脑裂问题的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper 通过一系列的机制来防止和解决脑裂(sp…...

《Opencv》基础操作详解(5)
接上篇:《Opencv》基础操作详解(4)-CSDN博客 目录 接上篇:《Opencv》基础操作详解(4)-CSDN博客 25、轮廓近似 简介 接口用法 参数说明 返回值 代码示例 结果展示 26、轮廓最小外接圆 简介 接口用…...
AI大模型-提示工程学习笔记2
卷首语:我所知的是我自己非常无知,所以我要不断学习。 写给AI入行比较晚的小白们(比如我自己)看的,大神可以直接路过无视了。 提示词要素 提示词由以下几个要素组成: 指令:告诉模型需要完成什…...
AWS ELB基础知识
1.负载均衡器的类型 需要了解三种类型的 ELB: Application Load Balancer (ALB) **: 在 HTTP/HTTPS 层(OSI 模型的第 7 层)运行。非常适合路由 HTTP/HTTPS 流量。支持高级路由功能,例如基于 U…...

我用Ai学Android Jetpack Compose之Text
这篇开始学习各种UI元素,答案来自 通义千问,通义千问没法生成图片,图片是我补充的。 下述代码只要复制到第一个工程,做一些import操作,一般import androidx.compose包里的东西,即可看到预览效果。完整工程代…...

Robot---奇思妙想轮足机器人
1 背景 传统机器人有足式、轮式、履带式三种移动方式,每种移动方式都有各自的优缺点。轮式机器人依靠车轮在地面上移动,能源利用率高、移动速度快,但是仅以轮子与地面接触,缺乏越障能力和对复杂地形的适应能力,尤其面对…...

springcloud 介绍
Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合,它提供了一套完整的工具集,用于快速构建分布式系统。在Spring Cloud的架构中,服务被拆分为一系列小型、自治的微服务,每个服务运行在其独立的进程中,并通过…...
【STM32】I2C为什么要开漏输出和上拉电阻
为什么需要使用开漏输出 防止短路:假设使用推挽结构,多个设备挂在同一总线上,当存在某一设备将某一信号驱动为高电平,而其他设备驱动为低电平,会导致短路,导致器件损坏或降低寿命。对于开漏结构࿰…...

【从零开始入门unity游戏开发之——C#篇44】C#补充知识——var隐式类型、初始化器、匿名类型
文章目录 一、var隐式类型1、var 的基本用法2、注意3、总结 二、初始化器1、类定义2、对象初始化器3、集合初始化3.1 数组初始化3.2 List<T> 初始化3.3 Dictionary<TKey, TValue> 初始化 三、匿名类型1、示例代码2、匿名类型的限制: 专栏推荐完结 一、v…...
Spring Boot 中 TypeExcludeFilter 的作用及使用示例
在Spring Boot应用程序中,TypeExcludeFilter 是一个用于过滤特定类型的组件,使之不被Spring容器自动扫描和注册为bean的工具。这在你想要排除某些类或类型(如配置类、组件等)而不希望它们参与Spring的自动装配时非常有用。 作用 …...
解锁kafka组件安全性解决方案:打造全方位安全防线
文章目录 前言安全漏洞修复权限管理身份验证数据传输数据存储 前言 Kafka组件的安全性解决方案旨在保护Kafka集群免受未经授权访问、数据泄露、知识产权问题和竞争法问题的侵害。提高开源中间件的安全性和稳定性,包括安全漏洞修复、权限管理、身份验证等方面的内容…...

【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
目录😋 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务:编写一个程序求图的最小生成树。 相关知识 为了完成…...
Java(1)入门基础
1. Java简介 1.1 什么是Java Java 是一款由Sun Microsystems公司(现为甲骨文公司Oracle Corporation的一部分)的James Gosling及其团队在1995年发布的高级编程语言。同时,Java 是一种面向对象的语言,这意味着它允许开发者通过创…...
2024.1.5总结
今日不开心:这周本来想花点时间学习的,没想到全都花在刷视频,外出消费去了。 今日思考: 1.找对象这件事确实不能强求,顺其自然吧,单身和不单身,其实,各有各的利弊。在一次坐地铁的过程中,我一…...

【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、循环控制 / 跳转语句的使用 1. 循环控制语句(for 循环) 2. 循环控制语句(while 循环) 3. 跳转语句(break 语句) 4. 跳转语句(continue 语句&…...
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法 1. GrpcChannel 的概念 GrpcChannel 是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接,支持多路复用,即通过单个通道可以发送多…...
Linux中的tty和pts概念和区别
目录 1、什么是tty (1)tty的概念 (2)tty0 (3)tty1~6 2、什么是pts (1)pts的含义 (2)pts的具体解释 3、pts与 tty 设备的比较 4、设备文件的位置 1、什…...
【SOC 芯片设计 DFT 学习专栏 -- RTL 中的信号名和 Netlist 中的信号名差异】
Overview 本文将介绍 soc 设计中 RTL-to-Netlist 映射及 RTL 中的信号名和 Netlist 中的信号名差异, 在 SoC设计中,RTL-to-Netlist映射 是从RTL(Register Transfer Level)代码转换为Netlist的过程。这通常涉及将用硬件描述语言&…...

机器学习经典算法——线性回归
目录 算法介绍 一元线性回归模型 多元线性回归模型 误差项分析 相关系数 算法案例 一元线性回归预测——广告销售额案例 二元线性回归预测——血压收缩案例 多元线性回归预测——糖尿病案例 算法介绍 线性回归是利用数理统计中回归分析,来确定两种或两种…...

leetcode刷题日记——1.组合总和
解答: class Solution { public:void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int idx) {if(idxcandidates.size()){//遍历完的边界return;}if(target0){//找完了能组成和…...
Nginx+Tomcat负载均衡集群
目录 一、Tomcat 基础与单节点部署 (一)Tomcat 概述 (二)单节点部署案例 1. 案例环境 2. 实施准备 3. 安装 JDK 4. 查看 JDK 安装情况 5. 安装配置 Tomcat 6. 启动 Tomcat 7. 访问测试 8. 关闭 Tomcat (三…...

Harmony核心:动态方法修补与.NET游戏Mod开发
一、Harmony的核心定位与设计哲学 Harmony是一个运行时动态方法修补库,专为修改已编译的.NET/Mono应用程序而设计,尤其适用于游戏Mod开发。其核心创新在于: 非破坏性修改:保留原始方法完整性,避免直接替换或覆盖。多…...

使用矩阵乘法+线段树解决区间历史和问题的一种通用解法
文章目录 前言P8868 [NOIP2022] 比赛CF1824DP9990/2020 ICPC EcFinal G 前言 一般解决普通的区间历史和,只需要定义辅助 c h s − t ⋅ a chs-t\cdot a chs−t⋅a, h s hs hs是历史和, a a a是区间和, t t t是时间戳,…...
Protobuf 中的类型查找规则
a.proto syntax "proto2"; //protoc3生成代码兼容proto2语法 package pkgA; message Example { }ba.proto package pkgB.pkgA; message Example { }b.proto syntax "proto3"; //protoc3生成代码兼容proto2语法 package pkgB; import "test1/a.pr…...

Vue3学习(4)- computed的使用
1. 简述与使用 作用:computed 用于基于响应式数据派生出新值,其值会自动缓存并在依赖变化时更新。 缓存机制:依赖未变化时直接返回缓存值,避免重复计算(通过 _dirty 标志位实现)。响应式更新&…...
如何从零开始建设一个网站?
当你没有建站的基础和建站的知识,那么应该如何开展网站建设和网站管理。而今天的教程是不管你是为自己建站还是为他人建站都适合的。本教程会指导你如何进入建站,将建站的步骤给大家分解: 首先我们了解一下,建站需要那些步骤和流程…...

SDC命令详解:使用set_propagated_clock命令进行约束
相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定端口列表/集合 简单使用 注意事项 传播时钟是在进行了时钟树综合后,使用set_propagated_clock命令可以将一个理想时钟转换为传播时钟&#x…...

React 第五十二节 Router中 useResolvedPath使用详解和注意事项示例
前言 useResolvedPath 是 React Router v6 提供的一个实用钩子,用于解析给定路径为完整路径对象。 它根据当前路由上下文解析相对路径,生成包含 pathname、search 和 hash 的完整路径对象。 一、useResolvedPath 核心用途 路径解析:将相对…...
Prompt Engineering Notes
TOC LLM output configurationOutput length LLM output configuration Output length 仅仅起到截断作用,不会让模型的输出更简洁。...