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

持久性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):

  1. 请求HTML文件
    • 客户端发送GET /index.html → 服务器返回HTML文件 → 关闭连接
  2. 请求图片1
    • 新建TCP连接 → GET /image1.jpg → 返回图片 → 关闭连接
  3. 重复步骤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加载:

  1. 建立TCP连接 → 请求HTML文件 → 返回HTML → 保持连接
  2. 复用同一连接依次请求图片1、2、3,无需重复握手。

性能优化计算

  • 总耗时 = 1次握手(3 RTT) + 4次数据传输(4 RTT) = 7 RTT(节省33%时间)。

3.3 性能优势

优势原因
低延迟复用连接省去重复握手/挥手时间
高吞吐量减少TCP缓冲区重建开销,提升数据传输效率
资源利用率高服务器和客户端减少连接管理开销

4.对比一下

特性非持久性HTTP持久性HTTP
连接生命周期每次请求后关闭连接复用同一连接处理多个请求
默认协议版本HTTP/1.0HTTP/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&#xff08;HyperText Transfer Protocol&#xff09;是Web通信的核心协议&#xff0c;定义了客户端&#xff08;浏览器&#xff09;与服务器之间传输数据的规则。 在HTTP/1.0及之前的版本中&#xff0c;默认使用非持久性连接&#xff0c;而HTTP/1.1及更…...

自动化UI测试 | 什么是测试驱动开发(TDD)和行为驱动开发(BDD)?有何区别?

TDD&#xff08;测试驱动开发&#xff09;和BDD&#xff08;行为驱动开发&#xff09;是两种独特的软件开发技术&#xff0c;它们在测试的内容和方式上有所不同。尽管名称相似&#xff0c;但服务于不同的目的。 什么是TDD&#xff1f; TDD代表测试驱动开发。它是一个过程&…...

在 PyCharm 中接入deepseek的API的各种方法

在 PyCharm 中接入 DeepSeek 的 API&#xff0c;通常需要以下步骤&#xff1a; 1. 获取 DeepSeek API 密钥 首先&#xff0c;确保你已经在 DeepSeek 平台上注册并获取了 API 密钥&#xff08;API Key&#xff09;。如果没有&#xff0c;请访问 DeepSeek 的官方网站注册并申请 …...

postman登录cookie设置

1.设置环境变量&#xff0c; 定义变量存放共享的登录信息 如Cookie 2.登录接口编码test脚本获取cookie信息 let jsessionidCookie pm.cookies.get("JSESSIONID");if (jsessionidCookie) {let cookie "JSESSIONID" jsessionidCookie "; Admin-Tok…...

如何使用ps批量去除固定位置水印

使用 Photoshop 批量去除固定位置的水印&#xff0c;有几种方法可以实现自动化&#xff0c;具体取决于水印的复杂程度和你对 Photoshop 的熟悉程度&#xff1a; 1. 动作&#xff08;Actions&#xff09; 批处理&#xff08;Batch&#xff09;&#xff1a; 这是最常用的方法&…...

AI代理软件行业白皮书

本AI代理软件行业白皮书的前言应涵盖以下核心内容&#xff1a; 行业背景与市场趋势 全球AI代理构建软件市场2023年销售额达3.17亿美元&#xff0c;预计2030年将增至4.77亿美元&#xff08;年复合增长率6.7%&#xff09;&#xff0c;中国市场增长尤为显著。IBM、Microsoft等企业…...

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…...

机器学习·逻辑回归

前言 逻辑回归虽然名称中有 “回归”&#xff0c;但实际上用于分类问题。基于线性回归的模型&#xff0c;通过使用逻辑函数&#xff08;如 Sigmoid 函数&#xff09;将线性组合的结果映射到0到1之间的概率值&#xff0c;用于表示属于某个类别的可能性。 一、逻辑回归 vs 线性回…...

C#上位机--结构

引言 在 C# 上位机开发中&#xff0c;我们常常需要处理各种数据&#xff0c;例如从硬件设备采集到的传感器数据、与下位机通信时传输的数据包等。结构&#xff08;struct&#xff09;作为 C# 中的一种值类型&#xff0c;在这种场景下有着广泛且重要的应用。它可以将多个相关的…...

hydra.utils.instantiate函数介绍

hydra.utils.instantiate 是 Hydra 提供的一个动态实例化函数&#xff0c;它可以根据 OmegaConf 配置字典&#xff08;DictConfig&#xff09; 自动创建 Python 对象&#xff08;如类、函数等&#xff09;。 它的主要作用是&#xff1a; ✅ 从配置文件动态创建对象&#xff08…...

Qt的QTableWidget样式设置

在 Qt 中&#xff0c;可以通过样式表&#xff08;QSS&#xff09;为 QTableWidget 设置各种样式。以下是一些常见的样式设置示例&#xff1a; 1. 基本样式设置 tableWidget->setStyleSheet(// 表格整体样式"QTableWidget {"" background-color: #F0F0F0;…...

Moretl 增量文件采集工具

永久免费: <下载> <使用说明> 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架构: Asp…...

dedecms 开放重定向漏洞(附脚本)(CVE-2024-57241)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

深入理解 MyBatis 框架的核心对象:SqlSession

Mybatis框架中的SqlSession对象详解 引言 MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0…...

ndk 编译opencv(去除libandroid.so mediandk依赖)

简单的bash运行 需要关注的&#xff1a; OPENCV_EXTRA_MODULES_PATH &#xff1a; opencv contrib库BUILD_opencv_XXX &#xff1a;添加contrib库后默认是contrib库全部编译&#xff0c;用这个控制需要关闭的NDK的路径 export ANDROID_NDK/media/hello/data/3rd_party/25.2.…...

MySQL索引和其底层数据结构介绍

索引在项目中非常常见&#xff0c;它是一种帮助MySQL高效获取数据的数据结构&#xff0c;主要用来提高数据检索效率&#xff0c;降低数据库的I/O成本。同时&#xff0c;索引列可以对数据进行排序&#xff0c;降低数据排序的成本&#xff0c;也能减少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布尔盲注、时间盲注

一、布尔盲注 布尔盲注&#xff08;Boolean-based Blind SQL Injection&#xff09;是一种SQL注入技术&#xff0c;用于在应用程序不直接显示数据库查询结果的情况下&#xff0c;通过构造特定的SQL查询并根据页面返回的不同结果来推测数据库中的信息。这种方法依赖于SQL查询的…...

RocketMQ与kafka如何解决消息丢失问题?

0 前言 消息丢失基本是分布式MQ中需要解决问题&#xff0c;消息丢失时保证数据可靠性的范畴。如何保证消息不丢失程序员面试中几乎不可避免的问题。本文主要说明RocketMQ和Kafka在解决消息丢失问题时&#xff0c;在生产者、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 停止持续定位 四、总结 …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...