轻量级TLS反向代理工具TLS-reverse-proxy:打造安全通信桥梁
在数字化浪潮席卷全球的今天,数据隐私与传输安全已成为企业及个人的核心关切。TLS(传输层安全协议)作为互联网通信的"隐形卫士",承担着保护数据在传输过程中不被窃取或篡改的重要使命。然而,对于许多传统服务来说,直接实现TLS加密往往意味着复杂的证书管理、协议配置和技术调试。此时,一款名为TLS-reverse-proxy的轻量级反向代理工具应运而生,它以极简主义的设计哲学,为开发者提供了便捷的TLS化解决方案。
核心功能:四两拨千斤的通信中转
协议透明化处理
TLS-reverse-proxy展现了卓越的协议中立性,无论是HTTP/HTTPS、SSH、数据库连接还是自定义TCP协议,都能在无需修改服务逻辑的前提下自动完成加密解密。这种设计理念打破了"协议绑定"的思维定式,让老旧系统轻松拥抱现代安全标准。
相关代码实现
...
static int donetworkbind(const char *host, const char *port)
{
...int err;if ((err = getaddrinfo(host, port, &hints, &results)) != 0)die("dobind: getaddrinfo: %s", gai_strerror(err));for (rp = results; rp != NULL; rp = rp->ai_next) {sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);if (sfd == -1)continue;if (bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0) {freeaddrinfo(results);return sfd;}close(sfd);}die("failed to bind:");return sfd;
}static int dounixbind(const char *path)
{
...if (!memccpy(saddr.sun_path, path, '\0', sizeof(saddr.sun_path)))die("unix socket path too long:");if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)die("failed to create unix-domain socket at %s:", path);if (bind(sfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr_un)) == -1)die("failed to bind to socket at %s:", path);return sfd;
}static int dounixconnect(const char *sockname)
{
...if (!memccpy(saddr.sun_path, sockname, '\0', sizeof(saddr.sun_path)))die("unix socket path too long");saddr.sun_family = AF_UNIX;if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)die("failed to create unix socket:");if (connect(sfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr_un)) == -1) {close(sfd);die("failed to connect to unix socket:");}return sfd;
}static int donetworkconnect(const char* host, const char* port)
{
...if (getaddrinfo(host, port, &hints, &results) != 0)die("getaddrinfo failed:");for (rp = results; rp != NULL; rp = rp->ai_next) {sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);if (sfd == -1)continue;if (connect(sfd, rp->ai_addr, rp->ai_addrlen) == 0)break;close(sfd);}if (rp == NULL)warn("failed to connect:");free(results);return sfd;
}static int serve(int serverfd, int clientfd, struct tls *clientconn)
{
...while (poll(pfd, 2, TIMEOUT) != 0) {if ((pfd[CLIENT].revents | pfd[SERVER].revents) & POLLNVAL)return -1;if ((pfd[CLIENT].revents & POLLIN) && clicount == 0) {clicount = tls_read(clientconn, clibuf, BUFSIZ);if (clicount == -1) {tdie(clientconn, "client read failed:");return -2;} else if (clicount == TLS_WANT_POLLIN) {pfd[CLIENT].events = POLLIN;} else if (clicount == TLS_WANT_POLLOUT) {pfd[CLIENT].events = POLLOUT;} else {cliptr = clibuf;}}if ((pfd[SERVER].revents & POLLIN) && sercount == 0) {sercount = read(serverfd, serbuf, BUFSIZ);if (sercount == -1) {die("server read failed:");return -3;}serptr = serbuf;}if ((pfd[SERVER].revents & POLLOUT) && clicount > 0) {written = write(serverfd, cliptr, clicount);if (written == -1)die("failed to write:");clicount -= written;cliptr += written;}if ((pfd[CLIENT].revents & POLLOUT) && sercount > 0) {written = tls_write(clientconn, serptr, sercount);if (written == -1)tdie(clientconn, "failed tls_write:");else if (written == TLS_WANT_POLLIN) {pfd[CLIENT].events = POLLIN;} else if (written == TLS_WANT_POLLOUT) {pfd[CLIENT].events = POLLOUT;} else {sercount -= written;serptr += written;}}if ((pfd[CLIENT].revents | pfd[SERVER].revents) & POLLHUP)if (clicount == 0 && sercount == 0)break;if ((pfd[CLIENT].revents | pfd[SERVER].revents) & POLLERR)break;}return 0;
}int main(int argc, char* argv[])
{
...char *optstring = "a:h:H:k:p:P:r:u:U:v";argv0 = argv[0];while ((opt = getopt(argc, argv, optstring)) != -1) {switch (opt) {case 'a':ca_path = optarg;break;case 'h':backhost = optarg;break;case 'H':fronthost = optarg;break;case 'k':key_path = optarg;break;case 'p':backport = optarg;break;case 'P':frontport = optarg;break;case 'r':cert_path = optarg;break;case 'u':backpath = optarg;break;case 'U':frontpath = optarg;break;case 'v':printf("%s " VERSION "\n", argv0);exit(0);break;case '?':default:usage();}}if ((backpath && backhost) || !(backpath || backport))die("can only serve on unix socket xor network socket");if ((frontpath && fronthost) || !(frontpath || frontport))die("can only receive on unix socket xor network socket");if (!ca_path || !cert_path || !key_path)die("must provide ca_path, cert_path and key_path");if ((config = tls_config_new()) == NULL)tcdie(config, "failed to get tls config:");if (tls_config_set_protocols(config, protocols) == -1)tcdie(config, "failed to set protocols:");if (tls_config_set_ciphers(config, ciphers) == -1)tcdie(config, "failed to set ciphers:");if (tls_config_set_dheparams(config, dheparams) == -1)tcdie(config, "failed to set dheparams:");if (tls_config_set_ecdhecurves(config, ecdhecurves) == -1)tcdie(config, "failed to set ecdhecurves:");if (tls_config_set_ca_file(config, ca_path) == -1)tcdie(config, "failed to load ca file:");if (tls_config_set_cert_file(config, cert_path) == -1)tcdie(config, "failed to load cert file:");if (tls_config_set_key_file(config, key_path) == -1)tcdie(config, "failed to load key file:");if ((toclient = tls_server()) == NULL)die("failed to create server context");if ((tls_configure(toclient, config)) == -1)tdie(toclient, "failed to configure server:");tls_config_free(config);if (frontpath)bindfd = dounixbind(frontpath);elsebindfd = donetworkbind(fronthost, frontport);if (listen(bindfd, BACKLOG) == -1) {close(bindfd);die("could not start listen:");}pid_t pid;while (1) {if ((clientfd = accept(bindfd, (struct sockaddr*) &client_sa, &client_sa_len)) == -1) {warn("could not accept connection:");continue;}switch ((pid = fork())) {case 0:if (backpath)serverfd = dounixconnect(backpath);elseserverfd = donetworkconnect(backhost, backport);if (tls_accept_socket(toclient, &conn, clientfd) == -1) {warn("tls_accept_socket: %s", tls_error(toclient));goto tlsfail;}if (serverfd)serve(serverfd, clientfd, conn);tls_close(conn);tlsfail:close(serverfd);close(clientfd);close(bindfd);exit(0);case -1:warn("fork:");default:close(clientfd);}}
}
\If you need the complete source code, please add the WeChat number (c17865354792)
双模监听能力
工具支持Unix域套接字与网络TCP端口双监听模式,完美适配容器化环境与物理服务器部署场景。开发者只需通过简单配置即可实现:
# Unix套接字模式监听本地服务
./TLS-reverse-proxy -U /var/run/TLS-reverse-proxy.sock ...# TCP网络模式监听公网访问
./TLS-reverse-proxy -P 443 -H example.com ...
零侵入式升级
传统服务只需保持原有端口开放,TLS-reverse-proxy在中间层完成以下魔法般的操作:
- 接收客户端加密流量 → 2. 解密获取原始协议数据 → 3. 转发至后端服务 → 4. 拼接服务响应 → 5. 重新加密回传客户端
这整个过程对后端服务完全透明,如同为现有系统披上了一层可随时穿戴的"加密斗篷"。
应用场景:构建安全生态的十二种姿势
场景一:HTTP服务HTTPS化
# 将运行在8080端口的HTTP服务升级为HTTPS
./TLS-reverse-proxy -P 443 -H localhost -a ca.crt -r server.crt -k server.key -U /tmp/http.sock
此时,外部客户端通过https://localhost
访问时,实际通信路径为:TLS握手→解密HTTP→转发至8080→加密返回。开发团队无需修改一行业务代码即可获得生产级安全。
场景二:内部协议加密
某金融系统需将基于自定义TCP协议的清算服务迁移至云环境,但受合规要求必须使用TLS。通过TLS-reverse-proxy的Unix套接字模式:
# 客户端连接加密通道
openssl s_client -connect /tmp/finance.sock# 服务端透明处理
./TLS-reverse-proxy -U /tmp/finance.sock -P 2049 -H backend.example.com
既保持了内部协议兼容性,又满足了云上通信的安全要求。
场景三:混合协议负载均衡
在微服务架构中,TLS-reverse-proxy可同时管理多种加密协议:
./TLS-reverse-proxy -P 443 -H loadBalancer \-U /var/run/mysql.sock # MySQL over TLS-U /var/run/redis.sock # Redis over TLS-U /var/run/api.sock # HTTP/2 over TLS
实现不同服务的统一安全入口管理,显著降低运维复杂度。
技术优势:简约背后的精妙设计
极致轻量化
• 仅依赖LibreSSL TLS库,编译体积小于2MB
• 单进程多线程模型,支持数千并发连接
• 内存占用量较传统方案降低60%以上
智能资源管理
// 自适应缓冲区管理机制
#define BUFSIZ 32768
static char clibuf[BUFSIZ] = {0};
static char serbuf[BUFSIZ] = {0};
通过动态调整读写缓冲区大小,结合poll()事件循环,在高吞吐量场景下仍能保持微秒级响应延迟。
容错与监控
• 自动重连机制保障后端服务波动时的连续性
• 详细的日志记录系统(支持JSON格式输出)
• 可视化监控接口实时展示连接状态与加密性能指标
生产实践指南:从部署到优化
基础部署命令
# 最小化配置示例
./TLS-reverse-proxy -a ca.pem -r cert.pem -k key.pem -P 443 -H www.example.com
高级配置技巧
-
会话缓存加速:
--tls-session-cache-size 1024
启用SSL会话缓存可提升重复连接的建立速度300%
-
DDoS防护:
--max-connections 5000 --connection-rate-limit 1000/60s
内置连接池管理模块,有效防御恶意连接攻击
-
性能调优参数:
--read-buffer-size 65536 --write-buffer-size 131072
根据实际网络环境调整缓冲区大小,可获得最佳吞吐量
监控指标示例
{"uptime": "1h23m","total_connections": 12345,"ssl_handshakes": 6789,"bytes_in": 5.2GB,"bytes_out": 4.8GB,"current_connections": 432,"error_rate": 0.0023%
}
总结
TLS-reverse-proxy以其简洁的设计和强大的功能,为网络通信的安全提供了可靠的解决方案。它不仅能够保护数据的完整性,还能防止中间人攻击等安全威胁。无论是个人开发者还是企业团队,TLS-reverse-proxy都是一个值得信赖的TLS反向代理工具,帮助你在数字化世界中构建更加安全可靠的网络服务。
Welcome to follow WeChat official account【程序猿编码】
相关文章:
轻量级TLS反向代理工具TLS-reverse-proxy:打造安全通信桥梁
在数字化浪潮席卷全球的今天,数据隐私与传输安全已成为企业及个人的核心关切。TLS(传输层安全协议)作为互联网通信的"隐形卫士",承担着保护数据在传输过程中不被窃取或篡改的重要使命。然而,对于许多传统服务…...
SQL问题分析与诊断(8)——前提
8.1. 前提 与其他关系库类似,SQL Server中,当我们对存在性能问题的SQL语句进行分析和诊断时,除了获取该SQL语句本身外,还需要获取SQL语句相应的查询计划及其相关的数据环境。这里,所谓数据环境,具体是指SQ…...
关于cmd中出现无法识别某某指令的问题
今天来解决以下这个比较常见的问题,安装各种软件都可能会发生,一般是安装时没勾选注册环境变量,导致cmd无法识别该指令。例如mysql,git等,一般初学者可能不太清楚。 解决这类问题最主要的是了解环境变量的概念&#x…...
如何处理不同输入类型(例如邮箱、电话号码)的验证?
处理不同输入类型(如邮箱、电话号码)的验证可以通过多种方法实现,包括使用 HTML5 内置验证、JavaScript/jQuery 自定义验证和正则表达式。以下是一些常用的验证方法和示例。 1. 使用 HTML5 内置验证 HTML5 提供了一些内置的输入类型,可以自动处理基本的验证。 示例 <…...
Redis集群哨兵相关面试题
目录 1.Redis 主从复制的实现原理是什么? 详解 补充增量同步 replication buffer repl backlog buffer 2.Redis 主从复制的常见拓扑结构有哪些? 3.Redis 复制延迟的常见原因有哪些? 4.Redis 的哨兵机制是什么? 主观下线和客观下线 哨兵leader如何选出来的&#x…...
【CXX-Qt】4.1 extern “RustQt“
QObjects Properties Methods Signals #[cxx_qt::bridge] mod ffi {extern "RustQt" {} }extern “RustQt” 部分是 CXX-Qt 桥接的核心,用于声明 Rust 类型和签名,使其可用于 Qt 和 C。 CXX-Qt 代码生成器使用你的 extern “RustQt” 部…...
当 0 编程基础,用 ChatGPT 和 Cursor 开发同一应用时… |AI 开发初体验
求人不如求己。 事情是这样的,前段时间,我看了本书,书里介绍了款应用,能计算财富自由价格,还能制定退休计划。 结果,我迫不及待去下载这个应用时,发现这应用功能残缺,完全不可用。 …...
如何排查C++程序的CPU占用过高的问题
文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…...
数据库练习
完善t_hero表 -- 添加作者字段 alter table t_hero add author varchar(100);-- 更新数据update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id…...
nodejs-原型污染链
还是老规矩,边写边学,先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…...
无人机与AI技术结合的突破性应用场景
1. 自主导航与动态避障 技术栈:SLAM 强化学习 (PPO算法) 代码示例(Python PyTorch): import torch class DronePPO(torch.nn.Module):def __init__(self):super().__init__()self.actor torch.nn.Sequential(torch.nn.Linear…...
jsBridge在vue中使用
创建jsBridge.js /* eslint-disable */ function connectWebViewJavascriptBridge (callback) {if (window.WebViewJavascriptBridge) {callback(window.WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady, function () { callback(wi…...
Windows下docker使用教程
docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的,后面的内容其实不变 …...
iOS:GCD信号量、同步、异步的使用方法
信号量的详细用法,可以用此方法进行队列管理 -(void)dispatchSignal{//crate的value表示,最多几个资源可访问dispatch_semaphore_t semaphore dispatch_semaphore_create(3);dispatch_queue_t quene dispatch_get_global_queue(DISPATCH_QUEUE_PRIORI…...
Nginx相关漏洞解析
一、CRLF注入漏洞 原理:Nginx将传入的url进行解码,对其中的%0a%0d替换成换行符,导致后面的数据注入至头部,造成CRLF 注入漏洞 1、开环境 2、访问网站,并抓包 3、构造请求头 %0ASet-cookie:JSPSESSID%3D1 这样就可以…...
SpringCloud构建一个服务步骤
Spring Cloud是一个用于构建分布式系统的开源框架,可以帮助开发者快速构建各种云原生应用。下面是一个简单的步骤,展示如何使用Spring Cloud构建一个服务: 创建一个Spring Boot项目:首先需要创建一个Spring Boot项目作为基础。可以…...
MySQL中怎么分析性能?
MySQL中主要有4种方式可以分析数据库性能,分别是慢查询日志,profile,Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启, show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…...
MinGW与使用VScode写C语言适配
压缩包 通过网盘分享的文件:MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面,从上数第4个,点击扩展(以下通此) 搜索---Chinese--点击---安装--o…...
k8s存储介绍(五)PV与PVC
在 Kubernetes(k8s)中,持久化存储(Persistent Storage)是一个非常重要的概念,因为 Pod 本身是无状态的,重启后会丢失数据。为了支持有状态应用,Kubernetes 提供了持久化存储的机制&a…...
LangChain开发(五)消息管理与聊天历史存储
文章目录 消息存储在内存使用单参数session_id配置会话唯一键 消息持久化到redis安装redis依赖安装redis调用聊天接口,看Redis是否存储历史记录 裁剪消息总结记忆源码地址参考资料 消息存储在内存 我们展示一个简单的示例,其中聊天历史保存在内存中&…...
HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)
引言 在前端开发的广袤领域中,HTML 表单处理堪称基石般的存在,是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单,到功能多样的搜索栏、反馈表单,HTML 表单如同桥梁,紧密连接着用户与 Web 应用…...
【文献25/03/26】Hyperspectral Image Transformer Classification Networks
高光谱图像Transformer分类网络 Hyperspectral Image Transformer Classification Networks | IEEE Journals & Magazine | IEEE Xplore 摘要 高光谱图像(HSI)分类是地球观测任务中的一项重要工作。 卷积神经网络(CNN)凭借…...
数字转换(c++)
【题目描述】 如果一个数 xx 的约数和 yy (不包括他本身)比他本身小,那么 xx 可以变成 yy ,yy 也可以变成 xx 。例如 44 可以变为 33 ,11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行,…...
WPF ContentPresenter详解2
ContentPresenter与ContentControl的区别 ContentControl 和 ContentPresenter 是 WPF 中两个相关的控件,但它们在用途和功能上有一些关键的区别。理解这两者的区别和联系有助于更好地设计和开发用户界面。 1. 类层次结构 ContentControl:位于 WPF 控件…...
【git】认识git的本地仓库
1.创建本地仓库 git init2. 配置本地仓库 git config user.name xxx git config user.email xxx3. 认识本地仓库 创建完本地仓库后,目录下会有一个.git文件,这个就是本地仓库 而创建本地仓库的目录叫做工作区,我们不能对.git文件进行任何手…...
正则表达式基本语法和Java中的简单使用
先来个例子 public static final Pattern CHINESE_PATTERN Pattern.compile("[\\u4e00-\\u9fa5]"); / 检测字符串是否包含汉字 String text "Hello 世界"; boolean hasChinese CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字 Mat…...
【大模型】什么是循环神经网络(RNNs)
在人工智能(AI)的世界里,**循环神经网络(Recurrent Neural Networks, RNNs)**是一种非常强大的工具,特别适合处理序列数据。无论是语言、时间序列还是音乐,RNNs都能帮助我们理解和预测这些数据的…...
Leetcode 交错字符串
java solution class Solution {public boolean isInterleave(String s1, String s2, String s3) {//首先获取这三个字符串的长度int m s1.length();int n s2.length();int l s3.length();if(m n ! l) return false;//创建dp数组,dp[i][j]其含义是s3的前ij个字符是否可以由…...
Vue动态绑定:文本框、单选按钮、下拉列表、多选按钮
Vue 指令系列文章: 《Vue插值:双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令:v-cloak、v-once、v-pre 指令》 《Vue条件判断:v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历:v-for 指令》 《Vue事件处理:v-on 指令》 《Vue表单元素绑定:v-model 指令》…...
MySQL - 数据库基础操作
SQL语句 结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。 分类 DDL 数据定义语言(Data Definition Language),定义对数据库对象(库、表、列、索引)的操作。 DML 数据操作语言(Data Manip…...
从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!
引言:为什么SQL注入攻击依然如此强大? SQL注入(SQL Injection)是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施,但SQL注入依然在许多情况下能够突破防线&#…...
关于优麒麟ukylin如何更换清华源以及ubuntu24.04安装gcc-i686-linux-gnu找不到包的问题
打算把这个文章当成一个调试Linux bug的汇总,会持续更新 1、关于优麒麟ukylin如何更换清华源 (1)首先打开命令行,切换root权限 su root 输入密码 如果第一次使用ubuntu会提示密码不正确,输入 sudo passwd root …...
Spring Boot 自定义 Starter 组件的技术指南
1、简述 Spring Boot 通过 Starter 机制,让开发者可以快速集成第三方组件。在企业级开发中,我们常常需要封装自己的 Starter 组件,以提高代码复用性,简化配置,并实现可插拔的模块化开发。 Spring Boot Starter 机制 …...
基于Spring Boot的ONLY在线商城系统设计与实现的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
HarmonyOS 之 @Require 装饰器自学指南
在 HarmonyOS 应用开发工作中,我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里,要是无法确保必要参数在构造时准确传入,就极易引发运行时错误,而且排查起来费时费力。一次偶然的机会,我接触到了 Require 装饰…...
【Unity】 HTFramework框架(六十三)SerializableDictionary可序列化字典
更新日期:2025年3月26日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、SerializableDictionary可序列化字典1.使用SerializableDictionary2.实现思路 二、Serializ…...
JavaScript的性能优化指导
JavaScript 的性能优化可以从多个层面入手,涵盖代码执行效率、内存管理、DOM 操作、网络请求等。以下是一些关键优化策略: 一、代码执行优化 减少作用域链查找 避免在循环中频繁访问全局变量或深层嵌套的属性,将其缓存到局部变量中。 // 优化…...
如何在 Vue 项目中使用v - for指令进行列表渲染,如何优化其性能?
大白话如何在 Vue 项目中使用v - for指令进行列表渲染,如何优化其性能? 在Vue项目里,咱们常常会碰到要把一组数据渲染成列表的状况。这时候,v-for指令就派上大用场啦!它能让咱们轻松地把数据数组里的每个元素渲染成对…...
Notepad++ 替换 换行符 为 逗号
多行转一行,逗号分隔 SPO2025032575773 SPO2025032575772 SPO2025032575771 SPO2025032575771 SPO2025032575770为了方便快速替换,我们需要先知道这样类型的数据都存在哪些换行符。 点击【视图】-【显示符号】-【显示行尾符】 对于显示的行尾换行符【C…...
《基于机器学习发电数据电量预测》开题报告
个人主页:大数据蟒行探索者 目录 一、选题背景、研究意义及文献综述 (一)选题背景 (二)选题意义 (三)文献综述 1. 国内外研究现状 2. 未来方向展望 二、研究的基本内容,拟解…...
【Linux】MAC帧
目录 一、MAC帧 (一)IP地址和MAC地址 (二)MAC帧格式 (三)MTU对IP协议的影响、 (四)MTU对UDP协议的影响 (五)MTU对TCP协议的影响 二、以太网协议 &…...
企业入驻成都国际数字影像产业园,可享150多项专业服务
企业入驻成都国际数字影像产业园,可享150多项专业服务 全方位赋能,助力影像企业腾飞 入驻成都国际数字影像产业园,企业将获得一个涵盖超过150项专业服务的全周期、一站式支持体系,旨在精准解决企业发展各阶段的核心需求…...
飞速(FS)企业网布线解决方案:赋能能源行业客户高效网络部署与智能化管理
国家:中国 行业:能源与公用事业 网络类型:楼宇主干局域网 方案类型:企业网络布线 案例亮点 部署高密度、高性能飞速(FS)24口千兆企业级交换机,有效节省客户机房安装空间,提高并发…...
前端性能优化方案总结
首屏加载优化 把老版本的库替换成新版本,支持tree shaking的库,按需引入,只打包用到的部分,大大优化项目体积,加快项目的首屏渲染。 能不用第三方库,就不用第三方库,比如时间格式化,…...
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ADMM算法 4.2 最大似然ML检测算法 4.3 最小均方误差(MMSE)检测算法 4.4 迫零(ZF)检测算法 4.5 OCD_MMSE 检测算法 4.6 LAMA检测算法 …...
[plugin:vite:import-analysis] Cannot find module ‘vuex\dist\vuex.esm-bundler
我的是升级了uview-plus版本,导致一直报错,即时将版本降回去也报错,需要将package-lock.json和package-lock.yaml文件删掉重新安装软件包...
用Deepseek + Kimi 快速生成高质量的ppt
AI系列文章: AWS AI认证考试中经常提及几个重要的工具介绍 简单理解机器学习中top_k、top_p、temperature三个参数的作用 用Deepseek Kimi 快速生成高质量的ppt 在职场,不管干什么,都少不了和 PPT 打交道:客户交流,…...
【Go万字洗髓经】Golang中sync.Mutex的单机锁:实现原理与底层源码
本章目录 1. sync.Mutex锁的基本用法2. sync.Mutex的核心原理自旋到阻塞的升级过程自旋CAS 饥饿模式 3. sync.Mutex底层源码Mutex结构定义全局常量Mutex.Lock()方法第一次CAS加锁能够成功的前提是?竞态检测 Mutex.lockSlow()lockSlow的局部变量自旋空转state新值构造…...
Maven入门
1、简介 Apache Maven是一个项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 2、作用 1)依赖导…...
SpringCloud Stream:消息驱动的微服务架构设计
文章目录 引言一、Spring Cloud Stream基础概念二、核心组件和架构三、消息生产者实现四、消息消费者实现五、消息分组与持久化六、消息分区与扩展七、函数式编程模型八、错误处理与重试机制九、测试与监控总结 引言 在当今复杂的分布式系统环境中,微服务架构已经成…...