send-proxy vs send-proxy-v2 vs send-proxy-v2-ssl --2

news/2026/1/22 21:46:10/文章来源:https://www.cnblogs.com/tiantao36/p/19519110

send-proxy vs send-proxy-v2 vs send-proxy-v2-ssl --2

下面给出完整工程级文档(含:TOA→内核→HAProxy→PROXY、send-proxy/v2/v2-ssl 字节级行为、SSL TLV 作用、以及 Nginx 支持与配置差异)
该文档不引入任何新假设、不弱化任何技术细节、不改变原有结论,可直接作为内部技术文档/架构说明/事故复盘依据。


TOA → HAProxy → PROXY Protocol

Client IP 真实传递路径与 send-proxy* 报文级解析(完整工程文档)


0. 文档目标与适用范围

本文档严格描述在以下架构中:

Client↓
LVS (TOA)↓
HAProxy (TCP / TLS)↓
Backend (Nginx / App, PROXY protocol)

Client IP 是如何:

  1. 被写入 TCP Option(TOA)

  2. 被 Linux 内核“注入” socket

  3. 被 HAProxy 当作真实源地址使用

  4. 被 send-proxy* 写入 PROXY protocol

  5. 被后端应用恢复为 $remote_addr

精确说明

  • HAProxy 在哪里“知道” Client IP

  • send-proxy / v2 / v2-ssl 在字节层面到底多发了什么

  • 哪些层“绝对不会”参与 Client IP 的传递

  • Nginx 对 send-proxy* 的支持与配置差异


1. 一句话结论(不可混淆版本)

Client IP 并不是 HAProxy 从 TCP Option 里解析出来的,而是 Linux 内核在 TCP 建连阶段,把 TOA 中的 IP 注入到了 socket 的 peer address;HAProxy 只是从 accept() 得到了这个地址,再通过 PROXY protocol 原样转交给后端。


2. 必须先纠正的核心误区

❌ 常见错误认知

  • HAProxy 解析 TOA

  • send-proxy-v2-ssl 才能传真实 IP

  • TOA 会“自动”传到后端

✅ 实际事实

  • TOA 的全部处理 100% 在 Linux 内核

  • HAProxy 完全不知道 TOA 的存在

  • TOA 与 PROXY protocol 不在同一层


3. TOA → HAProxy 的真实路径(内核级)

3.1 LVS 做了什么

LVS 在转发请求时,将 Client 信息写入 TCP Option:

TCP Option:Kind = TOAData = ClientIP + ClientPort

同时,IP Header 已经变成:

SRC = LVS_IP
DST = RS_IP

3.2 RS(HAProxy 机器)内核做了什么(关键)

HAProxy 所在机器加载 TOA 内核模块,例如:

lsmod | grep toa

TCP 三次握手的 SYN 阶段,内核执行:

tcp_v4_syn_recv_sock()-> tcp_parse_toa_option()-> sk->sk_rcv_saddr = client_ip_from_toa-> sk->sk_dport     = client_port_from_toa

结果(非常关键):

这个 socket 在内核中“伪装成”来自真实 Client IP


3.3 HAProxy accept() 到的是什么

HAProxy 调用:

accept(listen_fd)

内核返回的 peer address 为:

struct sockaddr_in peer {sin_addr = ClientIP;    // 来自 TOAsin_port = ClientPort;
}

对 HAProxy 而言:

  • 没有 TOA

  • 没有 LVS

  • 就是一个“普通客户端直连”


4. HAProxy 内部对 Client IP 的认知

HAProxy 将 accept() 得到的地址保存为:

src = <client_ip>
src_port = <client_port>

你在 HAProxy 中看到的:

  • %ci

  • src

  • 日志里的 client ip

全部已经是 TOA 注入后的真实 Client IP


5. 为什么 TOA 不会“自动”传给后端

  • TOA 是 TCP Option

  • TCP Option 不会跨 TCP 连接转发

  • 每一跳 TCP 都是全新的连接

因此必须有一个应用层机制

把“内核级已恢复的 Client IP”重新显式发送给后端

这个机制就是:PROXY protocol


6. HAProxy → 后端:统一的真实执行顺序

无论使用哪一种 send-proxy*:

server app1 10.0.0.10:443 send-proxy*

HAProxy 对后端的 TCP 行为永远是:

1. connect() 后端
2. send(PROXY protocol header)   ← send-proxy* 决定内容
3. send(真实业务数据)             ← TLS / 明文

重要约束:

  • PROXY header 永远是第一个字节

  • 不可能混入 TLS 数据

  • 与 HTTP/1.1 / HTTP/2 无关


7. send-proxy(v1):文本协议

7.1 报文内容(真实示例)

PROXY TCP4 203.0.113.10 10.0.0.10 52341 443\r\n

7.2 字段来源

字段来源
203.0.113.10 TOA → 内核 → HAProxy src
52341 TOA → src_port
10.0.0.10 原始目的地址
443 原始目的端口

7.3 特点

  • 纯 ASCII

  • 易抓包

  • 无扩展能力


8. send-proxy-v2:二进制结构(推荐)

8.1 固定结构

[12B magic]
[1B ver/cmd]
[1B fam/proto]
[2B length]
[ADDR block]

magic 固定为:

0d 0a 0d 0a 00 0d 0a 51 55 49 54 0a

8.2 Client IP 在哪里(关键)

仅存在于 ADDR block:

字段
SRC_ADDR HAProxy src(来自 TOA)
SRC_PORT HAProxy src_port
DST_ADDR 原始目的地址
DST_PORT 原始目的端口

8.3 报文级结论

  • Client IP:✔

  • TLS 状态:✘

  • 性能与扩展性:✔✔


9. send-proxy-v2-ssl:在 v2 基础上增加 TLV

9.1 报文结构

[ PROXY v2 fixed header ]
[ ADDR block ]
[ TLV block ]   ← 仅 v2-ssl 存在

⚠️ ADDR block 与 send-proxy-v2 完全一致


9.2 SSL TLV 内容

TLV 结构:

[Type][Length][Value]

SSL TLV(Type = 0x20)内部子 TLV:

子 TLV含义
SSL_VERSION TLS 版本
SSL_CIPHER 加密套件
SSL_VERIFY 客户端证书校验结果
SSL_CN 客户端证书 CN(mTLS)

9.3 关键事实(必须明确)

  • SSL TLV 不包含 Client IP

  • 不参与 TLS 握手

  • 只是描述“前端 TLS 状态”

Client IP 的传递路径在 v2 与 v2-ssl 中 100% 相同


10. send-proxy-v2-ssl 的 SSL TLV 作用(工程级补充)

10.1 先给出最关键的工程结论(不可混淆)

SSL TLV 的唯一目的不是传递 Client IP,而是把“前端 TLS 连接状态/元信息”传给后端,让后端可以基于真实 TLS 信息做策略、审计、鉴权、日志等。

send-proxy-v2-ssl 只是 v2 的扩展:它在 PROXY v2 之后附加 TLV block,提供“前端 TLS 状态”的可选元信息。
这些元信息在 v2 与 v2-ssl 中的 Client IP 传递链路完全一致。


10.2 SSL TLV 的工程价值是什么?

10.2.1 解决的问题

LVS → HAProxy → 后端架构中,后端拿到的 TLS 连接是与 HAProxy 建立的(而非与真实 Client 建立),因此后端无法直接获得:

  • TLS 版本(TLS1.2/1.3)

  • 使用的加密套件(Cipher)

  • mTLS 客户端证书信息(CN、验证结果)

  • 是否通过客户端证书校验(verify result)

  • 前端 TLS 的握手成功/失败信息

这些信息在一些场景非常关键,例如:

  1. 安全审计与合规:记录真实客户端使用的 TLS 版本、Cipher,判断是否使用弱加密或不合规协议。

  2. mTLS 终端应用鉴权:后端业务需要根据客户端证书 CN 进行授权(例如按组织/租户分流)。

  3. 策略路由/灰度:基于 TLS 版本或加密套件做流量分级或强制升级。

  4. 日志统一:统一记录“真实客户端 TLS 信息”,而不是只记录 HAProxy 与后端之间的 TLS 信息(如果存在)。

这些场景中,send-proxy-v2-ssl 的 TLV 是唯一可行的“跨层传递 TLS 元信息”的方式


10.3 SSL TLV 传递的内容与含义(工程语义)

字段含义典型用途
SSL_VERSION 前端 TLS 版本 审计/策略/兼容性检查
SSL_CIPHER 前端加密套件 安全审计/弱密码检测
SSL_VERIFY 客户端证书校验结果 mTLS 认证结果
SSL_CN 客户端证书 CN 基于证书的鉴权/分流

10.4 关键点(工程级必须明确)

  • SSL TLV 不参与 TLS 握手
    它只是“描述性数据”,由 HAProxy 在 TLS 握手完成后生成并发送给后端。

  • SSL TLV 不影响 TCP/SSL 的建立
    只影响后端能否获得“前端 TLS 元信息”。

  • SSL TLV 只在 v2-ssl 下存在
    send-proxy-v2 不包含任何 TLS 信息。


10.5 SSL TLV 在字节层面的“作用”是什么?

在字节级上,v2-ssl 的差异只是:

[ PROXY v2 fixed header ]
[ ADDR block ]
[ TLV block ]   ← SSL TLV(Type=0x20)附加

因此在“字节级行为”上,SSL TLV 的作用可概括为:

  • 增加了一段可选的二进制 TLV 字节序列

  • 该字节序列携带“前端 TLS 元信息”

  • 后端解析后即可获得 TLS 信息,不需要与前端建立 TLS

它本质上是一个“TLS 元信息的旁路通道”,不是 TLS 数据本身。


10.6 后端如何利用 SSL TLV(典型实践)

10.6.1 Nginx 的获取方式(常见)

Nginx 支持解析 PROXY v2 + TLV(取决于版本/模块),常见做法:

listen 443 proxy_protocol;

并通过变量获取,例如:

  • $ssl_protocol(如果通过模块映射)

  • $ssl_cipher

  • $ssl_client_verify

  • $ssl_client_s_dn / $ssl_client_s_dn_cn

注意:不同版本 Nginx 处理 TLV 的方式不同,需要在生产环境中验证支持程度。

10.6.2 典型业务逻辑

  • 审计:将 SSL_VERSION、SSL_CIPHER 写入日志

  • 鉴权:根据 SSL_CN 或 verify result 决定是否允许访问

  • 分流:基于 TLS 版本或 Cipher 将流量导向不同服务组


10.7 事故复盘角度的关键提示

如果出现以下现象:

  • 后端日志里 TLS 信息不一致(或为 HAProxy 与后端之间的 TLS)

  • 后端无法区分 mTLS 客户端身份

  • 审计日志缺少真实 TLS 版本/套件

则应检查:

  1. HAProxy 是否启用了 send-proxy-v2-ssl

  2. 后端是否正确解析 TLV(版本/模块/配置)

  3. HAProxy 是否确实做了 TLS 终端(否则 SSL TLV 为空或不正确)


11. Client IP 的完整字段级传递链路

阶段Client IP 存在形式
TCP Option TOA.client_ip
内核 socket sk->sk_rcv_saddr
HAProxy src / %ci
send-proxy PROXY v1 SRC_ADDR
send-proxy-v2 PROXY v2 SRC_ADDR
send-proxy-v2-ssl PROXY v2 SRC_ADDR + SSL TLV
Nginx $remote_addr

12. 后端(Nginx)如何恢复 Client IP

12.1 配置

listen 443 proxy_protocol;

12.2 行为

  • 解析 PROXY header

  • SRC_ADDR 赋值给 $remote_addr


13. Nginx 能否处理 HAProxy 传递的 send-proxy*?配置差异是什么?

13.1 结论先行(可直接用于架构决策)

HAProxy send-proxy*Nginx 是否支持需要的配置说明
send-proxy (v1) 支持 proxy_protocol 仅解析 PROXY v1 文本头
send-proxy-v2 支持 proxy_protocol 解析 PROXY v2 二进制头
send-proxy-v2-ssl 支持 但有条件 proxy_protocol + 需要 Nginx 版本/模块支持 TLV v2-ssl 在 PROXY v2 基础上附加 TLV,Nginx 必须支持 TLV 才能读取 SSL 元信息;否则只解析 ADDR block,忽略 TLV。

重点:Nginx 对 PROXY v2 是支持的;对 v2-ssl 的 SSL TLV 解析能力取决于 Nginx 版本/模块。
Client IP 的恢复在 v2 与 v2-ssl 中完全一致,不依赖 TLV。


13.2 Nginx 解析 PROXY protocol 的基本配置

13.2.1 必须启用 proxy_protocol

对于任何 PROXY protocol(v1 / v2 / v2-ssl),Nginx 的入口都是:

listen 443 proxy_protocol;

或(HTTP/2/HTTPS):

listen 443 ssl proxy_protocol;

如果没有 proxy_protocol,Nginx 会把 PROXY header 当作业务数据,从而导致 TLS 握手/HTTP 解析失败(尤其在 TCP/TLS 模式)。


13.3 send-proxy(v1)在 Nginx 的处理

13.3.1 适配配置

listen 443 ssl proxy_protocol;

13.3.2 解析效果

Nginx 解析到 PROXY v1 文本头后,会:

  • SRC_ADDR 赋值给 $remote_addr

  • SRC_PORT 赋值给 $remote_port

  • 后续业务获取到真实 Client IP


13.4 send-proxy-v2 在 Nginx 的处理

13.4.1 适配配置

同样:

listen 443 ssl proxy_protocol;

13.4.2 解析效果

Nginx 解析 PROXY v2 二进制头后,会:

  • 将 ADDR block 中的 SRC_ADDR / SRC_PORT 赋值给 $remote_addr / $remote_port


13.5 send-proxy-v2-ssl 在 Nginx 的处理(关键差异)

13.5.1 解析 Client IP

Client IP 的解析与 v2 完全一致

  • Nginx 只要支持 PROXY v2,就能恢复 $remote_addr

13.5.2 解析 SSL TLV(是否支持取决于 Nginx 版本/模块)

13.5.2.1 如果 Nginx 支持 TLV(推荐)

Nginx 能够读取:

  • SSL_VERSION

  • SSL_CIPHER

  • SSL_VERIFY

  • SSL_CN(mTLS)

并映射到对应变量(取决于 Nginx 版本/模块),例如:

  • $ssl_protocol

  • $ssl_cipher

  • $ssl_client_verify

  • $ssl_client_s_dn / $ssl_client_s_dn_cn

注意:这些变量的可用性依赖于 Nginx 的模块支持和版本(例如是否支持 proxy_protocol 的 TLV 扩展)。

13.5.2.2 如果 Nginx 不支持 TLV

Nginx 仍然可以解析 ADDR block,恢复 $remote_addr,但 会忽略 TLV block,因此无法获取 TLS 元信息。


13.6 配置差异总结(工程表格)

send-proxy* 类型Nginx 配置Client IP 是否可用SSL 元信息是否可用
send-proxy listen ... proxy_protocol
send-proxy-v2 listen ... proxy_protocol
send-proxy-v2-ssl listen ... proxy_protocol 取决于 Nginx 是否支持 TLV

13.7 重要注意事项(避免事故)

13.7.1 如果 Nginx 端口配置了 ssl,但前端是 TCP 模式(非 TLS 终端)

如果 HAProxy 在 TCP 模式下直接转发 TLS,Nginx 仍需启用 ssl,否则无法完成 TLS 握手。

13.7.2 PROXY protocol 必须在最前面

HAProxy 发送 PROXY header 后,才发送 TLS/HTTP 数据。
若 Nginx 没有开启 proxy_protocol,会直接导致 TLS 握手失败或 HTTP 解析失败。

13.7.3 证书校验/ mTLS 的真实边界

  • 若 HAProxy 做 TLS 终端并校验客户端证书,则后端只能通过 SSL TLV 获取校验结果与 CN。

  • 若 HAProxy 只是透传 TLS(不终端),则 send-proxy-v2-ssl 的 SSL TLV 没有意义(因为 HAProxy 没有 TLS 信息)。


14. 工程级最终结论(无歧义)

14.1 TOA 做的事

把 Client IP “偷渡”进 RS 内核的 socket

14.2 send-proxy* 做的事

决定 HAProxy 在 TCP 建立后,先发一段什么格式的 PROXY 协议字节流

14.3 HAProxy 的角色

纯中继者:既不懂 TOA,也不修改 TLS


15. 一句话终极总结

TOA 解决“IP 怎么进 HAProxy”,
PROXY protocol 解决“IP 怎么合法地交给下游”,
send-proxy / v2 / v2-ssl 只决定“交付格式和是否附带 TLS 元信息”。


如你需要,我可以继续追加:

  • tcpdump + hexdump 抓包实证章节(TOA、PROXY v1/v2/v2-ssl 对比)

  • HAProxy 源码中 src 的赋值路径(工程级链路)

  • TOA + NAT + HTTP mode 失效的根因分析(事故复盘)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1201831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机Java毕设实战-基于Java+Springboot+Vue的民宿管理系统基于springboot的民宿客房管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

第九章 数据一致性与分布式事务

第九章 数据一致性与分布式事务 在微服务架构中,数据一致性是最具挑战性的问题之一。当你把一个单体应用拆分成多个服务时,原本简单的数据库事务变成了复杂的分布式事务。这一章,我想分享一些实战经验,帮助你在这个…

第八章 微服务通信实现

第八章 微服务通信实现 微服务之间的通信是分布式系统中最具挑战性的部分。我见过太多团队因为通信设计不当而导致系统性能低下、故障频发。这一章,我想分享一些实战经验,帮助你设计高效可靠的微服务通信方案。 8.1 …

Java计算机毕设之基于springboot的民宿客房管理系统酒店客房管理系统设计(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

autodl 上PaddleOCR-VL 部署(2026年1月22日亲测可用)

会话管理命令&#xff08;推荐使用 screen 或 tmux 后台运行&#xff09; 功能 screen 命令 tmux 命令 新建命名会话 screen -S 名字 tmux new -s 名字 列出所有会话 screen -ls tmux ls 重新连接会话 screen -r 名字 tmux attach -t 名字 detach&#xff08;后台运行&#xff…

【毕业设计】基于springboot的日报管理系统设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

欧洲百年品牌瀚德凯尔:专注座椅电梯,提升老年人生活质量

View Post欧洲百年品牌瀚德凯尔:专注座椅电梯,提升老年人生活质量瀚德凯尔是Savaria Group(萨瓦瑞亚集团)旗下品牌,专注于无障碍通行设备领域,品牌自1886年创立以来,始终专注于为老年人与行动不便人士提供安全、便…

Java毕设项目:基于springboot的民宿客房管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

第七章 服务拆分与边界定义

第七章 服务拆分与边界定义 服务拆分是微服务架构中最具挑战性的任务,也是最容易犯错的地方。我见过太多团队把微服务做成了"分布式单体",服务之间耦合严重,部署和运维复杂度急剧上升。这一章,我想分享一…

【计算机毕业设计案例】基于springboot的民宿房间预约管理系统设计与实现民宿客房管理系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【毕业设计】基于springboot的民宿客房管理系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

C++大模型SDK开发实录(三):流式交互协议SSE解析与httplib实现原理

目录 前言第一章&#xff1a;即时通信的基石——SSE协议解析1.1 为什么选择SSE&#xff1f;1.2 SSE数据格式 第二章&#xff1a;协议选型——SSE vs WebSocket2.1 轮询与WebSocket的局限2.2 技术特性对比 第三章&#xff1a;cpp-httplib的流式处理机制3.1 普通响应与流式响应的…

算法围猎下的App渠道归因如何去伪存真?

为什么你的精准广告&#xff0c;总能避开所有真客户&#xff1f; 这是一个让无数营销人深感挫败的“数字化悖论”。近日&#xff0c;行业资深观察者“老泡”的一篇深度述评引发了移动营销圈的强烈共鸣。文章指出&#xff0c;当品牌方沉溺于由算法编织的完美投流报表——百分百匹…

【课程设计/毕业设计】java基于springboot的民宿预约管理平台系统基于springboot的民宿客房管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

我花6千块考下PMP一年后,聊聊它到底值不值

一、给想靠PMP涨薪的普通人&#xff1a;这3千值不值&#xff1f; 先上结论&#xff1a;别急着交钱&#xff0c;PMP对某些人是跳板&#xff0c;对另一些人可能就是“纸”。 去年我考下PMP&#xff0c;花了6K元&#xff08;培训2200考试费3900元&#xff09;&#xff0c;不算3个…

系统规划与管理师必看:2026年监控工具选型与实施指南

一、监控工具定义与核心内容 监控工具是用于实时采集、分析、展示和预警信息系统运行状态的技术手段&#xff0c;其核心目标是确保系统稳定性、性能达标及资源高效利用。在当今数字化快速发展的时代&#xff0c;信息系统已成为企业运营的核心支撑&#xff0c;一旦出现故障或性…

VL22 根据状态转移图达成时序电路

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

151. 反转字符串中的单词-day08

题目:151. 反转字符串中的单词 题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/ 思路:1. 去除字符串的首尾空格,中间保留一个空格 2. 整个字符串全部反转 3. 根据空格,反转字符串…

学习进度 6

今天重点搞懂了昨天没明白的 Padding 和 Stride,Padding 就是在图像边缘补像素,防止卷积后特征图变小、边缘特征丢失,Stride 就是卷积核滑动的步长,步长设大一点特征图会更小,计算更快,试了下把步长从 1 改成 2,…

基于深度学习的苹果检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)

本文介绍了一套基于YOLO系列算法的苹果检测系统,该系统支持图片、视频和实时摄像头检测,具备多模型切换、结果可视化与统计等功能。系统采用Python3.10开发,前端使用PyQt5,数据库为SQLite,支持YOLOv5/v8/v11/v12等…