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

news2025/3/28 3:57:37

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

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

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

什么是HTTP连接?

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

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

短连接 —— 一次性的交流

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

短连接的工作流程如下

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

用代码模拟一下这个过程

// 模拟HTTP短连接过程
function simulateShortConnection() {
  console.log("--- 短连接模式 ---");
  
  // 请求页面HTML
  console.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://www.coloradmin.cn/o/2321080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

批量将 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条…

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

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

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

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

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)通过视觉和语言指令解…

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

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

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

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

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

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

操作系统导论——第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…

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.…

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

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

什么是数据库监控

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

Java学习总结-泛型

什么是泛型&#xff1f; 定义 类、接口、方法时&#xff0c;同时声明了一个或多个类型变量&#xff08;如&#xff1a;<E>&#xff09;&#xff0c;称为泛型类、泛型接口、泛型方法、他们统称为泛型。public class ArrayList<E>{ }。 有什么作用呢&#xf…

基于深度学习的相位调制算法步骤

1.构建网络结构 2.制作数据集 3.训练网络 4.引入评价指标 5.迭代优化 总结 通过以上步骤&#xff0c;可以实现基于深度学习的相位调制算法&#xff1a; 使用 U-Net 构建神经网络。 生成数据集并训练网络。 使用训练好的网络预测相位分布。 通过相关系数 γ 评估调制效果&…

Go语言的基础类型

一基础数据类型 一、布尔型&#xff08;Bool&#xff09; 定义&#xff1a;表示逻辑真 / 假&#xff0c;仅有两个值&#xff1a;true 和 false内存占用&#xff1a;1 字节使用场景&#xff1a;条件判断、逻辑运算 二、数值型&#xff08;Numeric&#xff09; 1. 整数类型&…

动力保护板测试仪:电池安全的坚实守护者

在新能源技术日新月异的今天&#xff0c;电池作为各类电子设备的心脏&#xff0c;其安全性与可靠性成为了行业内外关注的焦点。而动力保护板&#xff0c;作为电池系统中的重要组成部分&#xff0c;承担着精准调控电池充放电、防止电池过充、过放、短路等危险情况的重任。然而&a…

Lineageos 22.1(Android 15)制定应用强制横屏

一、前言 有时候需要系统的某个应用强制衡平显示&#xff0c;不管他是如何配置的。我们只需要简单的拿到top的Task下面的ActivityRecord&#xff0c;并判断包名来强制实现。 二、调整wms com.android.server.wm.DisplayRotation /*** Given an orientation constant, return…