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

HTTP长连接与短连接的前世今生

HTTP长连接与短连接的前世今生

大家好!作为一名在互联网摸爬滚打多年的开发者,今天想跟大家聊聊HTTP中的长连接和短连接这个话题。

记得我刚入行时,对这些概念一头雾水,希望这篇文章能帮助新入行的朋友少走些弯路。

什么是HTTP连接?

在谈长短连接之前,我们先搞清楚HTTP连接是什么。

简单来说,当你的浏览器访问一个网站时,你的电脑和服务器之间需要建立一条通信的"管道",这就是HTTP连接。通过这个管道,你可以请求网页、图片等资源,服务器则把这些资源返回给你。

短连接 —— 一次性的交流

早期的HTTP/1.0默认使用短连接。啥是短连接?就像你去便利店买东西,结完账就走人,下次再买还得重新排队一样。
在这里插入图片描述

短连接的工作流程如下

  1. 客户端向服务器发起TCP连接请求
  2. 服务器接受连接并等待客户端请求
  3. 客户端发送请求资源
  4. 服务器返回资源
  5. 服务器关闭连接
  6. 如果客户端还需要请求其他资源,则重复上述步骤

用代码模拟一下这个过程

// 模拟HTTP短连接过程
function simulateShortConnection() {console.log("--- 短连接模式 ---");// 请求页面HTMLconsole.log("客户端 → 开始建立TCP连接...");setTimeout(() => {console.log("服务器 → TCP连接已建立");setTimeout(() => {console.log("客户端 → 请求index.html");setTimeout(() => {console.log("服务器 → 返回index.html内容");console.log("服务器 → 关闭TCP连接");console.log("--- 第一次请求结束 ---");// 请求页面中的图片资源setTimeout(() => {console.log("客户端 → 开始建立新的TCP连接...");setTimeout(() => {console.log("服务器 → 新的TCP连接已建立");setTimeout(() => {console.log("客户端 → 请求logo.png");setTimeout(() => {console.log("服务器 → 返回logo.png内容");console.log("服务器 → 关闭TCP连接");console.log("--- 第二次请求结束 ---");}, 200);}, 100);}, 300);}, 500);}, 200);}, 100);}, 300);
}// 执行模拟
simulateShortConnection();

短连接的特点也很明显

优点

  • 管理简单,服务器处理完就释放资源
  • 服务器可以支持更多的客户端连接

缺点

  • 每次请求都要重新建立连接,增加延迟
  • TCP连接的建立和关闭会消耗不少资源
  • 对于网页这种需要请求多个资源的场景非常低效

想象一下,一个普通网页可能包含HTML、多张图片、CSS和JavaScript文件,如果每次请求都要建立一次连接,那网页加载速度得慢成啥样啊!

长连接 —— 可复用的管道

随着互联网的发展,HTTP/1.1开始默认使用长连接(Keep-Alive)。长连接就像你办了一张会员卡,可以反复进出商店而不用每次都重新登记一样。
在这里插入图片描述

长连接的工作流程如下

  1. 客户端向服务器发起TCP连接请求
  2. 服务器接受连接并等待客户端请求
  3. 客户端发送请求资源
  4. 服务器返回资源,但不关闭连接
  5. 客户端可以继续使用同一连接发送更多请求
  6. 连接在空闲一段时间后或通过特定指令才会关闭

长连接代码模拟

// 模拟HTTP长连接过程
function simulateLongConnection() {console.log("--- 长连接模式 ---");// 建立连接(只建立一次)console.log("客户端 → 开始建立TCP连接...");setTimeout(() => {console.log("服务器 → TCP连接已建立");console.log("服务器 → 设置 Connection: keep-alive");// 第一次请求setTimeout(() => {console.log("客户端 → 在已有连接上请求index.html");setTimeout(() => {console.log("服务器 → 返回index.html内容");console.log("服务器 → 保持连接开启状态");console.log("--- 第一次请求结束,连接保持 ---");// 第二次请求,复用已有连接setTimeout(() => {console.log("客户端 → 在相同连接上请求logo.png");setTimeout(() => {console.log("服务器 → 返回logo.png内容");console.log("服务器 → 保持连接开启状态");console.log("--- 第二次请求结束,连接保持 ---");// 第三次请求,依然复用连接setTimeout(() => {console.log("客户端 → 在相同连接上请求style.css");setTimeout(() => {console.log("服务器 → 返回style.css内容");console.log("服务器 → 保持连接开启状态");console.log("--- 第三次请求结束,连接保持 ---");// 空闲超时setTimeout(() => {console.log("服务器 → 检测到连接空闲时间超过阈值");console.log("服务器 → 关闭TCP连接");console.log("--- 长连接会话结束 ---");}, 2000);}, 200);}, 500);}, 200);}, 500);}, 200);}, 100);}, 300);
}// 执行模拟
simulateLongConnection();

长连接的特点

优点

  • 减少TCP连接建立和关闭的开销
  • 降低了延迟,提升了响应速度
  • 减轻了服务器和客户端的负担
  • 对于加载网页这种需要多次请求的场景非常高效

缺点

  • 如果连接长时间不关闭,可能会占用服务器资源
  • 需要额外的机制来管理空闲连接

长连接是如何实现的?

HTTP/1.1默认使用长连接,通过在header中设置Connection: keep-alive来实现。服务器和客户端也可以通过设置Keep-Alive: timeout=5, max=100这样的参数来控制连接的最大空闲时间和最大请求数。

// 客户端请求
GET /index.html HTTP/1.1
Host: www.example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml// 服务器响应
HTTP/1.1 200 OK
Date: Sun, 23 Mar 2025 10:15:30 GMT
Content-Type: text/html
Content-Length: 1234
Connection: keep-alive
Keep-Alive: timeout=5, max=1000// HTML内容...// 在同一连接上的后续请求
GET /style.css HTTP/1.1
Host: www.example.com
Connection: keep-alive
Accept: text/css// 服务器响应
HTTP/1.1 200 OK
Date: Sun, 23 Mar 2025 10:15:31 GMT
Content-Type: text/css
Content-Length: 567
Connection: keep-alive
Keep-Alive: timeout=5, max=999// CSS内容...

长短连接的使用场景对比

既然长连接这么好,那是不是应该一直使用长连接呢?也不是。我们来看看它们各自的适用场景。

短连接适用场景

  • 客户端很少请求服务器,如只需获取一个资源
  • 服务器需要处理大量并发客户端,资源有限
  • 实时性要求不高的服务

长连接适用场景

  • 客户端频繁请求同一服务器,如网页浏览
  • 服务器资源充足,并发量可控
  • 需要降低延迟,提高用户体验
  • 需要保持状态或会话的场景

HTTP/2和HTTP/3的连接优化

随着技术的发展,HTTP/2和HTTP/3在连接管理上又有了大幅改进。

HTTP/2引入了多路复用(Multiplexing)技术,允许在一个长连接上并行处理多个请求,不再受到队头阻塞的限制。

在这里插入图片描述

HTTP/3则更进一步,使用UDP作为传输层协议,实现了更快的连接建立和更好的网络切换体验。

实际开发中的长短连接处理

作为开发者,在实际工作中如何处理长短连接呢?

  1. 前端开发

    • 使用浏览器的默认行为,现代浏览器对连接有智能管理
    • 合理组织资源,减少不必要的请求
    • 考虑使用HTTP/2来获得更好的性能
  2. 后端开发

    • 正确配置服务器的keep-alive参数
    • 合理设置超时时间,避免资源浪费
    • 监控连接数量,防止连接泄漏
    • 针对不同API选择合适的连接策略
  3. 移动端开发

    • 根据网络环境动态调整连接策略
    • 弱网环境下可能需要减少连接次数,倾向于使用长连接

总结回顾

长短连接各有优缺点,关键在于根据自己的业务场景选择合适的方式。简单来说

  • 短连接 —— 一次性交流,建立连接→通信→断开连接→重复
  • 长连接 —— 保持对话,建立连接→多次通信→空闲一段时间后才断开

随着技术的发展,大多数现代Web应用都默认使用长连接,并且随着HTTP/2和HTTP/3的普及,连接管理变得更加高效。

理解HTTP连接的工作原理对于构建高性能的Web应用至关重要。希望这篇文章能帮助你更好地了解长短连接的本质,在开发中做出更明智的选择。

你们最近有没有遇到什么连接相关的性能问题?欢迎在评论区分享讨论!

相关文章:

HTTP长连接与短连接的前世今生

HTTP长连接与短连接的前世今生 大家好!作为一名在互联网摸爬滚打多年的开发者,今天想跟大家聊聊HTTP中的长连接和短连接这个话题。 记得我刚入行时,对这些概念一头雾水,希望这篇文章能帮助新入行的朋友少走些弯路。 什么是HTTP…...

批量将 PPT 文档中的图片提取到文件夹

在 PPT 文档中我们可以插入很多的图片来丰富我们的幻灯片页面,但是当我们需要将 PPT 幻灯片中的图片提取出来的时候,会非常的麻烦,因为我们需要打开 PPT 然后将图片保存起来。会非常的耗费我们的时间和精力。今天给大家介绍的就是一种批量将 …...

yolo目标检测算法在DJI上的研究分析(大纲)

yolo目标检测算法在DJI上的研究分析 面向边缘计算的实时目标检测系统设计与部署 第一章 绪论 1.1 研究背景与意义 目标检测技术需求: DJI设备(如无人机、摄像头)在安防、巡检、农业等场景中的广泛应用现有YOLO算法在高分辨率图像或资源受限…...

图像处理篇:图像预处理——从数据到模型的桥梁

图像预处理是计算机视觉任务中至关重要的一环,它直接影响模型的训练效果和推理性能。无论是深度学习还是传统机器学习,图像预处理都是不可或缺的步骤。本文将深入探讨图像预处理的核心技术、常见方法及其在实际应用中的最佳实践,帮助你从零开…...

MyBatisPlus(SpringBoot版)学习第二讲:基本CRUD

目录 1.BaseMapper 2. 基本CRUD 1. 插入一条记录 2. 删除 1>. 根据ID删除 2>. 根据实体(ID)删除 3>. 根据columnMap条件删除 4>. 根据entity条件删除 5>. 根据ID批量删除 3. 修改 1>. 根据ID修改 2>. 根据whereEntity条…...

SAP-ABAP:SAP系统架构技术白皮书

SAP系统架构技术白皮书 模块化设计 高性能扩展 智能优化 一、核心架构:三层模型技术解析 架构拓扑图 [用户端] ←HTTP/DIAG→ [应用服务器集群] ←SQL→ [数据库服务器] │ │ └─SAP GUI/Web───┘ 分层技术指标对比 架构层组件构成性能…...

Django REST Framework 请求封装源码解析与实现流程

版本说明: Django: V4.2.20 Django Rest Framework: V3.15.2 一、核心封装流程示意图 #mermaid-svg-qXJLIa9Bx1TCiPSN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qXJLIa9Bx1TCiPSN .error-icon{fill…...

RK3588开发笔记-buildroot添加telnet服务

目录 前言 一、Telnet服务背景与适用场景 二、telnet服务开启 Busybox 配置 三、固件编译及烧录 RK3588烧录验证 客户端连接测试 3.1 Linux/MacOS连接 3.2 Windows连接 总结 前言 本文主要介绍在RK3588 SDK文件包中添加telnet服务,由于sdk buildroot默认添加的是ssh服…...

基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

Bitcoin Thunderbolt 内测通道开启,加速比特币交易新时代

比特币作为全球领先的加密货币,一直占据着去中心化金融的核心地位。然而,随着比特币生态的不断扩展,其交易速度和扩容问题逐渐成为制约发展的关键瓶颈。为解决这一难题, 比特币雷电网络(Bitcoin Thunderbolt&#xff0…...

STM32 模拟SPI 模式0

SPI 模式 0 的时钟极性(CPOL)为 0,时钟相位(CPHA)为 0。CPOL 0 意味着时钟信号空闲时为低电平,CPHA 0 表示在时钟信号的第一个跳变沿(上升沿)进行数据采样。 #include "stm3…...

QT笔记----QCheckBox

文章目录 概要1、QCheckBox 的基本概念2、单个QCheckBox3、多个QCheckBox同时应用3.1、实现效果3.2、实现Demo 概要 在 Qt 应用程序开发中,QCheckBox 是一个常用的用户界面元素,它允许用户在两种状态(选中和未选中)之间进行切换&a…...

GR00T N1——英伟达开源的通用人形VLA:类似Helix的快与慢双系统,且可类似ViLLA利用海量的无标注视频做训练

前言 就在昨天3.19日的凌晨,英伟达发布的GR00T N1还是很有含金量的(上午已有好几个朋友私我了),由此可以看到很多相关工作的影子,比如helix π0 LAPA,具体而言,其具有双系统架构 VLM模块(系统2)通过视觉和语言指令解…...

Bash 脚本基础

一、Bash 脚本基础 什么是 Bash 脚本:Bash 脚本是一种文本文件,其中包含了一系列的命令,这些命令可以被 Bash shell 执行。它用于自动化重复性的任务,提高工作效率。 Bash 脚本的基本结构:以 #!/bin/bash 开头&#x…...

SQLite Delete 语句详解

SQLite Delete 语句详解 SQLite 是一种轻量级的数据库管理系统,广泛应用于移动设备、嵌入式系统和服务器端应用。在数据库管理中,删除数据是一项基本操作。SQLite 提供了强大的删除功能,本文将详细介绍 SQLite 的 Delete 语句及其用法。 1.…...

Mysql深分页的解决方案

在数据量非常大的情况下,深分页查询则变得很常见,深分页会导致MySQL需要扫描大量前面的数据,从而效率低下。例如,使用LIMIT 100000, 10时,MySQL需要扫描前100000条数据才能找到第10000页的数据。 在MySQL中解决深分页…...

数据建模流程: 概念模型>>逻辑模型>>物理模型

数据建模流程 概念模型 概念模型是一种高层次的数据模型,用于描述系统中的关键业务概念及其之间的关系。它主要关注业务需求和数据需求,而不涉及具体的技术实现细节。概念模型通常用于在项目初期帮助业务人员和技术人员达成共识,确保对业务需…...

光谱仪与光谱相机的核心区别与协同应用

一、核心功能与数据维度 ‌光谱仪‌ ‌功能定位‌:专注单点或线状区域的光谱分析,通过色散元件(光栅/棱镜)分离波长,生成一维或二维光谱曲线,用于量化光强、吸收率等参数‌。 ‌数据维度‌:输…...

路由工程师大纲-2:结合AI技术构建路由拓扑与BGP异常检测的知识链体系

一、领域交叉技术图谱 1. 路由拓扑测绘: 图神经网络(GNN):建模网络结构,预测链路稳定性。复杂网络分析:计算节点中心性(如PageRank)、社区发现(Louvain算法)。可视化工具:Gephi/NetworkX + PyTorch Geometric(图嵌入)。2. BGP异常检测: 时间序列模型:LSTM/Tran…...

运行时智控:PanLang 开发者指南(一)运行时系统核心模块实现——PanLang 原型全栈设计方案与实验性探索5

运行时智控:PanLang 开发者指南(一)运行时系统核心模块实现——PanLang 原型全栈设计方案与实验性探索5 文章目录 运行时智控:PanLang 开发者指南(一)运行时系统核心模块实现——PanLang 原型全栈设计方案与…...

再次理解 Spring 中的 IOC、DI、AOP 与多态

目录 引言 1. IOC(控制反转) 1.1 什么是 IOC? 1.2 IOC 的核心思想 1.3 IOC 的实现 2. DI(依赖注入) 2.1 什么是 DI? 2.2 DI 的实现方式 2.3 DI 的核心作用 3. AOP(面向切面编程&#x…...

rocky linux 与centos系统的区别

Rocky Linux 和 CentOS 都是基于 Red Hat Enterprise Linux(RHEL)的社区发行版,但两者在目标定位、更新策略和社区管理上有显著差异。以下是核心区别的详细对比: 一、背景与定位 特性Rocky LinuxCentOS起源由 CentOS 联合创始人…...

操作系统导论——第13章 抽象:地址空间

一、早期系统 从内存来看,早期的机器并没有提供多少抽象给用户。基本上,机器的物理内存如图13.1所示 操作系统曾经是一组函数(实际上是一个库),在内存中(在本例中,从物理地址0开始)&…...

C# 调用 VITS,推理模型 将文字转wav音频net8.0 跨平台

一、系统环境 操作系统:win10,win11 运行环境:dotnet8 工具:命令行,powershell 开源库:sherpa-onnx 二、工具和源码下载 开源库:https://k2-fsa.github.io/sherpa/onnx/index.html 运行环境下载 https://dotnet.microsoft.c…...

织梦DedeCMS如何获得在列表和文章页获得顶级或上级栏目名称

获得顶级或二级栏目的名称,都需要修改php文件,修改的文件【/include/common.func.php】将代码插入到这个文件的最下面即可; 一、获得当前文章或栏目的【顶级栏目】名称 1、插入顶级栏目代段 //获取顶级栏目名 function GetTopTypename($id…...

深度学习仓库代码结构认识

规范化深度学习代码仓库的目录结构和文件组织方式,以便于代码的管理、协作和复现性。 一种供参考的目录树结构: . ├── README.md ├── requirements.txt ├── data/ ├── docs/ ├── logs/ └── src/├── configs/│ └── config.y…...

C#基于MVC模式实现TCP三次握手,附带简易日志管理模块

C#基于MVC模式实现TCP三次握手 1 Model1.1 ServerModel1.2 ClientModel1.3 配置参数模块1.4 日志管理模块1.4.1 数据结构1.4.1 日志管理工具类1.4.1 日志视图展示1.4.1.1 UcLogManage.cs1.4.1.2 UcLogManage.Designer.cs 2 视图(View)2.1 ViewServer2.1.…...

6、linux c 线程 -下

1. 线程的取消 意义 随时终止一个线程的执行。 函数 #include <pthread.h> ​ int pthread_cancel(pthread_t thread); pthread_t thread&#xff1a;要取消的线程 ID。 返回值 成功时返回 0。 失败时返回非零错误码。 注意 线程的取消需要有取消点&#xff0c…...

分布式算法:Paxos Raft 两种共识算法

1. Paxos算法 Paxos算法是 Leslie Lamport&#xff08;莱斯利兰伯特&#xff09;在 1990 年提出的一种分布式系统共识算法。也是第一个被证明完备的共识算法&#xff08;前提是不存在恶意节点&#xff09;。 1.1 简介 Paxos算法是第一个被证明完备的分布式系统共识算法。共识…...

什么是数据库监控

数据库监控是一个综合的过程&#xff0c;涉及观察、分析和优化组织内数据库的性能、运行状况和可用性。通过持续跟踪查询执行时间、CPU使用率、内存消耗和存储I/O等指标&#xff0c;数据库监控使管理员能够主动识别和解决潜在问题。这种对数据库操作的实时可见性对于确保应用程…...