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://www.rhkb.cn/news/39010.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Mac M1/M2芯片上完美安装DeepCTR库:避坑指南与实战验证

让推荐算法在Apple Silicon上全速运行 概述 作为推荐系统领域的最经常用的明星库,DeepCTR集成了CTR预估、多任务学习等前沿模型实现。但在Apple Silicon架构的Mac设备上,安装过程常因ARM架构适配、依赖库版本冲突等问题受阻。本文通过20次环境搭建实测…

c#知识点补充4

1.发布者订阅模式 发布者 订阅者 俩者直接的关联使用

3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride

机器自动化控制器——第三章 轴指令 12 MC_SetOverride变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_SetOverride 变更轴的目标速度。 指令名称FB/FUN图形表现ST表现MC_SetOverride超调值设定FBMC_SetOverride_instan…

Cocos Creator Shader入门实战(五):材质的了解、使用和动态构建

引擎:3.8.5 您好,我是鹤九日! 回顾 前面的几篇文章,讲述的主要是Cocos引擎对Shader使用的一些固定规则,这里汇总下: 一、Shader实现基础是OpenGL ES可编程渲染管线,开发者只需关注顶点着色器和…

体育直播模板nba英超直播欧洲杯直播模板手机自适应

源码名称:体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 模板特点: 程序伪静态…

python基于spark的心脏病患分类及可视化(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,汽车数据分析平台当然不能排除在外。本次我所开发的心脏病患分类及可视化系统是在实际应用和软件工程的开发原理之上,运用Pyth…

SAP 附件增删改查与文件服务器交互应用

【需求背景】 非SAP标准附件应用,自定义一套,跟公司内部文档服务器交互,支持各个应用场景的附件增删改查等。 每个附件在文件服务器上都有一个文件唯一ID作为关键字。 应用分两块:SAP GUI端,跟WDA Portal端应用 GU…

Linux__之__基于UDP的Socket编程网络通信

前言 本篇博客旨在使用Linux系统接口进行网络通信, 帮助我们更好的熟悉使用socket套接字网络通信, 学会了socket网络通信, 就能发现所谓网络, 不过都是套路而已, 话不多说, 让我们直接进入代码编写部分. 1. 事先准备 今天我们先来模拟实现一个echo demo, 也就是客户端向服务…

【Agent】Dify Docker 安装问题 INTERNAL SERVER ERROR

总结:建议大家选择稳定版本的分支,直接拉取 master 分支,可能出现一下后面更新代码导致缺失一些环境内容。 启动报错 一直停留在 INSTALL 界面 我是通过 Docker 进行安装的,由于项目开发者不严谨导致,遇到一个奇怪的…

unity开发效率提升笔记

本文将记录提升Unity开发效率的若干细节,持续更新 一.VSCode文件标签多行显示 1.File->Preference->Settings (快捷键Ctrl 逗号) 2.搜索workbench.editor.wrapTabs 3.勾选上这个单选开关 若依然不是多行 4.搜索workbench.editor.tabSizing,选择fi…

python每日十题(6)

列表操作函数有(假设列表名为ls): len(ls):返回列表ls的元素个数(长度)。min(ls):返回列表ls的最小元素。max(ls):返回列表ls的最大元素。list(x):将x转变为列表类型。使…

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…

使用HAI来打通DeepSeek的任督二脉

一、什么是HAI HAI是一款专注于AI与科学计算领域的云服务产品,旨在为开发者、企业及科研人员提供高效、易用的算力支持与全栈解决方案。主要使用场景为: AI作画,AI对话/写作、AI开发/测试。 二、开通HAI 选择CPU算力 16核32GB,这…

mysql——第二课

学生表 CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,sex varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,age int(11) DEFAULT NULL,c_id int(10) DEFAULT NULL,PRIMARY KEY (id),KEY c_id (c_id),CONSTR…

单播、广播、组播和任播

文章目录 一、单播二、广播三、组播四、任播代码示例: 五、各种播的比较 一、单播 单播(Unicast)是一种网络通信方式,它指的是在网络中从一个源节点到一个单一目标节点对的传输模式。单播传输时,数据包从发送端直接发…

1-1 MATLAB深度极限学习机

本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 参考[1]魏洁.深度极限学习机的研究与应用[D].太原理工大学[2023-10-14].DOI:CNKI:CDMD:2.1016.714596. 目录 0.引言 1.ELM-AE实现 2.DE…

头歌 数据采集概述答案

问题1:以下哪个不是Scrapy体系架构的组成部分? 正确答案:B. 支持者(Support) 解释:Scrapy的主要组成部分包括: 爬虫(Spiders):定义如何爬取网站和提取数据 引擎(Engine):负责控制数据流在系统中…

【uniapp】记录tabBar不显示踩坑记录

由于很久没有使用uniapp了,官方文档看着又杂乱,底部tab导航栏一直没显示,苦思许久,没有发现原因,最后网上搜到帖子,list里的第一个数据,pages 的第一个 path 必须与 tabBar 的第一个 pagePath 相…

JVM 知识点梳理

JDK 、JRE、JVM JDK( Java Development Kit ) Java开发工具包 JRE 开发命令工具(运行java.exe、编译javac.exe、javaw.exe) JRE( Java Runtime Environment )Java运行环境 JVM Java核心类库(l…

蓝桥杯 之 第27场月赛总结

文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决5.未来竞赛6.备份比赛数据 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题,是一个二维dp的问题,转化为对应的动态规划求解 力扣…