网络HTTPS协议
Https
HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 协议的加密版本,它使用 SSL/TLS 协议来加密客户端和服务器之间的通信。具体来说:
• 加密通信:在用户请求访问一个 HTTPS 网站时,客户端(如浏览器)和服务器通过 SSL/TLS 握手 来建立一条加密的通道。这个过程包括证书验证、密钥交换等步骤,最终生成一个用于加密的会话密钥。
• 数据加密:一旦加密通道建立,浏览器和服务器之间的所有通信数据都会使用对称加密技术(如 AES)加密。这意味着即使中间人(例如攻击者)截获了通信数据,他们也无法轻易解密这些数据,因为没有会话密钥。
为什么抓包工具能解密流量?
抓包工具(如 Charles, Fiddler, Wireshark 等)能够解密 HTTPS 流量,通常是因为它们 充当了一个代理服务器,而这个代理需要安装在用户的设备上并且信任其证书。
具体来说:
• 代理模式:这些抓包工具通过设置为用户的代理(HTTP 或 HTTPS 代理),让所有的流量首先经过这些工具,然后由工具转发到目标服务器。
• 证书安装和信任:抓包工具会在本地生成自己的 中间人证书,并要求用户安装该证书到浏览器或操作系统的受信任根证书列表中。这样,抓包工具就可以解密和重新加密数据。
• 解密流量:
-
用户请求 HTTPS 网站时,抓包工具充当一个中间人(man-in-the-middle)。
-
抓包工具与目标服务器建立 HTTPS 连接(此时它会验证服务器证书并加密通信)。
-
抓包工具与用户的浏览器之间再建立一个 HTTPS 连接(并使用抓包工具自己的证书加密通信)。
-
由于用户信任抓包工具的证书,浏览器认为它与真正的服务器建立了加密通道,因此不会警告或报错。
谷歌浏览器的开发者工具(F12)
浏览器的开发者工具(如谷歌 Chrome 的 F12)也能抓取 HTTPS 请求,但这并不是因为它解密了流量,而是因为浏览器本身 能够查看请求和响应的元数据。
• 浏览器在发送 HTTPS 请求时,会将数据加密并发送到目标服务器,但服务器的响应会被加密并发送回浏览器。此时,浏览器解密响应并显示在开发者工具中。
• 所以,当你在 开发者工具的 Network 面板 查看请求时,你看到的是 浏览器已解密后的数据,而不是中间人攻击的结果。这里的流量是浏览器自己解密的,目的是供开发者查看。
请求
发送了一个简单的 HTTP POST 请求,但在背后会涉及到一些额外的网络层级的操作,包括 TCP 三次握手 和 四次挥手,还有 SSL/TLS 握手 的过程。这些操作会稍微增加请求的延迟。
TCP 三次握手(Three-Way Handshake)
当你发出一个 HTTP POST 请求时,它首先会建立一个 TCP 连接。TCP 是一个面向连接的协议,所以在客户端与服务器之间建立连接时,会经过三次握手:
-
客户端 -> 服务器:客户端发送一个 SYN(同步)包来请求建立连接。
-
服务器 -> 客户端:服务器响应一个 SYN-ACK(同步-确认)包,表示它准备好与客户端通信。
-
客户端 -> 服务器:客户端再发送一个 ACK(确认)包,表示连接建立成功。
这三次握手完成后,客户端和服务器之间就可以开始数据传输了。
SSL/TLS 握手(建立加密通道)
在 HTTPS(而不是 HTTP)中,所有的 HTTP 请求都会先通过 SSL/TLS 握手 来加密通信。这个过程也需要一定的时间,但它是为了确保通信的安全性。具体过程如下:
- 客户端 -> 服务器:客户端发送一个包含自己支持的加密算法和其他配置信息的 ClientHello 消息。
客户端(浏览器、curl 或其他工具)会发送一个 ClientHello 消息给服务器,包含:
• 支持的加密算法(如 AES、RSA、ECDHE 等)。
• 支持的 SSL/TLS 版本。
• 随机数,用于加密密钥的生成。
• 支持的扩展(例如 SNI,服务器名称指示)。
加密套件的选择:不同客户端会支持不同的加密算法。
• TLS 版本:例如,Chrome 可能会首先尝试使用最新的 TLS 版本(如 TLS 1.3),而 curl 可能会允许更多的 TLS 版本(如 TLS 1.2 或 1.3)。
• SNI(服务器名称指示):浏览器和工具通常会带上 SNI 信息来告诉服务器想访问的虚拟主机名。(例如 Chrome),它会通过多次优化过的策略来减少加密握手的时间和带宽消耗。例如,Chrome 可能会在一定条件下使用 Session Resumption 或 TLS 0-RTT 来加速后续请求,避免每次都重新进行握手。
- 服务器 -> 客户端:服务器根据客户端的请求选择一种加密算法并发送 ServerHello 消息,并发送自己的证书(包含公钥)来让客户端验证服务器身份。
回复一个 ServerHello 消息,包含:
• 选择的加密算法和协议。
• 服务器证书(公钥)用于加密。
• 随机数。
- 客户端 -> 服务器:客户端生成一个 Pre-Master Secret,用服务器的公钥加密后发送给服务器。然后,客户端和服务器通过这个 Pre-Master Secret 计算出加密会话密钥。
• 如果是对称加密(例如使用 RSA 或 ECDHE),客户端会使用服务器的公钥加密一个共享密钥(pre-master secret)。
• 服务器解密并生成最终的对称加密密钥。
- 服务器 -> 客户端:服务器解密这个 Pre-Master Secret,并且确认双方可以使用相同的会话密钥进行加密通信。
一旦 SSL/TLS 握手 完成后,数据的加密和解密可以开始,通信将使用 对称加密(如 AES)进行。
TCP 四次挥手(Four-Way Handshake)
当通信结束时,连接需要关闭。这个过程需要 四次挥手 来完成:
-
客户端 -> 服务器:客户端发送一个 FIN(结束)包,表示它要关闭连接。
-
服务器 -> 客户端:服务器确认收到 FIN 包,并发送一个 ACK(确认)包,表示连接半关闭。
-
服务器 -> 客户端:服务器发送一个 FIN 包,表示服务器也准备关闭连接。
-
客户端 -> 服务器:客户端确认收到服务器的 FIN 包,并发送一个 ACK 包,表示连接完全关闭。
每个新的连接都会进行一次握手:如果浏览器或工具每次都建立新的连接(没有复用连接),每次请求都会重新进行 SSL/TLS 握手。
• 连接复用:在 HTTP/2 或 HTTP/1.1 keep-alive 下,多个请求可以复用同一个连接,减少握手的频率。
http1.1 与http 2
HTTP(Hypertext Transfer Protocol,超文本传输协议)是 Web 通信的基础,目前主要使用的版本有 HTTP/1.1 和 HTTP/2
如果你没有配置 keepalive_timeout,Nginx 使用默认值:
• keepalive_timeout 默认 75 秒
• keepalive_requests 默认 100 【nginx -T | grep keepalive】
server {listen 443 ssl http2;server_name model.abc.com;ssl_certificate /home/ubuntu/crt_ssl/model.abc.com.crt;ssl_certificate_key /home/ubuntu/crt_ssl/model.abc.com.key;ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305-SHA256';ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;# 配置 `keep-alive`keepalive_timeout 65; # 65 秒内可以复用 TCP 连接keepalive_requests 100; # 允许 100 次请求复用同一个连接location / {proxy_pass http://localhost:3000; # Django 后端容器proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}server {listen 443 ssl http2;server_name abc.com;ssl_certificate /home/ubuntu/crt_ssl/abc.com.crt;ssl_certificate_key /home/ubuntu/crt_ssl/abc.com.key;ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305-SHA256';ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;location / {proxy_pass http://localhost:8004; # Django 后端容器proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
HTTP/1.1
HTTP/1.1 是 HTTP 协议的一个改进版本,解决了 HTTP/1.0 存在的一些问题:
• 支持持久连接(Keep-Alive):HTTP/1.0 每次请求都需要建立新的 TCP 连接,而 HTTP/1.1 通过 Connection: keep-alive 允许一个 TCP 连接复用多个 HTTP 请求。【在请求头有这个keep-alive】
• 支持分块传输(Chunked Transfer Encoding):允许服务器分块传输数据,提高大文件的传输效率。
• 增加 Host 头:HTTP/1.1 允许同一 IP 托管多个网站,因此 Host 头变为必填项。
FastAPI 默认是基于 Uvicorn 运行的,而 Uvicorn 默认使用的是 HTTP/1.1,但是:
• 如果你用 HTTPS(TLS 加密),并且启用了 HTTP/2,Uvicorn 也可以支持 HTTP/2。
• 但是如果你是在 Nginx 代理 FastAPI,那么 HTTP/2 主要由 Nginx 负责,FastAPI 依然是 HTTP/1.1。
HTTP/1.1 默认是长连接,即:
• 服务器返回 Connection: keep-alive[ Keep-Alive: timeout=5, max=100,表示 5 秒后关闭连接。]
• 只要客户端愿意,TCP 连接可以复用,不用每次请求都新建一个连接
• 但是 HTTP/1.1 仍然有队头阻塞问题,所以浏览器一般会开多个 TCP 连接(每个域名 6-8 个)
HTTP/2
HTTP/2 主要目标是提升 Web 性能,它在 HTTP/1.1 的基础上做了大量优化,最重要的特性包括:
- 多路复用(Multiplexing)
• HTTP/2 通过 “帧”(Frame) 的概念,将 HTTP 请求拆分成多个流(Stream),在一个 TCP 连接中可以同时发送多个请求。 HTTP/2 解决了 HTTP/1.1 在应用层的队头阻塞,但仍然依赖 TCP 连接【流式】。如果 TCP 层丢包,会导致整个 HTTP/2 连接受影响。所以 HTTP/3 进一步采用 QUIC 协议,彻底规避了这个问题。
• 这样就解决了 HTTP/1.1 的队头阻塞问题,一个请求的慢速不会影响其他请求。
- 头部压缩(HPACK)
• HTTP/2 采用 HPACK 算法,对头部进行哈夫曼编码(Huffman Coding),避免重复传输相同的 Header 信息,大幅减少带宽消耗。
- 服务器推送(Server Push)
• 服务器可以主动将客户端可能需要的资源推送到浏览器,而不需要客户端先请求,减少延迟。例如,在请求 index.html 时,服务器可以提前推送 CSS、JS 文件。
- 流优先级控制
• HTTP/2 允许客户端为请求分配不同的优先级,保证关键资源(如 CSS、JavaScript)优先加载,提高页面渲染速度。
• 依赖 TLS(HTTPS):虽然 HTTP/2 协议本身并不强制加密,但主流浏览器要求 HTTP/2 必须 使用 TLS(HTTPS)。
因为 HTTP/2 本身就是长连接!
• HTTP/2 默认复用 TCP 连接,不需要 Connection: keep-alive 这个标识。
• 浏览器只要发现服务器支持 HTTP/2,它就会一直复用这个连接,直到服务器主动关闭。
• 因此,在 HTTP/2 响应头中,你不会看到 Connection: keep-alive
浏览器访问 API 时:如果 HTTP/2 可用,TCP 连接是可以复用的。
• 非浏览器环境(比如 Python requests、Postman、curl):
• 默认不会复用,因为每次请求都会重新创建连接。
• 但是如果你使用 HTTP/1.1 且加了 keep-alive,则有可能复用(但这取决于 HTTP 客户端是否支持)。
• 使用 httpx、requests 这些库时,你需要手动启用连接池来复用连接。
连接复用
TCP 连接复用 本质上就是 在一定时间内,浏览器或客户端不会每次都重新建立 TCP 连接(或者 SSL/TLS 握手),而是复用现有的连接进行 HTTP 请求。
在 HTTP/1.1 下,TCP 连接默认是持久连接,也就是:
• 服务器默认不会立即关闭连接
• 浏览器会在一段时间内复用这个连接
如果客户端在 5 秒内发送了新请求,它会直接复用现有 TCP 连接,而不是重新握手。
HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: timeout=5, max=100( • timeout=5:表示服务器会等待 5 秒,如果客户端没有新的请求,就关闭连接。• max=100:最多允许复用 100 次请求。)
• 浏览器的 TCP 连接复用 是 基于 (源 IP, 源端口, 目标 IP, 目标端口) 的四元组。
• 只要 源 IP + 源端口 + 目标 IP + 目标端口 不变,连接就能复用。
• 浏览器不会复用 已经关闭的 TCP 连接,但会尽可能在 keep-alive 时间内重用它。
• NAT 设备(如家庭路由器) 会将你的内网 IP(如 192.168.1.100:54321)映射到 公网 IP(如 203.0.113.10:34567)。
• 服务器只知道 公网 IP + 端口(203.0.113.10:34567),而不知道你的本地 IP。
• NAT 设备会在内存里维护连接表,确保返回的数据包能够正确映射到你的设备。
题目
1、HTTP/2 多路复用(Multiplexing)是如何避免 HTTP/1.1 的队头阻塞(HOL Blocking)的?但为什么仍然可能存在 HOL Blocking?
在 HTTP/1.1 中,一个 TCP 连接只能串行处理请求:
• 浏览器默认最多 6-8 个 TCP 连接,但是每个连接里请求是 串行执行,导致 队头阻塞(HOL Blocking)。
• 如果前一个请求耗时较长,后续请求 必须等待,即使它们本身处理很快。
HTTP/2 解决方案:
• 引入多路复用(Multiplexing),允许一个 TCP 连接同时处理多个请求和响应,每个请求都分配一个流 ID。
• 请求之间不再是严格的顺序执行,即使前一个请求慢,后面的请求仍然可以并行传输。
但 HTTP/2 仍然可能存在 HOL Blocking:
• TCP 层的队头阻塞:HTTP/2 仍然是基于 TCP 传输的,如果 TCP 层丢包,整个 TCP 连接需要等待丢失的数据包重传,导致所有 HTTP/2 请求阻塞。
• HTTP/2 不能解决 TCP 层的 HOL Blocking,而 HTTP/3 采用 QUIC(基于 UDP),完全消除了这一问题。
2、 服务器是如何验证复用的连接是否真的来自同一个客户端?
服务器会使用 TLS 会话恢复(TLS Session Resumption) 机制:
• Session Ticket(TLS 1.2):服务器在第一次握手时生成一个加密票据(Session Ticket),存储在客户端,下次请求时客户端带上这个票据,服务器就知道它是同一个会话。
• Session ID(TLS 1.2):服务器给每个 TLS 会话分配一个 ID,客户端后续请求时可以用相同 ID 进行恢复。
• TLS 1.3 采用 PSK(Pre-Shared Key):客户端和服务器可以在 0-RTT(Zero Round Trip Time)模式下恢复会话。
这意味着:
• 即使 IP 变了,服务器仍然可以识别客户端是否是同一个会话(只要 Session Ticket 没有过期)。
• 攻击者即使伪造 IP 和端口,也无法绕过 TLS 认证。
3、连接复用时,为什么还需要 SYN-ACK?
同一个 TCP 连接在 keep-alive 时间内的请求可以共享,但一旦连接关闭,新的连接仍然需要重新握手(SYN -> SYN-ACK -> ACK)。
- 客户端(浏览器)建立 TCP 连接
• Client → SYN → Server
• Server → SYN-ACK → Client
• Client → ACK → Server
• TCP 连接建立后,客户端发送 HTTP 请求:
Client → GET /index.html HTTP/1.1 → Server
如果 keep-alive 生效,连接不会立即关闭
• 服务器返回 Connection: keep-alive,表示 TCP 连接仍然可用。
• 后续请求不会重新握手,直接复用 TCP 连接:
Client → GET /api/data HTTP/1.1 → Server
攻击者不可能劫持现有的 TCP 连接
• 连接复用是客户端和服务器维护的,攻击者无法直接插入现有的 TCP 连接,因为 TCP 连接在 NAT 内部,攻击者无法获取 NAT 的端口映射状态。
• NAT 设备有 状态表,它只允许 真正发起连接的设备 接收服务器的数据。
• 攻击者无法强行加入 NAT 设备已经维护的连接,除非 NAT 设备本身被攻破。
- 攻击者只能尝试伪造新的 TCP 连接
• 伪造 IP + 端口并不会让攻击者进入原连接,而是必须发起新的 SYN。
• 但服务器发送的 SYN-ACK 不会送到攻击者手里,而是回到 NAT 设备,导致握手无法完成。
• 这就是TCP 伪造攻击失败的核心原因。
- 即使 TCP 伪造成功,TLS 仍然会保护数据
• 在 HTTPS(TLS)连接里,TCP 连接的建立并不代表攻击成功,因为攻击者还需要完成 TLS 握手。
• TLS 握手涉及服务器证书、公私钥加密,攻击者无法伪造
• 即使攻击者能劫持 TCP 连接,他仍然无法解密数据。
相关文章:
网络HTTPS协议
Https HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 协议的加密版本,它使用 SSL/TLS 协议来加密客户端和服务器之间的通信。具体来说: • 加密通信:在用户请求访问一个 HTTPS 网站时,客户端&#x…...
0322-数据库、前后端
前端 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here</title> <script srcjs/jquery-3.7.1.min.js></script> <script> //jquaryajax发起请求 //传参形式不同 post用data{}…...
六十天前端强化训练之第二十六天之Vue Router 动态路由参数大师级详解
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. Vue Router 核心概念 2. 动态路由参数原理 3. 参数传递方案对比 二、核心代码示例 1. 完整路由配置 2. 参数接收组件 3. 导航操作示例 三、实现效果示…...
L2TP实验
一、拓朴图 二、实验配置 1.基础配置 1.1接口IP及服务配置 [PPPoE Client]interface GigabitEthernet 0/0/0 [PPPoE Client-GigabitEthernet0/0/0]service-manage all permit [NAS]interface GigabitEthernet 0/0/0 [NAS-GigabitEthernet0/0/0]ip add 192.168.0.2 24 [NAS-Gi…...
uni-app——数据缓存API
数据缓存API 在 uni-app 开发中,数据缓存 API 起着重要作用,它能够将需要的数据保存到本地,同时也提供了获取本地缓存数据、移除缓存数据以及清理缓存数据的功能。在实际项目里,数据缓存 API 常被用于存储会员登录状态信息、购物…...
不做颠覆者,甘为连接器,在技术叠层中培育智能新物种
--- 一、技术融合的必然:从“非此即彼”到“兼容共生” 当大模型的热浪撞上传统IT的礁石,企业智能化的真相浮出水面: 新旧技术的“量子纠缠”:MySQL与向量数据库共享数据总线,规则引擎与大模型共处决策链路 需求进…...
尝试在软考65天前开始成为软件设计师-计算机网络
OSI/RM 七层模型 层次名功能主要协议7应用层实现具体应用功能 FTP(文件传输)、HTTP、Telnet、 POP3(邮件)SMTP(邮件) ------- DHCP、TFTP(小文件)、 SNMP、 DNS(域名) 6表示层数据格式,加密,压缩.....5会话层建立,管理&终止对话4传输层端到端连接TCP,UDP3网络层分组传输&a…...
JDBC 连接字连接 KingbaseES支持主从负载均衡参数说明。
JDBC 连接字符串是用于连接 KingbaseES(人大金仓数据库)的,支持主从负载均衡。让我们逐一解析各个参数的作用,并探讨如何调整到最优。 参数解析 jdbc:kingbase8://10.10.14.19:54321/xxx_onlinejdbc:kingbase8://:指定…...
OpenCV旋转估计(4)生成一个字符串表示的匹配图函数 matchesGraphAsString()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 matchesGraphAsString 函数是OpenCV库中的一部分,位于 cv::detail 命名空间下。这个函数的主要作用是生成一个字符串表示的匹配图&am…...
扣子平台知识库不能上传成功
扣子平台知识库不能上传成功 目录 扣子平台知识库不能上传成功查看模板复制头部到自己的excel中json数据转为excel或者csv(一定使用excel,csv总是报错) 查看模板复制头部到自己的excel中 json数据转为excel或者csv(一定使用excel&…...
CIFAR10 数据集自定义处理方法
CIFAR10 数据集自定义处理方法 可以自定义训练集和测试集中不同类别的样本的数量。可用于模拟类别不平衡问题,存在混淆数据问题。 import torch import torchvision.datasets as dsets import torchvision.transforms as transforms from torch.utils.data import…...
当发现提示少文件,少目录时时,external.css的内容
[ERROR ]17:30:44| Loger: 处理群消息时发生错误:[Errno 2] No such file or directory: \\venv\\lib\\site-packages\\ncatbot\\utils\\template/external.css venv\\lib\\site-packages\\ncatbot\\utils\\template/external.css ["https://stackpath.boots…...
OpenHarmony 开源鸿蒙北向开发——linux使用make交叉编译第三方库
这几天搞鸿蒙,需要编译一些第三方库到鸿蒙系统使用。 头疼死了,搞了一个多星期总算搞定了。 开贴记坑。 一、SDK下载 1.下载 在linux下使用命令 wget https://cidownload.openharmony.cn/version/Master_Version/OpenHarmony_5.1.0.54/20250313_02…...
【计算机网络】网络简介
文章目录 1. 局域网与广域网1.1 局域网1.2 广域网 2. 路由器和交换机3. 五元组3.1 IP和端口3.2 协议3.3 协议分层 4. OSI七层网络协议5. TCP/IP五层模型5.1 TCP/IP模型介绍5.2 网络设备所在分层 6. 封装与分用6.1 数据包的称谓6.2 封装6.3 分用 1. 局域网与广域网 1.1 局域网 …...
k8s--集群内的pod调用集群外的服务
关于如何让同一个局域网内的Kubernetes服务的Pod访问同一局域网中的电脑上的服务。 可能的解决方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs,或者直接使用Pod网络。每种方法都有不同的适用场景,需要逐一分析。 例如&…...
高性能边缘计算网关-高算力web组态PLC网关
高性能EG8200Pro边缘计算算力网关-超强处理能力 样机申请测试:免费测试超30天(https://www.iotrouter.com/prototype/) 产品主要特点和特色功能 设备概览与连接能力 设备型号:EG8200P。主要特点: 支持多种工业协议&am…...
计算机视觉总结
以下是针对上述问题的详细解答,并结合代码示例进行说明: 1. 改进YOLOv5人脸检测模块,复杂光照场景准确率从98.2%提升至99.5% 优化具体过程: 光照补偿:在数据预处理阶段,采用自适应光照补偿算法,对图像进行实时增强,以减少光照变化对人脸检测的影响。数据增强:在训练…...
【Golang】defer与recover的组合使用
在Go语言中,defer和recover是两个关键特性,通常结合使用以处理资源管理和异常恢复。以下是它们的核心应用场景及使用示例: 1. defer 的应用场景 defer用于延迟执行函数调用,确保在函数退出前执行特定操作。主要用途包括ÿ…...
Beyond Compare 4注册激活方法
Beyond Compare 4 注册码 --- BEGIN LICENSE KEY --- H1bJTd2SauPv5Garuaq0Ig43uqq5NJOEw94wxdZTpU-pFB9GmyPk677gJ vC1Ro6sbAvKR4pVwtxdCfuoZDb6hJ5bVQKqlfihJfSYZt-xVrVU270Ja hFbqTmYskatMTgPyjvv99CF2Te8ecYs2SPxyZAF0YwOCNOWmsyqN5y9t q2Kw2pjoiDs5gIH-uw5U49JzOB6otS7kT…...
[C++游戏开发基础]:构造函数浅析,8000+字长文
构造函数 构造函数是一种特殊的成员函数,在创建非聚合类类型对象后会自动被调用。当定义一个非聚合类类型对象时,编译器会检查是否能找到一个可以访问的构造函数,该构造函数与调用者提供的初始化值(如果有的情况下)相匹配。 如果找到一个可访问的匹配构造函数,将为…...
【Go】切片
知识点关键概念切片声明var slice []int初始化切片slice : []int{1,2,3}make() 创建切片make([]int, len, cap)获取长度和容量len(slice), cap(slice)追加元素slice append(slice, value)切片截取slice[start:end](返回子切片)拷贝切片copy(dest, src)&…...
MySQL 设置允许远程连接完整指南:安全与效率并重
一、为什么需要远程连接MySQL? 在分布式系统架构中,应用程序与数据库往往部署在不同服务器。例如: Web服务器(如NginxPHP)需要连接独立的MySQL数据库数据分析师通过BI工具直连生产库多服务器集群间的数据同步 但直接…...
Cursor IDE 入门指南
什么是 Cursor? Cursor 是一款集成了 AI 功能的现代代码编辑器,基于 VSCode 开发,专为提高开发效率而设计。它内置强大的 AI 助手功能,能够理解代码、生成代码、解决问题,帮助开发者更快、更智能地完成编程任务。 基础功能 1.…...
32.[前端开发-JavaScript基础]Day09-元素操作-window滚动-事件处理-事件委托
JavasScript事件处理 1 认识事件处理 认识事件(Event) 常见的事件列表 认识事件流 2 事件冒泡捕获 事件冒泡和事件捕获 事件捕获和冒泡的过程 3 事件对象event 事件对象 event常见的属性和方法 事件处理中的this 4 EventTarget使用 EventTarget类 5 事件委托模式 事件委托&am…...
【工具变量】中国各地级市是否属于“信息惠民国家试点城市”匹配数据(2010-2024年)
数据来源:国家等12部门联合发布的《关于加快实施信息惠民工程有关工作的通知》 数据说明:内含原始文件和匹配结果,当试点城市在2014年及以后,赋值为1;试点城市在2014年之前或该城市从未实施信息惠民试点工程&#x…...
windows安装配置FFmpeg教程
1.先访问官网:https://www.gyan.dev/ffmpeg/builds/ 2.选择安装包Windows builds from gyan.dev 3. 下滑找到release bulids部分,选择ffmpeg-7.0.2-essentials_build.zip 4. 然后解压将bin目录添加path系统变量:\ffmpeg-7.0.2-essentials_bui…...
Wispr Flow,AI语言转文字工具
Wispr Flow是什么 Wispr Flow 是AI语音转文本工具,基于先进的AI技术,帮助用户在任何应用程序中实现快速语音转文字。 Wispr Flow支持100多种语言,具备自动编辑、上下文感知和低音量识别等功能,大幅提升写作和沟通效率。Wispr Fl…...
风暴潮、潮汐潮流模拟:ROMS模型如何精准预测海洋现象?
海洋数值模拟的崛起与 ROMS 的关键角色 🌊在海洋科学的浪潮中,海洋数值模拟正以迅猛之势崛起,成为科研与实际应用领域不可或缺的利器。ROMS(Regional Ocean Modeling System)作为其中的佼佼者,凭借其高效、…...
【Rust】集合的使用——Rust语言基础16
文章目录 1. 前言2. Vector2.1. 构建一个 vector2.2. 获取 vector 中的元素2.3. 遍历 vector2.4. 使用枚举来储存多种类型 3. String3.1. 新建字符串3.2. 更新字符串3.3. 字符串的内部结构3.3.1. 字符串如何访问内部元素?3.3.2. 字节、标量值和字形簇 3.4. 字符串 s…...
Kafka集成Debezium监听postgresql变更
下载postgres的插件:https://debezium.io/documentation/reference/2.7/install.html 2.7版本支持postgresql12数据库。 debezium-connector-postgres-2.7.4.Final-plugin.tar.gz 上传插件并解压 mkdir /usr/local/kafka/kafka_2.12-2.2.1/connector cd /usr/local…...
自动学习和优化过程,实现更加精准的预测和决策的智慧交通开源了
智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。通过高效的实时视…...
第2.2节 Android Jacoco插件覆盖率采集
JaCoCo(Java Code Coverage)是一款开源的代码覆盖率分析工具,适用于Java和Android项目。它通过插桩技术统计测试过程中代码的执行情况,生成可视化报告,帮助开发者评估测试用例的有效性。在github上开源的项目ÿ…...
从零开始:使用 Cython + JNI 在 Android 上运行 Python 算法
1. 引言 在 Android 设备上运行 Python 代码通常面临性能、兼容性和封装等挑战。尤其是当你希望在 Android 应用中使用 Python 编写的计算密集型算法时,直接运行 Python 代码可能导致较高的 CPU 占用和较差的性能。为了解决这个问题,我们可以使用 Cytho…...
开源软件许可证冲突的原因和解决方法
1、什么是开源许可证以及许可证冲突产生的问题 开源软件许可证是一种法律文件,它规定了软件用户、分发者和修改者使用、复制、修改和分发开源软件的权利和义务。开源许可证是由软件的版权所有者(通常是开发者或开发团队)发布的,它…...
stratis,容器podman
一、stratis 1.stratis可以实现动态的在线扩容,lvm虽然也可以实现在线扩容,但是是需要人为的手动扩容。 2.stratis不需要手动格式化,自动会创建文件系统(默认是xfs) 1. 安装stratis软件包 yum list | grep stratis…...
解决用three.js展示n个叠加的stl模型文件错位的问题
加载stl时可以明显看到下面有一部分模型是错位的。 将stl文件格式转化为glb 使用免费将 STL 转换为 GLB - ImageToStl 模型就没有错位了 代码如下 <template><div ref"threeContainer" class"three-container"></div></template&…...
从零开始实现 C++ TinyWebServer 数据库连接池 SqlConnectPool详解
文章目录 数据库连接池是什么?Web Server 中为什么需要数据库连接池?SqlConnectPool 成员变量实现 Init() 函数实现 ClosePool() 函数SqlConnectRAII 类SqlConnectPool 代码SqlConnectPool 测试 从零开始实现 C TinyWebServer 项目总览 项目源码 数据库连…...
利用ffmpeg库实现音频AAC编解码
AAC(Advanced Audio Coding)是一种音频编码技术,出现于1997年,基于MPEG-2的音频编码技术。AAC具有高效的数据压缩能力和较高的音质,适用于各种音频应用场景。例如,在智能设备中,AAC技术被广泛…...
Vue + CSS实现渐变栅格进度条
进度条作为可视化大屏系统中展示数据状态的关键元素,其视觉效果直接影响用户的使用体验,而传统的进度条往往呈现出固定的样式,缺乏视觉吸引力。在这种场景下,一种基于Vue和CSS实现渐变栅格进度条的方法应运而生,该方法…...
算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)
文章目录 前言一、背包问题溯源(动态规划)1.1 动态规划的概念1.2 动态规划的基本步骤1.3 动态规划的实际应用 二、背包问题2.1 背包问题衍生2.2 0-1背包2.2.1 0-1背包描述2.2.2 0-1背包图解2.2.3 0-1背包代码刨析 2.3 完全背包2.3.1 完全背包描述2.3.2 完…...
蓝桥杯—迷宫(bfs)
一.题目 分析:最短路径问题,给定一个迷宫,从左上角走到右下角,要求路径最短,并且要求字典序最小,也就是按照D,L,R,U,的搜索顺序去搜索,否则路径不是唯一的&am…...
【Android】安卓 Java下载ZIP文件并解压(笔记)
写在前面的话 在这篇文章中,我们将详细讲解如何在 Android 中通过 Java 下载 ZIP 文件并解压,同时处理下载进度、错误处理以及优化方案。 以下正文 1.权限配置 在 AndroidManifest.xml 中,我们需要添加相应的权限来确保应用能够访问网络和设…...
清晰易懂的 PHP 安装与配置教程
初学者也能看懂的 PHP 安装与配置教程 本教程将手把手教你如何在 Windows 系统上安装 PHP,并配置 Composer(PHP 的依赖管理工具)的缓存位置,即使你是零基础小白,也能轻松完成! 一、准备工作 操作系统&…...
Ceph集群2025(Squid版)快速对接K8S cephFS文件存储
ceph的块存储太简单了。所以不做演示 查看集群 创建一个 CephFS 文件系统 # ceph fs volume create cephfs01 需要创建一个子卷# ceph fs subvolume create cephfs01 my-subvol -----------------#以下全部自动创建好 # ceph fs ls name: cephfs01, metadata pool: c…...
Linux进程控制(四)之进程程序替换
文章目录 进程程序替换单进程版程序替换替换原理多进程版程序替换替换函数函数解释小知识 命名理解 进程程序替换 如果要让子进程执行与父进程完全不同的代码,就要进行进程程序替换。 单进程版程序替换 执行一个可执行文件 makefile mycommand:mycommand.cgcc -…...
python-selenium 爬虫 由易到难
本质 python第三方库 selenium 空值 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动(不容易遇到版本或者兼容性的问题) 驱动下载网址:链接: link 1、实战1 (1)安装 selenium 库 pip install selenium&#…...
希尔排序
希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序列来改善插入排序的性能,每个子序列的元素间隔为 d(增量)。随着算法的进行,d 逐渐减小,最终减为 1,此时整个序列就被排序好了。…...
Pydantic Mixin:构建可组合的验证系统体系
title: Pydantic Mixin:构建可组合的验证系统体系 date: 2025/3/22 updated: 2025/3/22 author: cmdragon excerpt: Pydantic的Mixin模式通过继承组合实现校验逻辑复用,遵循以Mixin后缀命名、不定义初始化方法等设计原则。支持基础校验模块化封装与多策略组合,如电话号码…...
策略模式 vs. 工厂模式:对比与分析
相同点 解耦思想 两者都通过接口/抽象类将实现与调用方解耦,降低模块间的直接依赖。 符合开闭原则 新增策略或产品时,只需扩展新类,无需修改已有代码。 封装变化 策略模式封装算法的变化,工厂模式封装对象创建的变化。 不同…...
RK3568 I2C底层驱动详解
前提须知:I2C协议不懂的话就去看之前的内容吧,这个文章需要读者一定的基础。 RK3568 I2C 简介 RK3568 支持 6 个独立 I2C: I2C0、I2C1、I2C2、I2C3、I2C4、I2C5。I2C 控制器支持以下特性: ① 兼容 i2c 总线 ② AMBA APB 从接口 ③ 支持 I2C 总线主模式…...