HTTP keepalive 详解

一、简介

HTTP协议早期版本,比如1.0,默认是不使用持久连接的,也就是每个请求/响应之后都会关闭TCP连接。这样的话,每次请求都需要重新建立连接,增加了延迟和资源消耗。Keep-Alive的作用是保持连接,让多个请求可以复用同一个TCP连接,减少建立和关闭连接的开销,在HTTP1.1中是默认支持 Keep-Alive的。

二、原理介绍

HTTP 中的 ​Keep-Alive​(也称为持久连接或连接复用)的主要作用是允许在同一个 TCP 连接上发送和接收多个 HTTP 请求/响应,从而减少重复建立和关闭连接的开销。以下是它的核心作用和优势:

1、核心作用:

  • ​连接复用​
    默认情况下(如 HTTP/1.0),每个 HTTP 请求都会新建一个 TCP 连接,完成后立即关闭。Keep-Alive 会保持 TCP 连接打开一段时间,供后续请求复用。
    例如:浏览器加载一个网页时,可以复用同一个连接下载 HTML、CSS、图片等资源,无需反复握手。
    ​减少延迟​
  • 避免重复的 TCP 三次握手(建立连接)和四次挥手(关闭连接),降低网络延迟。
    尤其对包含大量小文件(如网页资源)的场景优化明显。
  • 节省资源​
    减少服务器和客户端的 CPU、内存消耗(避免频繁创建和销毁连接)。
    缓解端口资源占用问题。

二、技术细节:

HTTP/1.1 默认支持 Keep-Alive(无需显式设置 Connection: keep-alive),而 HTTP/1.0 需要手动启用。

1、HTTP Keep-Alive 请求头字段 (客户端 → 服务器)

  • Connection: keep-alive
    客户端明确告知服务器希望保持连接(HTTP/1.1 默认启用,但 HTTP/1.0 需显式声明)。
  • Keep-Alive: timeout=5, max=1000​(可选)
    客户端建议参数:
    timeout: 空闲超时时间(秒)
    max: 此连接允许的最大请求数

2、HTTP Keep-Alive 响应头字段​ (服务器 → 客户端)

  • Connection: keep-alive
    服务器同意保持连接(HTTP/1.1 默认启用,HTTP/1.0 需显式返回)。
  • Keep-Alive: timeout=5, max=1000​(可选)
    服务器实际使用的参数(可能覆盖客户端建议值)。

3、HTTP/1.1 与 HTTP/1.0 的区别

版本默认行为需要显式设置头?
​HTTP/1.1​默认启用持久连接关闭时需发送 Connection: close
​HTTP/1.0​ 默认关闭持久连接启用需发送 Connection: keep-alive

三、请求头与响应头示例

1、HTTP/1.1版本

  • HTTP/1.1 请求(默认启用 Keep-Alive)
GET /api/data HTTP/1.1
Host: example.com
User-Agent: MyClient
Connection: keep-alive  # 可选(HTTP/1.1 默认行为)
  • HTTP/1.1 响应(服务器同意保持连接)
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1024
Connection: keep-alive  # 可选(HTTP/1.1 默认行为)
Keep-Alive: timeout=5, max=1000

2、HTTP/1.0版本

  • HTTP/1.0 请求(需显式启用)
GET /old-api HTTP/1.0
Host: example.com
Connection: keep-alive  # 必须显式声明
  • HTTP/1.0 响应(服务器同意保持连接)
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 2048
Connection: keep-alive  # 必须显式返回
Keep-Alive: timeout=5

3、关闭连接

  • 客户端关闭连接,发送 Connection: close 请求头
Host: example.com
Connection: close
  • ​服务器强制关闭连接,返回 Connection: close 响应头
HTTP/1.1 200 OK
Connection: close
  • 超时或达到最大请求数
    当 超时或达到最大请求数,连接会被服务器或客户端主动关闭。

四、其他

1、HTTP的Keep-Alive和TCP的Keep-Alive机制对比

  • HTTP Keep-Alive 是应用层机制,用于复用连接。
  • TCP Keep-Alive 是传输层机制,通过发送心跳包检测连接是否存活,防止“半开连接”

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

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

相关文章

长短期记忆神经网络(LSTM)基础学习与实例:预测序列的未来

目录 1. 前言 2. LSTM的基本原理 2.1 LSTM基本结构 2.2 LSTM的计算过程 3. LSTM实例:预测序列的未来 3.1 数据准备 3.2 模型构建 3.3 模型训练 3.4 模型预测 3.5 完整程序预测序列的未来 4. 总结 1. 前言 在深度学习领域,循环神经网络&…

基于机器学习的三国时期诸葛亮北伐失败因素量化分析

一、研究背景与方法论 1.1 历史问题的数据化挑战 三国时期(220-280年)的战争史存在史料分散、数据缺失的特点。本研究通过构建包含军事、经济、地理、政治四大维度的结构化数据库,收录建安十二年(207年)至建兴十二年…

蓝桥杯省模拟赛 数位和

问题描述 只能被 1 和本身整除的数称为质数。 请问在 1 (含)到 1000000 (含)中,有多少个质数的各个数位上的数字之和为 23 。 提示:599 就是这样一个质数,各个数位上的数字之和为 59923 。 #…

Timer的底层实现原理?

Timer 是 Java 中用于定时任务调度的基础工具类,其底层实现基于 单线程+任务队列 的模型。以下是 Timer 的底层实现原理的详细分析: 一、核心组件 TimerThread 继承自 Thread,是 Timer 的工作线程,负责从队列中提取任务并执行。通过 while (true) 循环持续检查任务队列。Ta…

Java 枚举类 Key-Value 映射的几种实现方式及最佳实践

Java 枚举类 Key-Value 映射的几种实现方式及最佳实践 前言 在 Java 开发中,枚举(Enum)是一种特殊的类,它能够定义一组固定的常量。在实际应用中,我们经常需要为枚举常量添加额外的属性,并实现 key-value 的映射关系。本文将详细…

青少年编程与数学 02-015 大学数学知识点 01课题、概要

青少年编程与数学 02-015 大学数学知识点 01课题、概要 一、线性代数二、概率论与数理统计三、微积分四、优化理论五、离散数学六、数值分析七、信息论 《青少年编程与数学》课程要求,在高中毕业前,尽量完成大部分大学数学知识的学习。一般可以通过线上课…

智能打印预约系统:微信小程序+SSM框架实战项目

微信小程序打印室预约系统,采用SSM(SpringSpringMVCMyBatis)经典框架组合。 一、系统核心功能详解 1. 智能化管理后台 ​用户数据看板​打印店资源管理​预约动态监控​服务评价系统 2. 微信小程序端 ​智能定位服务​预约时段选择​文件…

DataX 3.0 实战案例

第五章 实战案例 5.1. 案例一 5.1.1. 案例介绍 MySQL数据库中有两张表:用户表(users),订单表(orders)。其中用户表中存储的是所有的用户的信息,订单表中存储的是所有的订单的信息。表结构如下: 用户表 users: id:用…

设计模式学习(1)

面向对象设计原则 单一职责 每个类只有一个职责,并被完整的封装在类中,该原则用来控制类的粒度。 例如Mapper,controller都只负责一个业务。 开闭原则 应该对扩展开放,而对修改封闭,例如定义接口或是抽象类作为抽…

在 Rocky Linux 9.2 上编译安装 Redis 6.2.6

文章目录 在 Rocky Linux 9.2 上编译安装 Redis 6.2.6Redis 介绍官网Redis 的核心特性高性能支持多种数据结构多种持久化机制复制与高可用2.5 事务与 Lua 脚本消息队列功能 Redis 适用场景Redis 与其他数据库对比Redis 的优势与劣势Redis 优势Redis 劣势 部署过程系统环境信息环…

量子计算与经典计算的融合与未来

最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击下方超链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面进入文章正…

数据结构(4)——带哨兵位循环双向链表

目录 前言 一、带哨兵的循环双向链表是什么 二、链表的实现 2.1规定结构体 2.2创建节点 2.3初始化 2.4打印 2.5检验是否为空 2.6销毁链表 2.7尾插 2.8尾删 2.9头插 2.10头删 2.11寻找特定节点 2.12任意位置插入(pos前) 2.13删除任意节点 …

Github 2025-03-30 php开源项目日报 Top10

根据Github Trendings的统计,今日(2025-03-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10TypeScript项目1Coolify: 开源自助云平台 创建周期:1112 天开发语言:PHP, Blade协议类型:Apache License 2.0Star数量:10527 个Fo…

3. 线程间共享数据

1. 线程共享数据会造成什么问题? 1.1 读写不一致 多线程读不会造成数据变动,所以没有问题。只要有一个线程设计修改数据,就会导致数据共享出现问题,简单的是数据不一致,严重的是程序访问已经释放的内存,造…

JAVA垃圾回收算法和判断垃圾的算法

一、判断垃圾的算法 判断对象是否为垃圾的核心是确定对象是否不再被使用。Java主要采用以下两种算法: 1. 引用计数法(Reference Counting) 原理:每个对象维护一个引用计数器,记录被引用的次数。当引用被添加时计数器…

界面架构 - MVVM (Qt)

MVVM MVVM 的主要特点示例示例功能示例代码ViewModel 类(C)主函数入口(main.cpp) QML 文件(main.qml)总结 MVVM(Model-View-ViewModel)架构是一种旨在进一步分离界面和业务逻辑的设计…

第十四届MathorCup高校数学建模挑战赛-C题:基于 LSTM-ARIMA 和整数规划的货量预测与人员排班模型

目录 摘要 一、 问题重述 1.1 背景知识 1.2 问题描述 二、 问题分析 2.1 对问题一的分析 2.2 对问题二的分析 2.3 对问题三的分析 2.4 对问题四的分析 三、 模型假设 四、 符号说明 五、 问题一模型的建立与求解 5.1 数据预处理 5.2 基于 LSTM 的日货量预测模型 5.3 日货量预测…

银河麒麟V10 aarch64架构安装mysql教程

国产操作系统 ky10.aarch64 因为是arm架构,故选择mysql8,推荐安装8.0.28版本 尝试8.0.30和8.0.41版本均未成功,原因不明☹️ 1. 准备工作 ⏬ 下载地址:https://downloads.mysql.com/archives/community/ 2. 清理历史环境 不用管…

C++多继承

可以用多个基类来派生一个类。 格式为: class 类名:类名1,…, 类名n { private: … ; //私有成员说明; public: … ; //公有成员说明; protected: … ; //保护的成员说明; }; class D: public A, protected B, private C { …//派…

某地老旧房屋自动化监测项目

1. 项目简介 自从上个世纪90年代以来,我国经济发展迅猛,在此期间大量建筑平地而起,并且多为砖混结构的住房,使用寿命通常约为30-50年,钢筋混凝土结构,钢结构等高层建筑,这些建筑在一般情况下的…