HTTP的前世今生:如何塑造现代互联网的交互方式?
一、关于HTTP
1.1 简介
“没有HTTP协议,就没有今天的互联网。”
从简单的文本传输到支撑全球数十亿设备的实时交互,HTTP协议始终是Web世界的核心纽带。本文将深入剖析其设计思想、演进历程及底层工作原理。
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。它构成了我们浏览网页时客户端与服务器之间数据通信的基础。HTTP是在1990年代初期由蒂姆·伯纳斯-李发起的,目的是为了促进信息的共享和传输,特别是超文本文档。
学习 HTTP 协议是理解现代互联网和开发 Web 应用的核心基础,以下是学习的核心原因:
- Web 开发的底层基石
- HTTP 是浏览器与服务器通信的“通用语言”,所有网页、API、云服务都依赖它传输数据。
- 无论是前端调用接口(如
fetch
、axios
),还是后端处理请求(如 Spring、Django),都需要理解 HTTP 的规则。
- 优化性能的必要知识
- 缓存机制:通过
Cache-Control
、ETag
等头部字段优化资源加载速度,减少重复请求。- HTTP/2 和 HTTP/3:学习多路复用、头部压缩等特性,提升高并发场景下的传输效率。
- 减少延迟:理解持久连接(Keep-Alive)、分块传输(Chunked Encoding)等技术原理。
3.构建和设计 API 的基础
- RESTful API 设计:基于 HTTP 方法(GET/POST/PUT/DELETE)和状态码规范设计接口。
- 数据格式协商:通过
Accept
和Content-Type
头部支持 JSON、XML 等不同数据格式。- 版本控制:利用 HTTP 头部(如
Accept-Version
)或 URL 路径管理 API 版本迭代。4.理解现代技术的底层逻辑
- 框架和库的底层原理:无论是 Express(Node.js)、Flask(Python)还是 Spring Boot(Java),本质都是对 HTTP 协议的封装。
- 云原生和微服务:服务间通信(如 gRPC、REST)依赖 HTTP/2 等协议优化性能。
- WebSocket 和 Server-Sent Events (SSE) :理解它们如何基于 HTTP 协议实现长连接和实时通信。
1.2 发展
1.2.1 产生背景
HTTP协议的产生与互联网早期信息共享的需求及超文本技术的发展密切相关,其背景可概括为以下几个关键点:
互联网的雏形与早期发展
20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,这被认为是互联网的起源。70 年代,研究人员基于对 ARPA 网的实践和思考,发明出了著名的 TCP/IP 协议,该协议具有良好的分层结构和稳定的性能,并在 80 年代中期进入了 UNIX 系统内核,促使更多的计算机接入了网络。
万维网的构想与需求
20世纪80年代末,欧洲核子研究中心(CERN)的科学家们需要高效共享海量研究文档,但传统方式(如邮件、FTP)存在以下问题:
- 文档分散在不同计算机中,访问需手动输入路径。
- 格式不统一(如纯文本、专有格式),难以跨平台阅读。
- 缺乏动态关联性,无法通过链接直接跳转相关内容。
1989 年,当时在 CERN 工作的蒂姆·伯纳斯-李(Tim Berners-Lee) 博士写了一份关于建立一个通过网络传输超文本系统的报告,提出了一种能让远隔两地的研究者们共享知识的设想,最初设想的基本理念是:借助多文档之间相互关联形成的超文本(HyperText),连成可相互参阅的 WWW(World Wide Web,万维网)。
蒂姆最初的提议。图片来源:欧洲核子研究中心
为实现这一目标,他同时设计了:
- HTTP(传输协议):定义客户端与服务端的通信规则。
- HTML(超文本标记语言):统一文档格式,支持超链接嵌入。
- URL(统一资源定位符):为网络资源提供唯一地址标识。
HTML让我们看到丰富的网页,包含文字,图片,视频等等,而URL指明了文档所在地址,告诉客户端资源在哪个位置,而HTTP是应用层的协议,提供一种发布和接收HTML页面的方法。
此外 Tim 还编写了第一个网页编辑器/浏览器(“WorldWideWeb.app”)和第一个 Web 服务器(“httpd”)。至此 Tim 初步完成了他的设想的所有技术实现,且第一批服务器已经在 1991年初在 CERN 以外的地方运行了,1991 年 8 月 16 日,Tim Berners-Lee 在公开的超文本新闻组上发表的文章被视为是万维网公共项目的开始。
1990年12月25日,蒂姆和法国网络高手罗伯特·卡里奥(Robert Cailliau)在西欧高能物理中心(CERN)一起成功地通过互联网展现了基于Web原理的HTTP代理与服务器的第一次通讯。短短的时间内,这项技术推广到了全世界。
蒂姆·伯纳斯·李用这张图说明了WWW的创意,使原来不同计算机上的信息无法沟通,而现在可以用任何一台计算机对任何Web服务器上的信息库进行调用。
万维网(互联网)之父—蒂姆·伯纳斯-李(Tim Berners-Lee)
蒂姆·伯纳斯-李(Tim Berners-Lee),1955年6月8日出生于英国,是一位杰出的计算机科学家,被誉为“万维网之父”。1976年,年轻的伯纳斯-李从牛津大学毕业后,成为了欧洲核子研究中心(CERN)的一名软件工程师。
他的杰出贡献在于发明了万维网,并创造了第一个浏览器,为互联网的扩展奠定了基础。2017年,他因这一伟大发明荣获图灵奖。
伯纳斯-李不仅在技术上有着卓越的成就,还在学术界和科研机构中担任要职。他是英国皇家学会工艺院院士,曾担任麻省理工学院计算机科学及人工智能实验室的创办主席及高级研究员。此外,他还担任网页科学研究倡议会的总监,以及麻省理工学院集体智能中心咨询委员会成员。
1990年12月25日,伯纳斯-李与罗伯特·卡里奥在CERN成功实现了HTTP代理与服务器之间的首次通讯,这标志着万维网的诞生。为了推动万维网的发展,他创办了万维网联盟(W3C),并担任主席一职。同时,他也是万维网基金会的创始人。
伯纳斯-李的贡献得到了广泛的认可。2004年,英女皇伊丽莎白二世向他颁发了不列颠帝国勋章的爵级司令勋章。2009年4月,他成为美国国家科学院的外籍院士。2012年夏季奥林匹克运动会开幕典礼上,他获得了“万维网发明者”的美誉,并在开幕式上亲自操作一台NeXT计算机,通过Twitter发表了“This is for everyone”的消息,体育馆内的LCD光管随即显示出文字来。
1.2.2 HTTP 版本
HTTP协议自诞生以来,经历了多个版本的迭代,逐步解决了性能、安全性和扩展性等问题。以下是其发展历程的关键节点和核心改进:
1. HTTP/0.9(1991年)
-
背景:HTTP最初由蒂姆·伯纳斯-李(Tim Berners-Lee)在1991年设计,是为了满足万维网(WWW)初期需求的一个简单协议。
-
特点:
- 仅支持
GET
方法,无请求头/响应头。 - 响应直接返回纯文本内容(无状态码、无错误处理)。
- 仅支持
-
示例:
GET /index.html
<html>...</html>
-
局限性:功能极度简单,无法传输多媒体或复杂数据。
2. HTTP/1.0(1996年,RFC 1945)
-
核心改进:
- 引入请求头/响应头(如
Content-Type
、User-Agent
)。 - 支持多种HTTP方法(GET、POST、HEAD)。
- 定义状态码(200、404等)和版本号标识(如
HTTP/1.0
)。 - 支持非HTML内容(如图片、文件)。
- 引入请求头/响应头(如
-
示例:
GET /image.jpg HTTP/1.0 User-Agent: Mozilla/4.0 Accept: image/jpeg
-
问题:短连接(每个请求需新建TCP连接),性能低下。
3. HTTP/1.1(1997年,RFC 2068 → RFC 2616 → RFC 7230系列)
-
核心改进:
- 持久连接(Keep-Alive) :默认复用TCP连接,减少握手开销。
- 管道化(Pipelining) :允许连续发送多个请求(但响应需按顺序返回,易引发队头阻塞)。
- 分块传输编码(Chunked Encoding) :支持流式传输动态内容。
- 新增方法:
PUT
、DELETE
、OPTIONS
、TRACE
。 - 增强缓存控制(
Cache-Control
、ETag
)。 - 支持虚拟主机(
Host
头部)。
-
问题:
- 队头阻塞(Head-of-Line Blocking)未彻底解决。
- 头部冗余(未压缩)导致带宽浪费。
4. HTTPS(1994年 → 广泛应用)
-
背景:HTTP明文传输不安全,需加密和身份验证。
-
核心机制:
- 基于SSL/TLS协议,默认端口443。
- 混合加密(非对称加密交换密钥 + 对称加密传输数据)。
- 数字证书验证服务器身份。
-
影响:成为现代Web安全的基石。
5. HTTP/2(2015年,RFC 7540)
-
核心改进:
- 多路复用(Multiplexing) :单个连接并发传输多个请求/响应,彻底解决队头阻塞。
- 头部压缩(HPACK) :减少冗余头部数据。
- 服务器推送(Server Push) :主动推送客户端可能需要的资源(如CSS/JS)。
- 二进制分帧层:将报文分解为二进制帧,提升解析效率。
-
局限:
- 仍依赖TCP协议,网络拥塞或丢包时性能下降。
- 服务器推送实际应用较少(需谨慎控制资源推送)。
6. HTTP/3(2022年,RFC 9114)
-
核心改进:
- 基于QUIC协议:使用UDP代替TCP,解决TCP队头阻塞和握手延迟。
- 0-RTT连接:首次连接即可携带数据,降低延迟。
- 连接迁移:网络切换(如WiFi转4G)时保持连接不断开。
- 集成TLS 1.3加密,安全性更强。
-
优势场景:高丢包网络(如移动端)、实时通信(如视频会议)。
版本演进对比
特性 | HTTP/1.1 | HTTP/2 | HTTP/3 |
---|---|---|---|
传输层协议 | TCP | TCP | QUIC(基于UDP) |
连接复用 | 支持(Keep-Alive) | 多路复用 | 多路复用 + 独立流 |
头部压缩 | 无 | HPACK | QPACK |
队头阻塞 | 存在(TCP层面) | 存在(TCP丢包时) | 完全解决 |
握手延迟 | 高(3-RTT) | 中等(TLS 1.2+) | 低(0-RTT或1-RTT) |
网络适应性 | 弱 | 较强 | 极强(抗丢包、切换网络) |
未来趋势
- HTTP/3普及:逐步替代HTTP/2,尤其在移动网络和实时场景。
- 协议简化:如HTTP/3的QUIC协议将传输与加密深度整合。
- 边缘计算支持:适应低延迟的物联网(IoT)和边缘设备。
- 增强安全性:强制HTTPS、淘汰弱加密算法(如TLS 1.2→1.3)。
1.3 特点
- 无状态性:每个请求都是独立的,服务器不保存客户端的状态信息。每次请求都需要包含完整的信息,不依赖于之前的请求。
- 无连接性:每个请求完成后,连接会被关闭,除非在 HTTP/1.1 中通过使用 Keep-Alive 机制保持连接。
- 简单性:HTTP 协议非常简单,易于实现。客户端通过发送请求和接收响应来进行通信。
- 支持多种数据格式:HTTP 协议支持传输多种数据格式,如 HTML、XML、JSON、图片(JPG、PNG)、音频、视频等。
1.4 应用场景
- Web浏览:浏览器加载HTML/CSS/JS。
- RESTful API:前后端数据交互(JSON/XML格式)。
- 文件传输:大文件分块上传/下载(如
Content-Range
)。 - 实时通信:结合WebSocket协议实现双向通信。
二、工作原理
HTTP(超文本传输协议)是客户端与服务器之间进行数据通信的核心协议,其工作原理基于请求-响应模型,并依赖底层协议(如TCP/IP)实现可靠传输。以下是其工作原理的详细分解:
1. 通信基础:TCP/IP 连接
HTTP作为应用层协议,依赖传输层的TCP协议(HTTP/3开始使用QUIC协议)建立可靠连接:
-
三次握手建立连接(以HTTP/1.1为例):
- 客户端发送
SYN
包 → 服务器响应SYN-ACK
→ 客户端回复ACK
。 - 建立TCP连接后,HTTP通信开始。
- 客户端发送
-
数据传输:HTTP报文通过TCP连接传输,确保数据顺序和完整性。
-
四次挥手释放连接(非持久连接时):
- 客户端或服务器发送
FIN
→ 对方回复ACK
→ 反向发送FIN
→ 最终确认关闭。
- 客户端或服务器发送
2. HTTP 请求-响应流程
以访问 http://www.example.com/index.html
为例:
步骤1:客户端发送请求
-
请求行:定义方法、资源路径和协议版本。
GET /index.html HTTP/1.1
-
请求头:附加客户端信息和服务要求。
Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html
-
请求体:仅在某些方法(如POST、PUT)中携带数据(如表单内容)。
步骤2:服务器处理请求
- 解析请求:服务器解析请求行和头部,确定请求的资源和方法。
- 查找资源:根据URL路径在服务器文件系统或数据库中查找资源。
- 业务逻辑处理:可能需要执行脚本(如PHP、Node.js)或访问数据库。
步骤3:服务器返回响应
-
状态行:包含协议版本、状态码和状态描述。
HTTP/1.1 200 OK
-
响应头:描述资源属性或服务器指令。
Content-Type: text/html Content-Length: 1234 Cache-Control: max-age=3600
-
响应体:实际返回的数据(如HTML、JSON、图片等)。
<html>...</html>
步骤4:客户端处理响应
- 解析响应:浏览器根据
Content-Type
渲染内容(如HTML转为页面,JSON用于JavaScript处理)。 - 执行附加操作:如加载嵌入的资源(CSS、JS、图片),触发新的HTTP请求。
3. 关键机制详解
(1) 无状态性与状态管理
-
无状态:HTTP协议本身不记录之前的请求信息。
-
状态管理技术:
- Cookie:服务器通过
Set-Cookie
头部在客户端存储会话标识。 - Session:服务器端存储用户数据,通过Cookie中的Session ID关联。
- Token:JWT等令牌机制,在请求头(如
Authorization: Bearer <token>
)中传递身份信息。
- Cookie:服务器通过
(2) 连接管理
-
短连接(HTTP/1.0) :每个请求需新建TCP连接,效率低下。
-
持久连接(HTTP/1.1默认) :
- 复用TCP连接处理多个请求,通过
Connection: Keep-Alive
控制。 - 管道化(Pipelining):客户端可连续发送多个请求(但服务器需按顺序响应,易引发队头阻塞)。
- 复用TCP连接处理多个请求,通过
-
HTTP/2 多路复用:单个连接上并行传输多个请求/响应,彻底解决队头阻塞。
(3) 缓存机制
-
强缓存:
Cache-Control: max-age=3600
:资源有效期(秒)。Expires: Wed, 21 Oct 2024 07:28:00 GMT
:过期时间(HTTP/1.0)。
-
协商缓存:
Last-Modified
(资源最后修改时间)与If-Modified-Since
对比。ETag
(资源唯一标识)与If-None-Match
对比。- 若未修改,服务器返回
304 Not Modified
,减少数据传输。
(4) 安全传输(HTTPS)
-
加密流程:
- TCP三次握手后,进行TLS握手(交换加密协议版本、生成会话密钥)。
- 服务器发送数字证书,客户端验证其合法性。
- 使用对称加密(如AES)传输HTTP数据。
-
头部变化:HTTPS在应用层与TCP之间加入TLS层,HTTP报文内容被加密。
4. 不同版本的核心差异
特性 | HTTP/1.1 | HTTP/2 | HTTP/3 |
---|---|---|---|
传输协议 | TCP | TCP | QUIC(基于UDP) |
连接复用 | 持久连接(串行) | 多路复用(并行流) | 多路复用 + 独立流 |
头部压缩 | 无 | HPACK | QPACK |
队头阻塞 | 存在(TCP丢包影响所有请求) | 存在(TCP层面) | 完全消除 |
握手延迟 | 高(3-RTT) | 中等(TLS 1.2+) | 低(0-RTT或1-RTT) |
5. 实际场景示例
场景:浏览器加载一个网页
-
HTML请求:获取主HTML文件。
-
解析HTML:发现需要加载CSS、JS、图片等资源。
-
并发请求(HTTP/2+):
- 浏览器并行发起多个资源请求,复用同一连接。
- 服务器通过Server Push主动推送关键资源(如CSS)。
-
渲染页面:所有资源加载完成后,组合渲染为完整页面。
总结
HTTP协议通过以下核心机制实现高效通信:
- 分层设计:依赖TCP/IP处理传输细节,专注应用层逻辑。
- 请求-响应模型:简洁的客户端发起、服务器响应的交互模式。
- 可扩展性:通过头部字段(如
Cache-Control
、Content-Type
)适应多样化需求。 - 持续演进:从HTTP/1.1的持久连接到HTTP/3的QUIC协议,不断优化性能与安全。
HTTP协议不仅是技术的载体,更是互联网开放精神的象征。从实验室的简单文本传输,到支撑全球数十亿设备的实时交互,其演进史映射了人类对高效连接与安全协作的不懈追求。未来,随着HTTP/3普及与物联网崛起,它将继续在速度、可靠性与隐私保护中寻找平衡,为数字世界铺设更智能的通信基石。理解HTTP,便是理解现代互联网的基因与未来。
相关文章:

HTTP的前世今生:如何塑造现代互联网的交互方式?
一、关于HTTP 1.1 简介 “没有HTTP协议,就没有今天的互联网。” 从简单的文本传输到支撑全球数十亿设备的实时交互,HTTP协议始终是Web世界的核心纽带。本文将深入剖析其设计思想、演进历程及底层工作原理。 HTTP(HyperText Transfer Protoco…...

Flutter_学习记录_动画的简单了解
用AnimationController简单实现如下的效果图: 1. 只用AnimationController实现简单动画 1.1 完整代码案例 import package:flutter/material.dart;class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});overrideState<AnimationDe…...
【java】for (int num : numbers) { System.out.print(num + “ “); } for里的是什么意思
for (int num : numbers) 是 Java 中的一种 增强型 for 循环(也称为 for-each 循环)。它的作用是遍历数组或集合中的每一个元素,并对每个元素执行循环体中的操作。 1. 增强型 for 循环的语法 java Copy for (元素类型 变量名 : 数组或集合…...

内容中台驱动企业CMS架构优化与高效策略
内容概要 在数字化转型浪潮中,企业内容管理系统(CMS)正面临从单一内容存储向智能化、协同化方向演进的迫切需求。通过引入内容中台架构,企业能够有效整合元数据管理、版本控制与智能协作能力,从而优化传统CMS的底层逻…...

我用 Cursor 开发了一款个人小记系统
https://note.iiter.cn 项目背景 在日常工作和学习中,我们经常需要快速记录一些想法、收藏一些有用的链接或者保存一些重要的文本、图片内容。虽然市面上已经有很多笔记软件,但我想要一个更轻量、更简单的工具,专注于快速记录和智能检索。于是我开发了这款个人小记系统。 系统…...

百问网(100ask)提供的烧写工具的原理和详解;将自己编译生成的u-boot镜像文件烧写到eMMC中
百问网(100ask)提供的烧写工具的原理 具体的实现原理见链接 http://wiki.100ask.org/100ask_imx6ull_tool 为了防止上面这个链接失效,我还对上面这个链接指向的页面保存成了mhtml文件,这个mhtml文件的百度网盘下载链接: https://pan.baidu.c…...
doris:异步物化视图概述
物化视图作为一种高效的解决方案,兼具了视图的灵活性和物理表的高性能优势。 它能够预先计算并存储查询的结果集,从而在查询请求到达时,直接从已存储的物化视图中快速获取结果,避免了重新执行复杂的查询语句所带来的开销。 使用场…...

图像缩放的双线性插值实现方式
1、双线性插值概念 双线性插值是一种用于在二维网格上进行插值的方法,适用于图像处理、计算机图形学等领域。它通过利用四个邻近点的已知值,估算出任意点的值。双线性插值在两个方向(通常是水平和垂直)上分别进行线性插值&#x…...
深入剖析 Vue 的响应式原理:构建高效 Web 应用的基石
深入剖析 Vue 的响应式原理:构建高效 Web 应用的基石 在前端开发的广阔天地里,Vue.js 凭借其简洁易用的特性和强大的功能,成为众多开发者的心头好。其中,响应式原理作为 Vue 的核心亮点之一,让数据与视图之间实现了高…...
40.日常算法
1.无重复字符的最长子串 题目来源 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 class Solution { public:int lengthOfL…...

CAS单点登录(第7版)11.SSO SLO
如有疑问,请看视频:CAS单点登录(第7版) SSO & SLO 安装IDEA Download IntelliJ IDEA – The IDE for Professional Development in Java and Kotlin 安装Maven Download Apache Maven – Maven MAVEN_HOMED:\apache-maven…...
Bob the Canadian
1:around the house Hi! Bob the Canadian here! Let’s learn English around the house. Come on in! Hi, Bob the Canadian here. Welcome to this video. If this is your first time here, don’t forget to click the subscribe button below, and give…...

CAS单点登录(第7版)16.模仿
如有疑问,请看视频:CAS单点登录(第7版) 模仿 概述 代理身份验证 代理身份验证(模拟),有时称为 Web 的 sudo,是代表其他用户进行身份验证的能力。 在这种情况下,两个参…...

预留:大数据Hadoop之——部署hadoop+hive+Mysql环境(Linux)
传送门目录 前期准备 一、JDK的安装 1、安装jdk 2、配置Java环境变量 3、加载环境变量 4、进行校验 二、hadoop的集群搭建 1、hadoop的下载安装 2、配置文件设置 2.1. 配置 hadoop-env.sh 2.2. 配置 core-site.xml 2.3. 配置hdfs-site.xml 2.4. 配置 yarn-site.xm…...

RabbitMQ介绍以及基本使用
文章目录 一、什么是消息队列? 二、消息队列的作用(优点) 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…...

C++演示中介模式
避免两个模块之间的耦合,使用中介模式解决。下面是C代码 #include <iostream> #include <vector>using namespace std;class client;//中介 class mediator { public:void addclient(client* client) {clientVec.push_back(client);}void send(const s…...

Vue的简单入门 一
声明:本版块根据B站学习,创建的是vue3项目,用的是vue2语法风格,仅供初学者学习。 目录 一、Vue项目的创建 1.已安装15.0或更高版本的Node.js 2.创建项目 二、 简单认识目录结构 三、模块语法中的指令 1.v-html 1.文本插值…...

【免费送书活动】《MySQL 9从入门到性能优化(视频教学版)》
本博主免费赠送读者3本书,书名为《MySQL 9从入门到性能优化(视频教学版)》。 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 这本书已经公开…...
export default与export区别
1.定义: export default:用于导出模块中的默认成员。一个模块中只能有一个export default,通常用于导出模块的主要功能或对象。导入时可以使用任意名称,因为它没有具体的名称 export:用于导出模块中的多个成…...
最佳的出牌方法
最佳的出牌方法 真题目录: 点击去查看 E 卷 200分题型 题目描述 手上有一副扑克牌,每张牌按牌面数字记分(J=11,Q=12,K=13,没有大小王),出牌时按照以下规则记分: 出单张,记牌面分数,例如出一张2,得分为2出对或3张,记牌面分数总和再x2,例如出3张3,得分为(3+3+3)x2=1…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...