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

HTTP协议版本的发展(HTTP/0.9、1.0、1.1、2、3)

目录

HTTP协议层次图

HTTP/0.9

例子

HTTP/1.0

Content-Type 字段

Content-Encoding 字段

例子

1.0版本存在的问题:短链接、队头阻塞

HTTP/1.1

Host字段

Content-Length 字段

分块传输编码

1.1版本存在的问题

HTTP/2

HTTP/2数据传输

2版本存在的问题

HTTP/3

队头阻塞问题总结

HTTP1.1断点续传

如果服务器支持断点续传

如果服务器不支持断点续传

断点续传的应用

HTTP Keep-Alive 机制


HTTP协议层次图

HTTP/0.9

HTTP/0.9是最早的一个版本,在1991年发布,只有GET一种请求方法,并且不支持请求头。只支持纯文本一种内容,服务器只能响应HTML格式的字符串,且不能插入图片。HTTP/0.9具有典型的无状态、无连接特性。

例子

请求:
GET /index.html

响应:

<html><body>Hello World</body>
</html>

HTTP/1.0

HTTP/1.0协议于1996年发布,是一种无状态、无连接的应用层协议。
  • 增加POST、HEAD等请求方法。
  • 引入头部信息。除了要传输的数据之外,每次通信都包含头信息,用来描述一些信息。
  • 传输数据格式不再局限于HTML格式。根据Content-Type可以支持多种数据格式,不仅可以用来传输文字,还可以传输图像、音频、视频等二进制文件。
  • 引入cache缓存机制。
  • 引入状态码。

Content-Type 字段

关于字符的编码,1.0版规定,头信息必须是 ASCII 码,后面的数据可以是任何格式。因此,服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type字段的作用。

下面是一些常见的Content-Type字段的值。

text/plain

text/html

text/css

image/jpeg

image/png

image/svg+xml

audio/mp4

video/mp4

application/javascript

application/pdf

application/zip

application/atom+xml

Content-Encoding 字段

由于发送的数据可以是任何格式,因此可以把数据压缩后再发送。Content-Encoding字段说明数据的压缩方法。

Content-Encoding: gzip

Content-Encoding: compress

Content-Encoding: deflate

客户端在请求时,用Accept-Encoding字段说明自己可以接受哪些压缩方法:

Accept-Encoding: gzip, deflate

例子

请求:

GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

客户端请求的时候,可以使用Accept字段声明自己可以接受哪些数据格式。Accept: */*:表明户端可以接受任何格式的数据。

响应:

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html><body>Hello World</body>
</html>

1.0版本存在的问题:短链接、队头阻塞

  • 短链接:每个TCP连接只能发送一个请求,当服务器响应后就会关闭这个TCP连接,下一次请求需要再次建立TCP连接。每次建立、释放TCP连接需要三次握手四次挥手,所以当网页需要发送多个HTTP请求时,就会造成性能问题。
  • 队头阻塞:下一个请求必须在前一个请求响应到达之前才能发送,若前一个请求响应一直不到达,那下一个请求就不发送,同样后面的请求也被阻塞了。

HTTP/1.1

为解决HTTP/1.0短连接造成的性能开销,HTTP/1.1引入了持久连接。
  • 新增了请求方式PUT、PATCH、OPTIONS、DELETE等。
  • 增强缓存策略:如Etag、If-Unmodified-Since、If-Match、If-None-Match等可供选择的了缓存头来控制缓存策略。
  • 客户端请求的头信息新增了Host字段,用来指定服务器的域名。
  • 引入持久连接(即长连接) :可以通过设置connection: keep-alive来保持HTTP连接不断开,避免频繁的建立、释放连接。如果客户端和服务器端发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求是,发送connection: false来明确要求服务器关闭TCP连接。(1.1默认有长链接,1.0需要手动的添加connection: keep-alive才能保持长链接
  • 加入管道机制:基于HTTP/1.1的长链接,在同一个TCP连接里,允许多个请求同时发送。但是还是有问题:假设客户端需要请求两个资源。以前的做法是,在同一个TCP连接里,先发送A请求,然后等待服务做出响应,收到后再发出B请求。管道机制允许浏览器同时发出A请求和B请求,但服务器还是按照请求顺序,先响应A请求,再响应B请求,所以这并不是真正意义上的并行传输。现阶段的浏览器厂商实现并行传输,采用的做法是允许打开多个TCP会话,这就是我们所熟悉的浏览器对同一个域下能够并行加载6~8个资源的限制。(所以说HTTP/1.1 管道解决了请求的队头阻塞,但是没有解决响应的队头阻塞)
  • HTTP/1.1支持文件断点续传:RANGE:bytes,HTTP/1.0每次传送文件都是从文件头开始,即0字节处开始。RANGE:bytes=XXXX表示要求服务器从文件XXXX字节处开始传送,断点续传。返回码是206(Partial Content)
  • Content-length字段:声明本次回应的数据长度。
  • 分块传输编码:使用Content-Length字段的前提条件是服务器发送响应之前,必须知道响应的数据长度。对于一些很耗时的动态操作来说,这意味着,服务器要等到所有操作完成才能发送数据,显然这样的效率不高。更好的处理方法是,产生一块数据,就发送一块,采用“流模式”(stream),取代“缓存模式”(buffer)。因此,1.1版本规定可以不使用Content-Length字段,而使用“分块传输编码”,只要请求或回应的头信息有Transfer-Encoding字段,就表明响应将由数量未定的数据块组成。

Host字段

Host 请求头字段的引入主要是为了解决虚拟主机(Virtual Hosting)的问题,即 一台物理服务器托管多个域名网站时,如何正确区分不同域名的请求。
  • HTTP/1.0 的问题:在 HTTP/1.0 中,请求只包含路径(如 GET /index.html),不包含域名信息。如果一台服务器托管了 example.com 和 test.com,服务器无法区分请求是发给哪个域名的。
  • HTTP/1.1 的解决方案:强制要求客户端在请求头中添加 Host 字段,明确指定目标域名:服务器会根据 Host 字段将请求路由到对应的网站。如下:
GET /index.html HTTP/1.1
Host: example.com

Content-Length 字段

一个TCP连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。这就是Content-length字段的作用,声明本次回应的数据长度。

Content-Length: 3495

上面代码告诉浏览器,本次回应的长度是3495个字节,后面的字节就属于下一个回应了。

在1.0版中,Content-Length字段不是必需的,因为浏览器发现服务器关闭了TCP连接,就表明收到的数据包已经全了

分块传输编码

Transfer-Encoding: chunked // 分块传输

每一个非空的数据块之前,会有一个16进制的数值,表示这个块的长度。最后是一个大小为0的块,就表示本次回应的数据发送完毕:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked25
This is the data in the first chunk1C
and this is the second one3
con8
sequence0

1.1版本存在的问题

1.1使用持久连接、管道化优化了性能,但没有彻底解决队头阻塞问题。

HTTP/2

  • 二进制分帧:HTTP/1.1版本的头信息必须是文本(ASCII编码),数据体可以是文本,也可以是二进制,HTTP/2则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为“帧”(frame):头信息帧和数据帧。如下图:
  • 多路复用:HTTP/2版本会复用TCP连接。在一个连接里,客户端和服务器端都可以同时发送多个请求或响应,而且不用按照顺序一一对应,这样就避免了“队头阻塞”。(多路复用是通过 流Streams和 二进制帧Frames实现的,而非直接复用原始 HTTP 消息)
  • 数据流:因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。
HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。
数据流发送到一半的时候,客户端和服务器都可以发送信号(RST_STREAM帧),取消这个数据流。1.1版取消数据流的唯一方法,就是关闭TCP连接。这就是说,HTTP/2 可以取消某一次请求,同时保证TCP连接还打开着,可以被其他请求使用。
客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应。
  • 头信息压缩:HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie和User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
  • 服务器推送:HTTP/2允许服务器不需要客户端的请求就可以主动向客户端发送资源。
常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。
  • 流量控制: HTTP/2不同于HTTP/1.1的只要客户端可以处理,服务端就会尽可能快地发送数据。HTTP/2提供了客户端调整传输速度的能力(服务端也可以),在每一个数据帧中告诉对方,发送方想要接受多少字节的数据。

HTTP/2数据传输

从图中可见,所有的HTTP/2通信都在一个TCP连接上完成,这个连接可以承载任意数量的双向数据流。

每个数据流以消息的形式发送,而消息由一个或多个帧组成。这些帧可以乱序发送,然后再根据每个帧头部的stream id标识符来重新组装。

举个例子,每个请求是一个数据流,数据流以消息的方式发送,而消息又分为多个帧,帧头部记录着stream id用来标识当前帧所属的数据流,不同属的帧可以在连接中混杂在一起。接收方可以根据stream id将帧再归属到各自不同的请求中去。

另外,多路复用(连接共享)可能会导致关键请求被阻塞。HTTP/2里每个数据流都可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端,数据流还可以依赖其他的子数据流。

2版本存在的问题

队头阻塞:

HTTP/2 的多路复用依赖于一条 TCP 连接,而 TCP 是面向字节流的协议,要求数据按顺序到达,如果某个TCP 包丢失,那么整个连接会等待重传,导致所有流被阻塞。

HTTP/3

HTTP/3 基于 QUIC 协议(Quick UDP Internet Connections),解决了 HTTP/2 的遗留问题。
  • TCP 队头阻塞:HTTP/2 的 多路复用 在 TCP 上运行时,若一个包丢失,所有流(Stream)都会被阻塞。HTTP/3 使用 QUIC(基于 UDP),每个流独立传输,丢包只影响当前流,其他流不受影响。

HTTP/3 只使用一个 UDP 连接,但在这个连接内部通过 QUIC 协议 实现了多路复用,而不是建立多个 UDP 连接。在单个 UDP 连接内创建多个Streams流,每个 HTTP 请求/响应对应一个独立的 QUIC 流(使用Stream ID标识),这些流共享同一个 UDP 连接,但彼此独立,所以一个流丢包不会阻塞其他流传输消息。

  • 减少握手延迟HTTP/2 需要 TCP 三次握手 + TLS 握手(1~2 RTT),而 HTTP/3 的 QUIC 直接内置 TLS 1.3,支持:
    • 1-RTT 首次连接(比 HTTP/2 更快)。
    • 0-RTT 恢复连接(对之前访问过的服务器可立即发送数据)。

队头阻塞问题总结

HTTP1.0存在短链接、队头阻塞问题
HTTP/1.1 通过以下改进减少了部分性能问题,但未彻底解决队头阻塞:
  • 持久连接(Keep-Alive):默认复用同一个 TCP 连接,避免了频繁建立连接的开销。
  • 管道化(Pipelining):允许客户端在未收到响应时发送多个请求(理论上的优化)。(响应必须按请求顺序返回:如果第一个请求的响应延迟(例如服务器处理慢或网络延迟),后续已发送的请求响应会被阻塞,即使它们已经准备就绪。)
HTTP/2 和 HTTP/3:
  • HTTP/2:通过多路复用(Multiplexing)在单个连接上并行传输多个请求/响应,彻底解决了应用层的队头阻塞。但若底层 TCP 丢包,仍会因重传导致所有流阻塞(TCP 层队头阻塞)。
  • HTTP/3:基于 QUIC 协议(UDP 实现),解决了 TCP 层的队头阻塞,每个流独立传输,丢包不影响其他流。

HTTP1.1断点续传

HTTP/1.1 通过 Range 请求头 和 Content-Range 响应头 支持文件的断点续传(Partial Content),允许客户端只请求资源的某一部分,而不是整个文件。这在下载大文件、视频流或恢复中断的下载时非常有用,可以 有效避免重复下载

如果服务器支持断点续传

客户端发起带 Range 头的请求:客户端在请求中指定需要下载的字节范围(如从第 1000 字节开始)。

GET /large-file.zip HTTP/1.1
Host: example.com
Range: bytes=1000-2000
  • Range: bytes=start-end:请求文件的特定字节范围(end 可省略,表示直到文件末尾)。
  • 例如:
    • Range: bytes=0-499 → 请求前 500 字节
    • Range: bytes=500- → 请求从第 500 字节到文件末尾
    • Range: bytes=500-999,2000-2499 → 请求多个范围(较少使用)

如果服务器支持断点续传,会返回 206 状态码,并标明返回的数据范围:

HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-2000/5000
Content-Length: 1001
Content-Type: application/zip[文件数据...]
  • Content-Range: bytes start-end/total:
    • start-end:实际返回的字节范围
    • total:文件的完整大小(如果未知,可以用 * 代替)
  • Content-Length:返回的数据长度(这里是 2000 - 1000 + 1 = 1001 字节)

客户端继续下载剩余部分:客户端可以继续发送新的 Range 请求,直到文件下载完成。

注意:如果客户端请求的字节范围不合法,比如超出了请求文件的大小,那么服务端就会返回416状态码。
StatusRequestedRangeNotSatisfiable(请求的状态范围不满足) = 416

如果服务器不支持断点续传

如果服务器不支持 Range 请求,会直接返回 200 OK 和整个文件:

HTTP/1.1 200 OK
Content-Length: 5000
Content-Type: application/zip[完整的文件数据...]

客户端需要检查状态码是 206 还是 200 来判断是否支持断点续传。

StatusPartialContent(状态部分内容)= 206

断点续传的应用

  1. 大文件下载(如 ISO 镜像、视频文件):下载工具(如迅雷、IDM)可以分块下载,提高速度。如果下载中断,可以从中断的位置继续下载,而不是重新开始。
  2. 视频/音频流(HTTP Streaming):播放器可以只请求视频的某一段(如 Range: bytes=0-1023),实现边下边播。
  3. 断网恢复:浏览器或下载管理器可以记录已下载的字节位置,恢复时发送 Range 请求继续下载。

HTTP Keep-Alive 机制

HTTP Keep-Alive(也称为持久连接,Persistent Connection)是一种允许在单个TCP连接上发送和接收多个HTTP请求/响应的机制。它通过复用TCP连接,减少因频繁建立/关闭连接带来的性能开销。
工作原理:
  • 传统HTTP(无Keep-Alive):每个HTTP请求完成后立即关闭TCP连接,下次请求需重新建立连接(三次握手)。
请求1 → 响应1 → 关闭连接
请求2 → 响应2 → 关闭连接
  • 启用Keep-Alive后:多个HTTP请求复用同一个TCP连接,减少握手和挥手次数。
请求1 → 响应1 → 请求2 → 响应2 → ... → 关闭连接
实现方式:
  • HTTP/1.1:默认启用Keep-Alive(无需显式声明),除非请求头包含 Connection: close。
  • HTTP/1.0:需显式在请求头中添加 Connection: keep-alive。
示例请求头:
GET /index.html HTTP/1.1
Host: example.com
Connection: keep-alive  # 显式启用(HTTP/1.0需此字段,HTTP/1.1可省略)

参考:

HTTP 协议的历史演变和设计思路 

稀土掘金:HTTP协议各个版本之间的区别

相关文章:

HTTP协议版本的发展(HTTP/0.9、1.0、1.1、2、3)

目录 HTTP协议层次图 HTTP/0.9 例子 HTTP/1.0 Content-Type 字段 Content-Encoding 字段 例子 1.0版本存在的问题&#xff1a;短链接、队头阻塞 HTTP/1.1 Host字段 Content-Length 字段 分块传输编码 1.1版本存在的问题 HTTP/2 HTTP/2数据传输 2版本存在的问题…...

零基础设计模式——结构型模式 - 桥接模式

第三部分&#xff1a;结构型模式 - 桥接模式 (Bridge Pattern) 在学习了适配器模式如何解决接口不兼容问题后&#xff0c;我们来看看桥接模式。桥接模式是一种更侧重于系统设计的模式&#xff0c;它旨在将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。 核心思…...

C++对象的内存模型

C++对象的内存模型涉及对象的数据成员(包括静态成员和非静态成员)、成员函数以及虚函数表等在内存中的布局和管理方式。以下是C++对象的内存模型的主要组成部分: 1. C++对象的组成 一个C++对象通常由以下几个部分组成: 非静态数据成员 对象的核心组成部分,每个对象都有自己…...

SpringBoot3集成Oauth2.1——4集成Swagger/OpenAPI3

文章目录 访问在线文档页面配置OpenApiConfig 在我之前的文章中&#xff0c;写了 SpringBoot3集成OpenAPI3(解决Boot2升级Boot3) 访问在线文档页面 当我们同样在SpringBoot3使用oauth2.1也就是我之前的文章中写的。现在我们要处理下面这两个的问题了。 <!-- 使用springdoc…...

基于深度学习的情绪识别检测系统【完整版】

最近很多小伙伴都在咨询&#xff0c;关于基于深度学习和神经网络算法的情绪识别检测系统。回顾往期文章【点击这里】&#xff0c;介绍了关于人脸数据的预处理和模型训练&#xff0c;这里就不在赘述。今天&#xff0c;将详细讲解如何从零基础手写情绪检测算法和情绪检测系统。主…...

本地依赖库的版本和库依赖的版本不一致如何解决?

我用的 yarn v4 版本&#xff0c;所以以下教程命令都基于yarn 这里假设我报错的库名字叫 XXXXXXXX&#xff0c;依赖他的库叫 AAAAAAAA 排查解决思路分析&#xff1a; 首先查看一下 XXXXXXXX 的依赖关系&#xff0c;执行 yarn why XXXXXXXX 首先我们要知道 yarn 自动做了库…...

Redis学习打卡-Day7-高可用(下)

前面提到&#xff0c;在某些场景下&#xff0c;单实例存Redis缓存会存在的几个问题&#xff1a; 写并发&#xff1a;Redis单实例读写分离可以解决读操作的负载均衡&#xff0c;但对于写操作&#xff0c;仍然是全部落在了master节点上面&#xff0c;在海量数据高并发场景&#x…...

Spark on Yarn 高可用模式部署流程

一、引言 Spark是一个用于大规模数据分析处理的分布式计算框架,适用于快速处理大数据的场景。Yarn是一个资源调度框架,用于集群资源的调度和管理。Spark 的任务也可以提交到Yarn中运行,由Yarn进行资源调度。在生产环境中,为了避免单点故障导致整个集群不可用的情况,一个很…...

AI时代新词-大模型(Large Language Model)

一、什么是大模型&#xff1f; 大模型&#xff0c;全称为“大规模语言模型”&#xff08;Large Language Model&#xff09;&#xff0c;是一种基于深度学习的人工智能技术。它通过海量的文本数据进行训练&#xff0c;学习语言的模式、语法和语义&#xff0c;从而能够生成自然…...

3d tiles高级样式设计与条件渲染

条件渲染是3D Tiles样式设置的一大亮点。我们可以通过设置不同的条件来实现复杂的视觉效果。例如&#xff0c;根据建筑物与某个特定点的距离来设置颜色和是否显示&#xff1a; tiles3d.style new Cesium.Cesium3DTileStyle({defines: {distance: "distance(vec2(${featur…...

Linux中logger命令的使用方法详解

文章目录 一、基础语法二、核心功能选项三、‌设施与优先级对照‌1. 常用设施&#xff08;Facility&#xff09;2. 优先级&#xff08;Priority&#xff09;从低到高&#xff1a;3. 组合示例‌ 四、典型使用场景1. 记录简单消息2. 带标签和优先级3. 记录命令输出4. 发送到远程服…...

博奥龙Nanoantibody系列IP专用抗体

货号名称BDAA0260 HRP-Nanoantibody anti Mouse for IP BDAA0261 AbBox Fluor 680-Nanoantibody anti Mouse for IP BDAA0262 AbBox Fluor 800-Nanoantibody anti Mouse for IP ——无轻/重链干扰&#xff0c;更高亲和力和特异性 01Nanoantibody系列抗体 是利用噬菌体展示纳…...

webpack构建速度和打包体积优化方案

一、分析工具 1.1 webpack-bundle-analyzer 生成 stats.json 文件 打包命令webpack --config webpack.config.js --json > stats.json使用 webpack-bundle-analyzer 插件const BundleAnalyzerPlugin = require(webpack-bundle-analyzer).BundleAnalyzerPlugin; plugins: […...

[IMX] 08.RTC 时钟

代码链接&#xff1a;GitHub - maoxiaoxian/imx 目录 1.IMX 的 SNVS 模块 2.SNVS 模块的寄存器 2.1.命令寄存器 - SNVS_HPCOMR 2.2.低功耗控制寄存器 - SNVS_LPCR 2.3.HP 模式的计数寄存器 MSB - SNVS_HPRTCMR 2.4.HP 模式的计数寄存器 LSB - SNVS_HPRTCLR 2.5.LP 模式的…...

PG Craft靶机复现 宏macro攻击

一. 端口扫描 只有80端口开启 二. 网页查看 目录扫描一下&#xff1a; dirsearch -u http://192.168.131.169/ 发现 http://192.168.131.169/upload.php 网站书使用xampp搭建&#xff0c;暴露了路径 还发现上传文件 http://192.168.131.169/uploads/ 发现一个上传点&#x…...

Qt Creator快捷键合集

前言 QtCreator是一款跨平台的IDE,专为Qt开发设计,支持C/C++/JS/Python编程,支持设备远程调试,支持代码高亮,集成帮助文档,原生支持cmake和git,确实是一款朴实而又强大的集成开发环境,让人有种爱不释手的感觉 编辑 功能快捷键复制Ctrl + C粘贴Ctrl + V剪切Ctrl + X代…...

ElasticSearch--DSL查询语句

ElasticSearch DSL查询文档 分类 查询类型功能描述典型应用场景示例语法查询所有匹配所有文档&#xff0c;无过滤条件数据预览/测试json { "query": { "match_all": {} } }全文检索查询对文本字段分词后匹配&#xff0c;基于倒排索引搜索框模糊匹配、多字段…...

海康威视摄像头C#开发指南:从SDK对接到安全增强与高并发优化

一、海康威视SDK核心对接流程​​ 1. ​​开发环境准备​​ ​​官方SDK获取​​&#xff1a;从海康开放平台下载最新版SDK&#xff08;如HCNetSDK.dll、PlayCtrl.dll&#xff09;。​​依赖项安装​​&#xff1a;确保C运行库&#xff08;如vcredist_x86.exe&#xff09;与S…...

Redis(四) - 使用Python操作Redis详解

文章目录 前言一、下载Python插件二、创建项目三、安装 redis 库四、新建python软件包五、键操作六、字符串操作七、列表操作八、集合操作九、哈希表操作十、有序集合操作十一、完整代码1. 完整代码2. 项目下载 前言 本文是基于 Python 操作 Redis 数据库的实战指南&#xff0…...

Kotlin全栈工程师转型路径

针对 Android 开发者向全栈工程师的转型&#xff0c;结合 Kotlin 语言的独特优势&#xff0c;以下是分阶段转型路径和关键技术建议&#xff1a; 一、Kotlin 全栈技术栈构建 后端开发深化 Ktor 框架进阶&#xff1a; 掌握路由嵌套、内容协商&#xff08;JSON/Protobuf&#xf…...

如何利用 Spring Data MongoDB 进行地理位置相关的查询?

以下是如何使用 Spring Data MongoDB 进行地理位置相关查询的步骤和示例&#xff1a; 核心概念&#xff1a; GeoJSON 对象: MongoDB 推荐使用 GeoJSON 格式来存储地理位置数据。Spring Data MongoDB 提供了相应的 GeoJSON 类型&#xff0c;如 GeoJsonPoint, GeoJsonPolygon, …...

服务器并发实现的五种方法

文章目录 前言一、单线程 / 进程二、多进程并发三、多线程并发四、IO多路转接&#xff08;复用&#xff09;select五、IO多路转接&#xff08;复用&#xff09;poll六、IO多路转接&#xff08;复用&#xff09;epoll 前言 关于网络编程相关知识可看我之前写过的文章&#xff1…...

PYTORCH_CUDA_ALLOC_CONF基本原理和具体示例

PYTORCH_CUDA_ALLOC_CONFmax_split_size_mb 是 PyTorch 提供的一项环境变量配置&#xff0c;用于控制 CUDA 显存分配的行为。通过指定此参数&#xff0c;可以有效管理 GPU 显存的碎片化&#xff0c;缓解因显存碎片化而导致的 “CUDA out of memory”&#xff08;显存溢出&#…...

2025年系统架构师---综合知识卷

1.进程是一个具有独立功能的程序关于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位(线程包含于进程之中,可并发,是系统进行运算调度的最小单位)。一个进程是通过其物理实体被感知的,进程的物理实体又称为进程的静态描述,通常由三部分组成,分别是程序、…...

AI 抠图软件批量处理 + 发丝级精度,婚纱 / 玻璃一键抠透明 免安装

各位抠图小能手们&#xff0c;今天我要给大家介绍一款超厉害的工具——AiartyImageMattingPortable&#xff01;它是基于人工智能的便携式图像抠图工具&#xff0c;专门为快速、精准抠图而生&#xff0c;处理复杂边缘和透明物体那简直就是它的拿手好戏&#xff01; 咱先说说它…...

JVM 深度解析

一、JVM 概述 1.1 什么是 JVM&#xff1f; JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;是 Java 程序运行的核心引擎。它像一个“翻译官”&#xff0c;将 Java 字节码转换为机器能理解的指令&#xff0c;并管理程序运行时的内存、线程等资源。 …...

新能源汽车移动充电服务:如何通过智能调度提升充电桩可用率?

随着新能源汽车的普及&#xff0c;充电需求激增&#xff0c;但固定充电桩的布局难以满足用户灵活补能的需求&#xff0c;尤其在高峰时段或偏远地区&#xff0c;"充电难"问题日益凸显。移动充电服务作为新兴解决方案&#xff0c;通过动态调度充电资源&#xff0c;有望…...

SpringCloud Alibaba微服务-- Sentinel的使用(笔记)

雪崩问题&#xff1a; 小问题引发大问题&#xff0c;小服务出现故障&#xff0c;处理不当&#xff0c;可能导致整个微服务宕机。 假如商品服务出故障&#xff0c;购物车调用该服务&#xff0c;则可能出现处理时间过长&#xff0c;如果一秒几十个请求&#xff0c;那么处理时间过…...

PARSCALE:大语言模型的第三种扩展范式

----->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<----- 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为推动机器智能向通用人工智能&#xff08;AGI&#xff09;迈进的核心驱动力。然而&#xff0c;传统的…...

在Windows上,将 Ubuntu WSL 安装并迁移到 D 盘完整教程(含 Appx 安装与迁移导入)

&#x1f4bb; 将 Ubuntu WSL 安装并迁移到 D 盘完整教程&#xff08;含 Appx 安装与迁移导入&#xff09; 本文记录如何在 Windows 系统中手动启用 WSL、下载 Ubuntu 安装包、安装并迁移 Ubuntu 到 D 盘&#xff0c;避免默认写入 C 盘&#xff0c;提高系统性能与可维护性。 ✅…...