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

互联网的下一代脉搏:深入理解 QUIC 协议

互联网的下一代脉搏:深入理解 QUIC 协议

互联网是现代社会的基石,而数据在其中高效、安全地传输是其运转的关键。长期以来,传输层的 TCP(传输控制协议)一直是互联网的主力军。然而,随着互联网应用场景的日益丰富和对速度、安全性的更高要求,TCP 的一些固有缺陷逐渐暴露。为了应对这些挑战,一个新的传输层协议应运而生——QUIC (Quick UDP Internet Connections)。

QUIC 由 Google 最初开发,并最终被 IETF 标准化为 RFC 9000 系列。它旨在显著提高基于连接的 Web 应用性能,同时提供更高的安全性和可靠性。那么,QUIC 究竟是如何做到的?它的核心设计理念是什么?

一、TCP 面临的挑战:为何需要 QUIC?

在深入 QUIC 之前,我们先回顾一下 TCP 的几个痛点:

  1. 连接建立延迟 (Connection Establishment Latency): TCP 需要经过一个“三次握手”过程才能建立连接,这至少需要一个往返时间 (Round Trip Time, RTT)。如果在此基础上再建立 TLS (Transport Layer Security) 加密连接,还需要额外的握手过程,总共可能需要 2-3 个 RTT,增加了首次加载的延迟。

    【图片:TCP与TCP+TLS握手过程示意图,对比QUIC的0-RTT/1-RTT握手】

  2. 队头阻塞 (Head-of-Line Blocking, HOL Blocking): TCP 保证数据包的按序到达。在一个 TCP 连接上,即使不同应用流的数据包乱序或丢失,整个连接都需要等待丢失的数据包重传并被正确排序后,才能将后续数据向上层应用交付。这就像一辆卡车在单车道上抛锚,会堵塞后面所有的车辆,即使后面的车辆是去往不同目的地的。

    【图片:TCP队头阻塞示意图,一个丢失/乱序包堵塞所有数据流】

  3. 协议僵化 (Protocol Ossification): TCP 的实现主要在操作系统内核中。要修改或升级 TCP 协议(例如改进拥塞控制算法)需要更新操作系统,这过程漫长且难以普及。这限制了协议的快速发展和创新。

  4. 连接迁移困难 (Connection Migration): TCP 连接由四元组(源 IP、源端口、目的 IP、目的端口)唯一标识。当客户端网络环境发生变化(例如从 Wi-Fi 切换到蜂窝网络,导致 IP 地址或端口变化)时,TCP 连接会中断,需要重新建立。

二、QUIC 的技术设计思路与核心原理

QUIC 的设计目标是解决 TCP 的这些问题,提供更快速、更安全、更可靠的传输体验。其核心思想可以概括为:在 UDP 上构建一个可靠、安全、多路复用的传输协议。

为什么选择 UDP?因为 UDP 是一个简单的无连接协议,它不做可靠性保证、不维护连接状态、没有拥塞控制,非常“薄”。正因为它的简单,UDP 几乎不会受到中间网络设备(如防火墙、NAT)的干扰(相比于 TCP 的复杂状态机和标志位),这使得 QUIC 可以在应用层或用户空间实现复杂的逻辑,绕过操作系统的限制,实现快速迭代和部署。

QUIC 在 UDP 之上重新实现了 TCP 的许多功能,并进行了大量优化和创新:

  1. 基于 UDP: QUIC 将整个传输层逻辑(包括可靠性、流量控制、拥塞控制、安全性等)都实现在用户空间,运行在 UDP 协议之上。

    【图片:协议栈对比图,TCP/TLS/HTTP vs. UDP/QUIC/HTTP】

  2. 集成 TLS 1.3: 安全性是 QUIC 的基石。QUIC 直接集成了最新版本的 TLS 1.3。TLS 1.3 相较于旧版本大大简化了握手过程,并且加密了更多的握手信息。

    • 快速握手: QUIC 的握手结合了传输层和加密层握手。对于首次连接,可以在 1 个 RTT 内完成(包括密钥协商和认证)。对于连接过的服务器,利用缓存的会话密钥,甚至可以实现 0-RTT (Zero Round Trip Time) 握手,客户端在发送连接请求的同时就可以发送应用数据,极大地降低了连接建立延迟。 【图片:QUIC 1-RTT 和 0-RTT 握手流程示意图】
  3. 流控与多路复用 (Stream Multiplexing): 这是解决队头阻塞的关键。QUIC 连接中可以包含多条独立的“流”(Stream)。每条流都有自己的序号和流量控制,它们在 QUIC 连接内独立传输。一条流的丢失或乱序只会影响该条流数据的交付,不会阻塞同一连接中的其他流。这非常适合 HTTP/2 等需要并行请求的应用场景。

    【图片:QUIC 多路复用示意图,多条流并行传输,互不影响】

  4. 连接 ID (Connection ID): QUIC 连接不再由传统的四元组标识。在连接建立时,会协商一个 Connection ID。客户端和服务器都维护这个 ID。即使客户端的 IP 地址或端口因网络切换而改变,只要 Connection ID 不变,QUIC 连接就能维持,实现平滑的连接迁移。

    【图片:QUIC 连接迁移示意图,客户端 IP/端口变化,但连接保持】

  5. 增强的拥塞控制: QUIC 的拥塞控制算法在用户空间实现,这使得开发者可以根据应用需求或网络状况快速实验和部署新的拥塞控制算法,无需等待操作系统更新。许多 QUIC 实现采用了改进的拥塞控制算法(如 BBR),在丢包和延迟较高的网络环境下表现更好。

  6. 前向纠错 (Forward Error Correction, FEC) (可选/早期版本特性,RFC 9000 中未强制): 虽然不是核心强制特性,但 QUIC 的设计允许实现者加入 FEC 功能,通过发送冗余数据来减少因少量丢包导致的重传,进一步降低延迟(尤其是在丢包率较高的网络)。

  7. 细节优化: QUIC 在很多细节上也进行了优化,例如更精细的丢包检测和重传机制,以及对数据包头的压缩等,进一步提升了效率。QUIC 的包头设计也更简洁,对中间设备的干扰更小。

三、QUIC 的实现原理概述

QUIC 的实现原理是将原本属于操作系统内核 TCP/TLS 协议栈的功能,转移到应用层的库中实现。一个典型的 QUIC 实现包括:

  1. UDP Socket 管理: 应用程序使用标准的 UDP Socket 进行数据收发。
  2. QUIC 协议引擎: 这是核心部分,负责:
    • 处理 QUIC 数据包的解析和封装。
    • 管理 QUIC 连接状态(包括握手状态、连接 ID)。
    • 管理和调度 QUIC 流。
    • 实现可靠性机制(序号、确认、重传)。
    • 实现流量控制(窗口机制)。
    • 运行拥塞控制算法。
    • 处理连接迁移。
  3. TLS 1.3 库: 集成的 TLS 1.3 库负责加密、解密、密钥协商和证书验证等安全功能。
  4. 与上层应用接口: 提供一套 API 供应用程序调用,用于创建连接、发送/接收数据(按流)、关闭连接等。

【图片:QUIC 软件栈示意图,应用层调用 QUIC 库,QUIC 库使用 UDP Socket】

这种用户空间的实现方式带来了灵活性,但也意味着应用程序或其依赖的库需要承担更多的协议处理工作,可能会增加一些 CPU 开销(尤其是在处理大量加密/解密时),不过这通常可以通过硬件加速来缓解。

四、QUIC 的优势总结

综合其设计和原理,QUIC 协议带来了显著的优势:

  • 更低的连接延迟: 1-RTT 和 0-RTT 握手显著加速了页面加载和首次交互。
  • 更好的抗队头阻塞能力: 多路复用提高了在高丢包或高延迟网络环境下的并发性能。
  • 更高的安全性: 集成 TLS 1.3 并加密更多头部信息,减少了中间人攻击的可能。
  • 更强的连接迁移能力: 改变 IP 地址或端口不会中断连接,提升了移动场景下的用户体验。
  • 更快的创新和部署: 用户空间实现使得协议改进和新特性部署更加敏捷。
  • 更好的网络适应性: 灵活的拥塞控制机制能更好地应对不同的网络条件。

五、QUIC 的未来发展趋势

QUIC 协议已经从最初的实验性协议成长为被广泛接受和部署的互联网标准。其未来发展趋势主要体现在以下几个方面:

  1. 广泛部署和普及: 越来越多的网站、应用和服务器开始支持 QUIC。大型互联网公司(如 Google, Cloudflare, Meta, Akamai 等)是主要的推动者。主流浏览器(Chrome, Firefox, Edge, Safari)也已经默认或可选支持 QUIC。未来 QUIC 的流量占比会持续增长,并可能最终超越 TCP+TLS 在某些领域的应用。

  2. 操作系统和硬件支持: 随着 QUIC 的普及,未来可能会有更多的操作系统和硬件(如网卡)提供对 QUIC 的原生支持或加速,进一步提高其性能和效率。

  3. 标准演进和扩展: RFC 9000 系列是 QUICv1 的标准。未来可能会有 QUICv2 或其他扩展协议,引入新的特性或优化,例如更好的拥塞控制、新的流管理方式、对更多应用场景的支持等。

  4. ** beyond HTTP:** QUIC 最初是为 HTTP/3 设计的传输层协议,但其优秀的特性使其有潜力被用于其他应用层协议。例如,IETF 正在探索基于 QUIC 的 WebTransport 协议,旨在为 Web 应用提供低延迟、双向、多路复用的数据传输能力,适用于游戏、实时通信等场景。未来可能会有更多协议从 TCP 迁移到 QUIC。

  5. 生态系统完善: 围绕 QUIC 的开发工具、测试工具、性能监控工具等生态系统将不断完善,降低开发者使用和部署 QUIC 的门槛。

当然,QUIC 的发展也面临一些挑战,例如部分老旧的防火墙或网络设备可能不理解或不友好对待基于 UDP 的 QUIC 流量(尽管这种情况正在改善),以及如何在用户空间高效处理大规模连接等。但总的来说,QUIC 的优势使其成为构建更快速、更安全、更可靠未来互联网的重要基石。

六、结语

QUIC 不仅仅是一个新的传输协议,它是对现有互联网传输体系的一次重要革新。它吸取了 TCP 的教训,拥抱了安全和性能的核心需求,并在灵活性和可演进性上迈出了一大步。随着 QUIC 的进一步普及,我们有理由相信,未来的互联网连接将更加快速、更加安全、更加流畅,为各种创新应用提供坚实的基础。QUIC 协议,这个互联网的下一代脉搏,正以前所未有的活力跳动着。


 


相关文章:

互联网的下一代脉搏:深入理解 QUIC 协议

互联网的下一代脉搏:深入理解 QUIC 协议 互联网是现代社会的基石,而数据在其中高效、安全地传输是其运转的关键。长期以来,传输层的 TCP(传输控制协议)一直是互联网的主力军。然而,随着互联网应用场景的日…...

榕壹云国际版短剧系统:基于Spring Boot+MySQL+UniApp的全球短剧创作平台

一、项目背景与简介 在短视频行业高速发展的今天,短剧内容已成为全球用户娱乐消费的新宠。为满足市场对高质量、多样化短剧的需求,我们基于Spring Boot + MySQL + UniApp技术栈开发了榕壹云国际版短剧系统,这是一款面向全球市场的短剧创作与分发平台。系统不仅提供丰富的基…...

为什么选择 Spring Boot? 它是如何简化单个微服务的创建、配置和部署的?

为什么选择 Spring Boot? Spring Boot 的核心目标就是简化 Spring 应用的初始搭建以及开发过程。它并不是要取代 Spring Framework,而是构建在其之上,通过一系列“约定优于配置”的原则和自动化手段,让开发者能够更快的创建出独立…...

方向倒数、梯度和梯度下降的对比关系

一、方向导数与梯度的定义 ‌方向导数‌ 方向导数描述多元函数在某点沿特定方向的变化率。对于函数f(x,y),在点(x0​,y0​)沿单位向量u(u1​,u2​)的方向导数定义为: 其物理意义是函数值沿该方向的瞬时变化速率,正负表示增减趋势&#xff0c…...

全星APQP软件系统:驱动芯片半导体行业研发管理迈向高效与合规新高度

全星APQP软件系统:驱动芯片半导体行业研发管理迈向高效与合规新高度 在芯片半导体行业,一款芯片的研发周期长达数年,涉及设计验证、工艺开发、良率爬坡、量产交付等数百个关键节点,任何一个环节的偏差都可能导致数千万美元的损失…...

文章记单词 | 第50篇(六级)

一,单词释义 fun:英 [fʌn] 美 [fʌn],名词,意为 “享乐;乐趣;快乐;嬉戏;有趣的事;玩笑;逗乐”;形容词,意为 “逗乐的;有…...

RISC-V MCU定时器架构与低功耗设计

RISC-V核低功耗MCU在定时器架构和功耗控制方面具有以下特点: 定时器配置 高级控制定时器:支持互补PWM输出和刹车功能,适合电机控制等场景 通用定时器:提供输入捕获、输出比较和单脉冲模式等基础功能 系统定时器:内置6…...

redis_Windows中安装redis

①Windows安装包下载地址:https://github.com/tporadowski/redis/releases 当前最新版本截图 ②根据自己系统平台的实际情况选择对应的安装包,如:64位win10系统可选择Redis-x64-5.0.14.msi ③下载完成后运行安装,没有特殊要求的话…...

Spring中生成Bean的方式总结-笔记

1. 概略版 Spring生成Bean方式有如下几种,可根据需求选择合适的方式,通常优先使用注解驱动的声明式配置(如Component、Bean),复杂场景结合条件或作用域控制。 方式特点适用场景Component 组件扫描简单直观&#xff…...

学习insightface 的人脸识别

1.Insightface_pytorch版本的自定义数据准备过程 https://github.com/artintel/LearningCode/blob/master/insightface_pytorch_datasets_make/README.md https://github.com/artintel/LearningCode/tree/master/insightface_pytorch_datasets_make 2.mxnet_insightface开源…...

【MQ篇】RabbitMQ之消费失败重试!

目录 引言:消息不丢是底线,失败了优雅重试是修养!消费失败了,为啥不能老是原地复活?🤔智能重试策略一:本地重试(Spring Retry 的魔法)🏠✨智能重试策略二&…...

权力结构下的人才价值重构:从 “工具论” 到 “存在论” 的转变​

引言​ 在现在的公司管理里,常常能听到这样一种说法:“我用你,你才是人才;不用你,你啥都不是。” 这其实反映了一种很常见的评判人才价值的标准,就是只看公司的需求,把人才当作实现公司目标的工…...

【上位机——MFC】视图

相关类 CView及其子类,父类为CWnd类,封装了关于视图窗口的各种操作,以及和文档类的数据交互。 视图窗口的使用 1.定义一个自己的视图类(CMyView),派生自CView,并重写父类成员纯虚函数OnDraw。 2.其余框架类和应用程…...

Unity:Sprite Shapes(精灵形状)

游戏世界的基本构建单位——精灵(Sprite) Sprite(精灵)是什么? Sprite指的是一张小图片,在游戏里代表一个角色、道具、背景元素。 在2D游戏里,比如滑雪游戏,角色、小树、雪地……很…...

火语言RPA--钉钉群通知

【组件功能】:向钉钉群发送文本或markdown消息 在钉钉群创建自定义机器人(Webhook),在组件配置Webhook地址、密钥、文本内容即可向钉钉群发送文本或markdown消息,还可以at群成员或所有人。 配置预览 配置说明 Webho…...

详细图解 Path-SAM2: Transfer SAM2 for digital pathology semantic segmentation

✨ 背景动机 数字病理中的语义分割(semantic segmentation)是非常关键的,比如肿瘤检测、组织分类等。SAM(Segment Anything Model)推动了通用分割的发展,但在病理图像上表现一般。 病理图像(Pa…...

驯龙日记:用Pandas驾驭数据的野性

引言:为什么选择Pandas? "NumPy是手术刀,Pandas是急救箱" 手术刀(NumPy):精密的数值计算 急救箱(Pandas):处理现实数据的全套工具 维度NumPy数组Pandas Se…...

产品经理面经(1)

今天开一个新的栏目,是关于产品经理方面的。产品经理这个岗位每年的需求都是不少的,尤其是近年来AI的兴起造就了产品经理与AI方面深度融合从而催生了“AI产品经理”这种类型的岗位。具体数据如下 总体规模: 2020 年:受疫情影响&am…...

【黑马JavaWeb+AI知识梳理】前端Web基础02 - JS+Vue+Ajax

JS(行为/交互效果) JavaScript(JS)跨平台、面向对象,是用来控制网页行为,实现页面交互效果的脚本语言。 和Java完全不同,但基础语法类似。 组成: ECMAScript:规定了JS…...

Unity Post Processing 小记 【使用泛光实现灯光亮度效果】

一、前言 本篇适用于Unity 2018 - 2019及以上版本,以默认渲染管线为例。文章内容源于个人研究尝试与网络资料收集,可能存在不准确之处。初衷是因新版本制作时老的Bloom插件失效,经研究后分享开启Bloom效果的方法。若在项目中使用Post Proces…...

NFC 碰一碰发视频贴牌技术,音频功能的开发实践与技术解析

在数字化营销与信息交互场景中,NFC 碰一碰技术凭借其便捷性和高效性,成为快速传递多媒体内容的新选择。通过 NFC 实现视频音频的快速传输,不仅能提升用户体验,还能为各类场景带来创新应用。本文将深入探讨该功能开发过程中的关键技…...

新型“电力寄生虫“网络钓鱼攻击瞄准能源企业与知名品牌

本周发布的综合威胁报告显示,自2024年以来,一场名为"电力寄生虫"(Power Parasites)的复杂网络钓鱼活动持续针对全球能源巨头和知名品牌展开攻击。 该攻击活动主要通过精心设计的投资骗局和虚假招聘信息,冒用…...

如何将数据输入到神经网络中

引言 在前面的文章学习中,我们初步了解到神经网络在人工智能领域扮演着至关重要的角色,它具备实现真正人工智能的潜力。真正的人工智能意味着机器能够像人类一样进行感知、学习、推理和决策等复杂活动。而神经网络作为实现这一目标的关键技术&#xff0c…...

【quantity】2 Unit 结构体(unit.rs)

一、源码 下面代码实现了一个基于类型级别的物理量单位系统,使用Rust的类型系统在编译期保证单位运算的正确性。 use typenum::{Integer, Sum, Diff, Z0, // 0P1, P2, P3, P4, // 1, 2, 3, 4N1, N2, N3 // -1, -2, -3 }; use std::marker::PhantomData; use st…...

OpenCV 图形API(66)图像结构分析和形状描述符------将一条直线拟合到三维点集上函数fitLine3D()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 拟合一条直线到3D点集。 该函数通过最小化 ∑iρ(ri) 来将一条直线拟合到3D点集,其中 ri 是第 i 个点与直线之间的距离,…...

uniapp: 低功耗蓝牙(BLE)的使用

在微信小程序中实现蓝牙对接蓝牙秤的重量功能,主要依赖微信小程序提供的低功耗蓝牙(BLE)API。以下是一个清晰的步骤指南,帮助你完成从连接蓝牙秤到获取重量数据的开发流程。需要注意的是,具体实现可能因蓝牙秤的协议和…...

谢飞机的Java面试之旅:从Spring Boot到Kubernetes的挑战

场景:互联网大厂Java求职 在一家知名互联网大厂的面试现场,严肃的面试官坐在谢飞机的对面,开始了面试。 第一轮:基础技术与平台 面试官: 谢先生,您能简单介绍一下Java SE 8的主要新特性吗? 谢飞机: 当然,Java 8引入了Lambda表达式、Stream API和新的日期时间API。 …...

Shadertoy着色器移植到Three.js经验总结

Shadertoy是一个流行的在线平台,用于创建和分享WebGL片段着色器。里面有很多令人惊叹的画面,甚至3D场景。本人也移植了几个ShaderToy上的着色器。本文将详细介绍移植过程中需要注意的关键点。 1. 基本结构差异 想要移植ShaderToy的shader到three.js&am…...

基于BenchmarkSQL的OceanBase数据库tpcc性能测试

基于BenchmarkSQL的OceanBase数据库tpcc性能测试 安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQLBenchmarkSQL props文件配置数据库和测试表配置BenchmarkSQL压测装载测试数据TPC-C压测(固定事务数量)TPC-C压测(固定时长)生成测试报告重复测试流程梳理安装Benchmar…...

Flutter 泛型 泛型方法 泛型类 泛型接口

目录 泛型简单使用 泛型类的简单使用 泛型接口的使用 通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验) 泛型简单使用 main(){print(getData2("XXX"));getData2<String>("XXX");getData2<int>(1);}Str…...

边缘函数:全栈开发的最后1毫秒性能革命

一、边缘计算的时空折叠术 1. 传统CDN vs. 智能边缘网络 全球电商平台实测数据&#xff1a; 场景云端处理延迟边缘处理延迟转化率提升搜索建议320ms8ms18%个性化推荐450ms12ms27%实时库存检查680ms9ms42%欺诈检测920ms15ms63% 二、边缘全栈架构的量子纠缠 1. 代码的时空分布…...

网店专用版批量转账系统,覆盖淘宝、拼多多、抖店订单信息自动核对+插旗自动备注,支持微信支付宝批量转账

不少电商人在运营过程中&#xff0c;需要用转账工具来解决日常运营过程中的返款问题。 但在实际操作过程中&#xff0c;往往有很多问题。东哥在这里梳理下&#xff0c;方便大家了解&#xff1a; 1.错返/漏返的情况时有发生 为什么会错返和漏返&#xff1f; 实际来看&#x…...

AUTOSAR_RS_ClassicPlatformDebugTraceProfile

AUTOSAR经典平台调试、跟踪与分析支持 AUTOSAR组件调试、跟踪与分析功能详解 目录 简介ARTI核心扩展 核心特定ARTI扩展结构核心参数定义 操作系统和任务扩展 OS特定ARTI扩展任务特定ARTI扩展软件组件特定扩展 总体架构 组件结构接口定义 错误处理 默认错误跟踪器(DET) 总结 1.…...

vue中将html2canvas转成的图片传递给后台 Python Flask 服务

下面将详细介绍如何在 Vue 项目里把 html2canvas 转换得到的图片传递给后台的 Python Flask 服务。 前端&#xff08;Vue&#xff09;步骤 1. 安装依赖 首先要确保已经安装了 html2canvas 和 axios&#xff0c;若未安装&#xff0c;可在终端执行以下命令&#xff1a; npm i…...

基于深度学习的智能交通流量监控与预测系统设计与实现

基于深度学习的智能交通流量监控与预测系统设计与实现 摘要 随着城市化进程的加速和机动车保有量的激增&#xff0c;交通拥堵、事故频发、环境污染等问题日益严峻&#xff0c;对传统的交通管理方式提出了巨大挑战。智能交通系统&#xff08;ITS&#xff09;作为解决这些问题的…...

鸿蒙系统应用开发全栈指南

一、开发环境搭建与工具链配置 1. DevEco Studio深度解析 作为鸿蒙生态的官方IDE&#xff0c;DevEco Studio 4.2版本已集成ArkTS 3.0编译器与AI代码助手功能。安装过程需注意&#xff1a; 系统要求&#xff1a;Windows 10 21H2或macOS Monterey以上环境依赖&#xff1a;Node…...

STC32裸机项目集成FreeRTOS的实战问题解析

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…...

振弦式应变计在混凝土结构长期监测中的应用与特点 久岩传感 GEO-explorer

振弦式应变计在混凝土结构长期监测中的应用与特点 久岩传感 GEO-explorer 振弦式应变计是一种专为长期埋设于水工建筑物及各类混凝土结构内部而设计的测量仪器&#xff0c;可广泛应用于梁体、柱体、桩基、挡土墙、隧道衬砌、桥墩及基岩等结构的应变与应力监测&#xff0c;同时具…...

AVFormatContext 再分析

说明 &#xff1a;将 avfromatContext 的变量依次打印分析&#xff0c;根据ffmpeg 给的说明&#xff0c;猜测&#xff0c;结合网上的文章字节写测试代码分析。 从常用到不常用依次分析 1. unsigned int nb_streams; 代表 avfromatContext 中 AVStream **streams 的个数 /** …...

力扣hot100,739每日温度(单调栈)详解

时隔多久又遇到单调栈的题了&#xff0c;上次记得是接雨水的题&#xff0c;简单讲一下单调栈的适用场景和定义。 意义:看名字就知道单调栈是一个栈里面的数据是单调的 。 解决问题: 单调栈主要用于解决需要**快速找到某个元素附近更大或更小的元素**的问题&#xff0c;其核心…...

怎么检测代理IP延迟?如何选择低延迟代理?

在跨境电商、数据采集以及社交媒体管理等活动中&#xff0c;代理IP的延迟是评估其性能的关键指标之一。高延迟的代理IP可能显著影响任务效率&#xff0c;特别是在需要高并发或大量请求的情况下。本文将介绍几种测试海外代理IP延迟的方法。 一、使用Ping命令测试延迟 Ping命令…...

QEMU 10.0 发布

QEMU 10.0 于 2025 年 4 月 23 日发布。此版本包含 2800 多个提交&#xff0c;来自 211 位作者。以下是一些主要的更新内容&#xff1a; CPU 和主板支持增强 x86 架构&#xff1a;优化了字符串操作指令&#xff0c;显著缩短启动时间。新增了 Intel Clearwater Forest 和 Sierra…...

C++和Java该如何选择?

我真诚的建议你选择C。因为国内Java程序员内卷太严重了&#xff0c;某些公司发布一个Java岗位&#xff0c;立刻就有几百人打招呼&#xff1b;而发布一个C岗位&#xff0c;打招呼的人数就那么十几个。 要知道&#xff0c;无论什么时候&#xff0c;只要你能够学得动C&#xff0c…...

Javase 基础入门 —— 06 final + 单例

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 final 关…...

web 开发中,前端部署更新后,该怎么通知用户刷新

web 开发中&#xff0c;前端部署更新后&#xff0c;该怎么通知用户刷新&#xff1f; 浏览器为什么存在刷新按钮&#xff1f;&#x1f518; 因为需要重新加载js&#xff0c;css&#xff0c;html。但为何需要重新加载这些东西&#xff1f;直白点说这些东西其实就是一个文档&…...

LaTex、pdfLaTex、XeLaTex和luaLaTex的区别和联系

之前一直搞不懂这些乱七八糟的Tex到底有啥区别&#xff0c;不同引擎不同编译器换来换去&#xff0c;查了些资料又问了下AI&#xff0c;总算是搞懂了。 大概是这样&#xff0c;很久以前有人写了个Tex排版引擎&#xff0c;输入一些代码命令&#xff0c;输出dvi文件&#xff08;设…...

深入解析 npm 与 Yarn:Node.js 包管理工具对比与选型指南

在 Node.js 生态中&#xff0c;依赖管理是项目开发的核心环节。npm&#xff08;Node Package Manager&#xff09;和 Yarn 作为两大主流包管理工具&#xff0c;虽目标一致但各有特色。本文将从技术实现、使用场景、生态整合等维度深度对比&#xff0c;助你选择更适合的工具。​…...

PDF嵌入图片

所需依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>9.0.0</version><type>pom</type> </dependency>源码 /*** PDF工具*/ public class PdfUtils {/*** 嵌入图…...

Coding Practice,48天强训(24)

Topic 1&#xff1a;判断是不是平衡二叉树&#xff08;递归&#xff09; 判断是不是平衡二叉树_牛客题霸_牛客网 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&…...

技术分享 | Oracle-RAC修改IP信息

本文为墨天轮数据库管理服务团队第61期技术分享&#xff0c;内容原创&#xff0c;作者为技术顾问胡振兴&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 在生产中有时候会遇到网络变更&#xff0c;Oracle RAC IP信息更换等情况&…...