持久性HTTPVS.非持久性HTTP
1. HTTP协议基础
HTTP(HyperText Transfer Protocol)是Web通信的核心协议,定义了客户端(浏览器)与服务器之间传输数据的规则。
在HTTP/1.0及之前的版本中,默认使用非持久性连接,而HTTP/1.1及更高版本引入了持久性连接(默认开启)。两者的核心差异在于TCP连接的生命周期管理。
2. 非持久性HTTP(HTTP Non-Persistent)
2.1 工作原理
- 每次请求新建连接:客户端每次发送HTTP请求时,需建立新的TCP连接,响应完成后立即关闭。
- 高延迟开销:每个请求需经历TCP三次握手(建立连接)和四次挥手(关闭连接)。
- 资源浪费:频繁的TCP连接操作消耗服务器和客户端资源。
2.2 示例
假设用户访问一个包含3张图片的网页(index.html):
- 请求HTML文件
- 客户端发送
GET /index.html→ 服务器返回HTML文件 → 关闭连接。
- 客户端发送
- 请求图片1
- 新建TCP连接 →
GET /image1.jpg→ 返回图片 → 关闭连接。
- 新建TCP连接 →
- 重复步骤2:图片2和图片3各自重复上述过程。
性能损耗计算(假设每次握手/挥手耗时1个RTT,传输数据1个RTT):
- 总耗时 = (3次请求 × 3 RTT) = 9 RTT(实际更高,因TCP慢启动等机制)。
2.3 性能缺陷
| 问题 | 原因 |
|---|---|
| 高延迟 | 每个请求需额外3个RTT(握手+挥手) |
| 服务器资源占用高 | 频繁创建/销毁TCP连接消耗CPU和内存 |
| 并行请求受限 | 浏览器对同一域名最多允许6-8个并发连接(HTTP/1.1前) |
3. 持久性HTTP(HTTP Persistent)
3.1 工作原理
- 复用TCP连接:单个TCP连接可传输多个HTTP请求/响应,通过
Connection: keep-alive头部启用(HTTP/1.1默认支持)。 - 连接保持时间:服务器可设置
Keep-Alive: timeout=5, max=100(空闲5秒关闭,最多处理100个请求)。 - 减少握手次数:仅在首次建立连接时进行三次握手,后续请求复用通道。
3.2 示例
同一网页(index.html + 3张图片)使用持久性HTTP加载:
- 建立TCP连接 → 请求HTML文件 → 返回HTML → 保持连接。
- 复用同一连接依次请求图片1、2、3,无需重复握手。
性能优化计算:
- 总耗时 = 1次握手(3 RTT) + 4次数据传输(4 RTT) = 7 RTT(节省33%时间)。
3.3 性能优势
| 优势 | 原因 |
|---|---|
| 低延迟 | 复用连接省去重复握手/挥手时间 |
| 高吞吐量 | 减少TCP缓冲区重建开销,提升数据传输效率 |
| 资源利用率高 | 服务器和客户端减少连接管理开销 |
4.对比一下
| 特性 | 非持久性HTTP | 持久性HTTP |
|---|---|---|
| 连接生命周期 | 每次请求后关闭连接 | 复用同一连接处理多个请求 |
| 默认协议版本 | HTTP/1.0 | HTTP/1.1+ |
| 头部控制 | 无(默认关闭) | Connection: keep-alive(HTTP/1.1默认开启) |
| 延迟开销 | 高(每次请求3 RTT) | 低(首次3 RTT,后续1 RTT/请求) |
| 服务器资源占用 | 高(频繁创建/销毁连接) | 低(长连接减少操作次数) |
| 适用场景 | 简单静态资源、兼容旧系统 | 现代Web应用、多资源页面 |
5. 现代HTTP协议的演进
- HTTP/2多路复用:在持久性连接基础上,允许通过单个连接并行传输多个请求(解决队头阻塞)。
- HTTP/3与QUIC:基于UDP协议,进一步减少握手延迟,优化移动网络下的性能。
6. 总结
- 非持久性HTTP适合简单场景,但性能瓶颈明显。
- 持久性HTTP通过连接复用显著提升效率,成为现代Web的基石。
- 随着HTTP/2和HTTP/3的发展,持久性连接的优化仍在持续演进。
附录:实际抓包示例
通过Wireshark抓取两种模式的网络包对比:
- 非持久性:每个请求对应独立的TCP流(Filter:
http.request)。 - 持久性:单个TCP流中包含多个HTTP请求(Filter:
tcp.stream eq <ID>)。
相关文章:
持久性HTTPVS.非持久性HTTP
1. HTTP协议基础 HTTP(HyperText Transfer Protocol)是Web通信的核心协议,定义了客户端(浏览器)与服务器之间传输数据的规则。 在HTTP/1.0及之前的版本中,默认使用非持久性连接,而HTTP/1.1及更…...
自动化UI测试 | 什么是测试驱动开发(TDD)和行为驱动开发(BDD)?有何区别?
TDD(测试驱动开发)和BDD(行为驱动开发)是两种独特的软件开发技术,它们在测试的内容和方式上有所不同。尽管名称相似,但服务于不同的目的。 什么是TDD? TDD代表测试驱动开发。它是一个过程&…...
在 PyCharm 中接入deepseek的API的各种方法
在 PyCharm 中接入 DeepSeek 的 API,通常需要以下步骤: 1. 获取 DeepSeek API 密钥 首先,确保你已经在 DeepSeek 平台上注册并获取了 API 密钥(API Key)。如果没有,请访问 DeepSeek 的官方网站注册并申请 …...
postman登录cookie设置
1.设置环境变量, 定义变量存放共享的登录信息 如Cookie 2.登录接口编码test脚本获取cookie信息 let jsessionidCookie pm.cookies.get("JSESSIONID");if (jsessionidCookie) {let cookie "JSESSIONID" jsessionidCookie "; Admin-Tok…...
如何使用ps批量去除固定位置水印
使用 Photoshop 批量去除固定位置的水印,有几种方法可以实现自动化,具体取决于水印的复杂程度和你对 Photoshop 的熟悉程度: 1. 动作(Actions) 批处理(Batch): 这是最常用的方法&…...
AI代理软件行业白皮书
本AI代理软件行业白皮书的前言应涵盖以下核心内容: 行业背景与市场趋势 全球AI代理构建软件市场2023年销售额达3.17亿美元,预计2030年将增至4.77亿美元(年复合增长率6.7%),中国市场增长尤为显著。IBM、Microsoft等企业…...
基于图像处理的裂缝检测与特征提取
一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…...
机器学习·逻辑回归
前言 逻辑回归虽然名称中有 “回归”,但实际上用于分类问题。基于线性回归的模型,通过使用逻辑函数(如 Sigmoid 函数)将线性组合的结果映射到0到1之间的概率值,用于表示属于某个类别的可能性。 一、逻辑回归 vs 线性回…...
C#上位机--结构
引言 在 C# 上位机开发中,我们常常需要处理各种数据,例如从硬件设备采集到的传感器数据、与下位机通信时传输的数据包等。结构(struct)作为 C# 中的一种值类型,在这种场景下有着广泛且重要的应用。它可以将多个相关的…...
hydra.utils.instantiate函数介绍
hydra.utils.instantiate 是 Hydra 提供的一个动态实例化函数,它可以根据 OmegaConf 配置字典(DictConfig) 自动创建 Python 对象(如类、函数等)。 它的主要作用是: ✅ 从配置文件动态创建对象(…...
Qt的QTableWidget样式设置
在 Qt 中,可以通过样式表(QSS)为 QTableWidget 设置各种样式。以下是一些常见的样式设置示例: 1. 基本样式设置 tableWidget->setStyleSheet(// 表格整体样式"QTableWidget {"" background-color: #F0F0F0;…...
Moretl 增量文件采集工具
永久免费: <下载> <使用说明> 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架构: Asp…...
dedecms 开放重定向漏洞(附脚本)(CVE-2024-57241)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
深入理解 MyBatis 框架的核心对象:SqlSession
Mybatis框架中的SqlSession对象详解 引言 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息࿰…...
ndk 编译opencv(去除libandroid.so mediandk依赖)
简单的bash运行 需要关注的: OPENCV_EXTRA_MODULES_PATH : opencv contrib库BUILD_opencv_XXX :添加contrib库后默认是contrib库全部编译,用这个控制需要关闭的NDK的路径 export ANDROID_NDK/media/hello/data/3rd_party/25.2.…...
MySQL索引和其底层数据结构介绍
索引在项目中非常常见,它是一种帮助MySQL高效获取数据的数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。就像是书的目录&…...
No module named ‘posepile.util‘
目录 No module named posepile.util 解决方法: No module named posepile.util 错误代码: import posepile.datasets3d as ds3d pip install git+https://github.com/isarandi/PosePile.git. And then, I executed the following command, " python -m metrabs_py…...
SQL布尔盲注、时间盲注
一、布尔盲注 布尔盲注(Boolean-based Blind SQL Injection)是一种SQL注入技术,用于在应用程序不直接显示数据库查询结果的情况下,通过构造特定的SQL查询并根据页面返回的不同结果来推测数据库中的信息。这种方法依赖于SQL查询的…...
RocketMQ与kafka如何解决消息丢失问题?
0 前言 消息丢失基本是分布式MQ中需要解决问题,消息丢失时保证数据可靠性的范畴。如何保证消息不丢失程序员面试中几乎不可避免的问题。本文主要说明RocketMQ和Kafka在解决消息丢失问题时,在生产者、Broker和消费者之间如何解决消息丢失问题。 1.Rocket…...
Uniapp 获取定位详解:从申请Key到实现定位功能
文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …...
sklearn交叉验证提速秘籍:除了n_jobs=-1,cross_val_score里pre_dispatch和verbose怎么用?
sklearn交叉验证提速实战:参数调优与资源管理技巧 当数据集规模膨胀或模型复杂度攀升时,交叉验证可能从几分钟的等待变成数小时的煎熬。许多工程师习惯性设置n_jobs-1后便放任不管,直到内存溢出或日志淹没控制台才手忙脚乱。本文将揭示cross_…...
链式队列:高效实现O(1)入队出队
引言在之前的文章中,我们系统学习了栈结构(顺序栈和链栈)。栈是"后进先出"(LIFO)的结构,而今天要讲解的队列(Queue)则是"先进先出"(FIFO,…...
Verilog实战:从零构建高效仲裁器(Arbiter)的设计与优化
1. 仲裁器基础概念与设计需求 在数字系统中,当多个主设备(Master)需要共享同一总线或存储资源时,仲裁器就像交通警察一样协调访问顺序。我遇到过这样一个真实案例:某AI芯片设计中使用8个计算单元共享DDR控制器…...
华为设备Traffic Policy配置避坑指南:ACL规则顺序与Classifier匹配逻辑详解
华为设备Traffic Policy配置避坑指南:ACL规则顺序与Classifier匹配逻辑详解 在网络工程师的日常工作中,华为设备的QoS策略配置是一个既基础又复杂的话题。特别是当我们需要对特定流量进行精细控制时,Traffic Policy的正确配置就显得尤为重要。…...
AgentHeroes:AI角色生成到发布的自动化工作流全栈平台
1. 项目概述与核心价值最近在折腾AI内容生成的朋友,估计都遇到过这么个头疼事儿:好不容易用Stable Diffusion或者Midjourney跑出来一张满意的角色图,想让它动起来、甚至批量生成内容发布到社交媒体,整个流程就变得支离破碎。你得先…...
Vim/Neovim集成AI编程助手Neural:提升开发效率的本地化实践
1. 项目概述:在Vim/Neovim中集成AI编程助手 如果你和我一样,是个常年泡在终端和编辑器里的开发者,那你肯定对Vim或Neovim有着特殊的感情。它们高效、可定制,几乎成了我们思维的外延。但有时候,面对一些重复性的代码模…...
OpenAI Agents SDK实战:构建多智能体协作系统的核心概念与最佳实践
1. 从零到一:理解 OpenAI Agents SDK 的核心价值 如果你正在用 JavaScript 或 TypeScript 捣鼓 AI 应用,尤其是想让多个 AI 智能体(Agent)协同工作,那么 OpenAI 官方推出的这个 Agents SDK 绝对值得你花时间研究。它不…...
3分钟实现Windows系统光标全面升级:macOS风格光标完全指南
3分钟实现Windows系统光标全面升级:macOS风格光标完全指南 【免费下载链接】macOS-cursors-for-Windows Tested in Windows 10 & 11, 4K (125%, 150%, 200%). With 2 versions, 2 types and 3 different sizes! 项目地址: https://gitcode.com/gh_mirrors/ma/…...
量子优化算法与经典算法在Max-Cut问题中的性能对比
1. 量子优化算法与Max-Cut问题概述 Max-Cut问题是图论中一个经典的NP难组合优化问题,其目标是将给定无向图的顶点划分为两个互不相交的子集,使得连接这两个子集的边权重之和最大。这个问题在统计物理、电路设计和网络聚类等领域有广泛应用背景。随着量子…...
【信息科学与工程学】计算机科学与自动化——第一百五十一篇 云计算操作系统函数说明02
威胁情报与狩猎模块(361-370) 编号 模块/组件类型 模块中的函数名称和函数的参数列表和函数的实现方式 函数的详细功能和计算机科学的所有性能【含参数列表】和功能说明 关联的其他函数【含上下文关系】 和对应模块【含上下文关系】 关联的软件/硬件核心知识点【需要涵…...
