HTTP连接管理——短连接,长连接,HTTP 流水线

连接管理是一个 HTTP 的关键话题:打开和保持连接在很大程度上影响着网站和 Web 应用程序的性能。在 HTTP/1.x 里有多种模型:短连接、_长连接_和 HTTP 流水线。
在这里插入图片描述
下面分别来详细解释

短连接

HTTP 协议最初(0.9/1.0)是个非常简单的协议,通信过程也采用了简单的 “请求 - 应答” 方式。
它底层的数据传输基于 TCP/IP,每次发送请求前需要先与服务器建立连接,收到响应报文后会立即关闭连接。
因为客户端与服务器的整个连接过程很短暂,不会与服务器保持长时间的连接状态,所以就被称为 “短连接”(short-lived connections)。早期的 HTTP 协议也被称为是 “无连接” 的协议。

这是 HTTP/1.0 的默认模型(如果没有指定 Connection 协议头,或者是值被设置为 close)。而在 HTTP/1.1 中,只有当 Connection 被设置为 close 时才会用到这个模型。

问题

在 TCP 协议里,建立连接和关闭连接都是非常 “昂贵” 的操作。TCP 建立连接要有“三次握手”,发送 3 个数据包,需要 1 个 RTT;关闭连接是“四次挥手”,4 个数据包需要 2 个 RTT。
而 HTTP 的一次简单 “请求 - 响应” 通常只需要 4 个包,如果不算服务器内部的处理时间,最多是 2 个 RTT。这么算下来,浪费的时间就是“3÷5=60%”,有三分之二的时间被浪费掉了,传输效率低得惊人。

长连接

针对短连接暴露出的缺点,HTTP 协议就提出了 “长连接” 的通信方式,也叫 “持久连接”(persistent connections)、“连接保活”(keep alive)、“连接复用”(connection reuse)
把 TCP 的连接和关闭时间成本由原来的一个 “请求 - 应答” 均摊到多个 “请求 - 应答” 上。
这样虽然不能改善 TCP 的连接效率,但基于 “分母效应”,每个 “请求 - 应答” 的无效时间就会降低不少,整体传输效率也就提高了。
短连接与长连接的对比示意图。

缺点

就算是在空闲状态,它还是会消耗服务器资源,而且在重负载时,还有可能遭受 DoS 攻击。这种场景下,可以使用非长连接,即尽快关闭那些空闲的连接,也能对性能有所提升。

HTTP/1.0 里默认并不使用长连接。把 Connection 设置成 close 以外的其他参数都可以让其保持长连接,通常会设置为 retry-after。
在 HTTP/1.1 里,默认就是长连接的,不再需要标头(但我们还是会把它加上,万一某个时候因为某种原因要退回到 HTTP/1.0 呢)。

HTTP 流水线

默认情况下,HTTP 请求是按顺序发出的。下一个请求只有在当前请求收到响应过后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。
流水线是在同一条长连接上发出连续的请求,而不用等待应答返回。这样可以避免连接延迟。理论上讲,性能还会因为两个 HTTP 请求有可能被打包到一个 TCP 消息包中而得到提升。就算 HTTP 请求不断的继续,尺寸会增加,但设置 TCP 的最大分段大小(MSS)选项,仍然足够包含一系列简单的请求。

并不是所有类型的 HTTP 请求都能用到流水线:只有幂等方式,比如 GET、HEAD、PUT 和 DELETE 能够被安全地重试。如果有故障发生时,流水线的内容要能被轻易的重试。
今天,所有遵循 HTTP/1.1 标准的代理和服务器都应该支持流水线,虽然实际情况中还是有很多限制:一个很重要的原因是,目前没有现代浏览器默认启用这个特性。

缺点

● 正确的实现流水线是复杂的:传输中的资源大小、多少有效的 RTT 会被用到以及有效带宽都会直接影响到流水线提供的改善。不知道这些的话,重要的消息可能被延迟到不重要的消息后面。这个重要性的概念甚至会演变为影响到页面布局!因此 HTTP 流水线在大多数情况下带来的改善并不明显。
流水线受制于队头阻塞(HOL)问题

由于这些原因,流水线已被 HTTP/2 中更好的算法——==多路复用(multiplexing)==所取代。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908167.shtml

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

相关文章

MySQL范式和反范式

范式 是用一组规则定义的数据库设计标准,旨在确保数据库结构合理,避免数据冗余和异常。 目的 消除数据的重复,提高存储效率防止数据异常(插入、删除、更新异常)提高数据的完整性和一致性 第一范式 定义 所有列&am…

编程技能:格式化打印04,sprintf

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程技能:格式化打印03,printf 回到目录…

JavaScript性能优化实战:深入探讨JavaScript性能瓶颈与优化技巧

引言:为什么JavaScript性能至关重要 在现代Web开发中,JavaScript已成为构建交互式应用程序的核心技术。随着单页应用(SPA)和复杂前端架构的普及,JavaScript代码的性能直接影响用户体验、转化率甚至搜索引擎排名。研究表明,页面加载时间每增加1秒,转化率可能下降7%,而性能…

Java数据结构——八大排序

排序 插⼊排序希尔排序直接选择排序堆排序冒泡排序快速排序归并排序计数排序 排序的概念 排序:就是将一串东西,按照要求进行排序,按照递增或递减排序起来 稳定性:就是比如排序中有两个相同的数,如果排序后&#xff0c…

WPF响应式UI的基础:INotifyPropertyChanged

INotifyPropertyChanged 1 实现基础接口2 CallerMemberName优化3 数据更新触发策略4 高级应用技巧4.1 表达式树优化4.2 性能优化模式4.3 跨平台兼容实现 5 常见错误排查 在WPF的MVVM架构中, INotifyPropertyChanged是实现数据驱动界面的核心机制。本章将深入解析属…

低空城市场景下的多无人机任务规划与动态协调!CoordField:无人机任务分配的智能协调场

作者:Tengchao Zhang 1 ^{1} 1 , Yonglin Tian 2 ^{2} 2 , Fei Lin 1 ^{1} 1, Jun Huang 1 ^{1} 1, Patrik P. Sli 3 ^{3} 3, Rui Qin 2 , 4 ^{2,4} 2,4, and Fei-Yue Wang 5 , 1 ^{5,1} 5,1单位: 1 ^{1} 1澳门科技大学创新工程学院工程科学系&#xff0…

解决Java项目NoProviderFoundException报错

前言 在Java开发中,jakarta.validation.NoProviderFoundException 是一个令人困惑的运行时错误,常因校验框架依赖缺失或版本冲突导致。 问题复现:用户注册校验失败 业务场景 开发一个用户注册功能,要求: 校验邮箱…

重构跨境收益互换价值链:新一代TRS平台的破局之道

当香港券商面对内地汹涌的结构化产品需求,一套智能化的TRS系统正成为打开万亿市场的金钥匙 在跨境金融的暗流涌动中,一家中资背景的香港券商正面临甜蜜的烦恼:内地高净值客户对港股、美股的杠杆交易需求激增,但传统TRS业务深陷操作…

实验设计如何拯救我的 CEI VSR 28G 设计

为了确定总体设计裕量,CEI 28G VSR/100 Gb 以太网设计需要分析 500 万种通道变化、收发器工艺和均衡设置的组合。蛮力模拟需要 278 天,这显然超出了可用的时间表。 相反,我们使用实验设计 (DOE) 和响应面建模 &#x…

【仿生机器人】刀剑神域——爱丽丝苏醒计划,需求文档

仿生机器人"爱丽丝"系统架构设计需求文档 一、硬件基础 已完成头部和颈部硬件搭建 25个舵机驱动表情系统 颈部旋转功能 眼部摄像头(视觉输入) 麦克风阵列(听觉输入) 颈部发声装置(语音输出&#xff09…

【Day44】

DAY 44 预训练模型 知识点回顾: 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战:resnet18 作业: 尝试在cifar10对比如下其他的预训练模型,观察差异,尽可能和他人选择的不同尝试通…

python打卡训练营打卡记录day44

知识点回顾: 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战:resnet18 作业: 尝试在cifar10对比如下其他的预训练模型,观察差异,尽可能和他人选择的不同尝试通过ctrl进入resnet的…

Vue跨层级通信

下面,我们来系统的梳理关于 Vue跨层级通信 的基本知识点: 一、跨层级通信核心概念 1.1 什么是跨层级通信 跨层级通信是指在组件树中,祖先组件与后代组件(非直接父子关系)之间的数据传递和交互方式。这种通信模式避免了通过中间组件层层传递 props 的繁琐过程。 1.2 适用…

webPack基本使用步骤

webPack基本使用步骤 关于webPackwebPack配置的几个概念entry(入口)output(输出)loader(输出)plugin(插件)mode(模式) 基本使用过程示例1.创建测试目录和代码…

龙虎榜——20250604

上证指数缩量收阳线,量能依然在5天线上,股价也在5天线上。 深证指数放量收阳线,量能站上5天均线,但仍受中期60天均线压制。 2025年6月4日龙虎榜行业方向分析 1. 黄金 代表标的:曼卡龙、菜百股份。 驱动逻辑&#…

Viggle:开启视频人物替换新纪元

Viggle 的出现,为视频人物替换带来了前所未有的变革,为创作者和爱好者们打开了一扇通往无限可能的大门。 一、Viggle 技术原理剖析 Viggle 是一款基于先进人工智能技术的创新平台,其核心在于能够精准实现静态图片与动态视频的融合转化。它…

【BUG解决】关于BigDecimal与0的比较问题

这是一个很细小的知识点,但是很容易被忽略掉,导致系统问题,因此记录下来 问题背景 明明逻辑上看a和b都不为0才会调用除法,但是系统会报错:java.lang.ArithmeticException异常: if (!a.equals(BigDecimal…

千年之后再出发,铜官窑驶入微短剧的数字航道

过去一年里,微短剧已经成为走向全民关注、平台扶持、政策引导的“内容新主流”。从市值百亿的爆款平台到走出国门的“短剧出海”,微短剧正在重塑中国数字文化的表达方式与产业结构,也成为各地竞相争夺的“新蓝海”。 就在这样的背景下&#…

数据库管理-第333期 Oracle 23ai:RAC打补丁完全不用停机(20250604)

数据库管理333期 2025-06-04 数据库管理-第333期 Oracle 23ai:RAC打补丁完全不用停机(20250604)1 概念2 要求3 操作流程4 转移失败处理总结 数据库管理-第333期 Oracle 23ai:RAC打补丁完全不用停机(20250604&#xff0…

Trae CN IDE自动生成注释功能测试与效率提升全解析

Trae CN IDE 的自动注释功能可以通过 AI 驱动的代码分析生成自然语言注释,以下是具体测试方法和优势总结: 一、Python 代码注释生成测试 1. 测试环境 IDE:Trae CN IDE(需确认支持 Python)代码示例: def …