【CS.CN】深入探讨下HTTP的Connection头:通过keep-alive实现高效网络连接

文章目录

    • 0 序言
      • 0.1 由来
      • 0.2 使用场景
      • 0.3 现在还需要吗?
    • 1 `Connection: keep-alive`的机制
    • 2 语法 && 通过设置`Connection: keep-alive`优化性能
    • 3 验证与性能提升
    • 4 总结
    • References

在这里插入图片描述

0 序言

0.1 由来

Connection头部字段在HTTP/1.1中被引入,主要用于控制网络连接的持久性。最常见的值是keep-aliveclose。当使用keep-alive时,TCP连接在一次请求/响应之后不会立即关闭,允许复用连接以处理后续请求。这样可以显著减少TCP连接的建立和终止带来的开销。

可以将Connection: keep-alive机制比作一条常开的热线电话:

  1. 情景设定
    • 你需要频繁打电话给朋友,但每次都要重新拨号和挂断。
  2. 正常流程
    • 每次需要联系朋友时,你拨通电话,交流完毕后挂断。
  3. 使用Connection: keep-alive
    • 你保持电话接通状态,这样可以随时交流,不用每次重新拨号和挂断。

0.2 使用场景

  • 频繁的HTTP请求:当客户端需要频繁与服务器通信时,使用keep-alive可以避免每次请求都重新建立TCP连接,从而减少延迟和资源消耗。

  • 高性能应用:在需要高效处理大量HTTP请求的应用场景中,keep-alive可以显著提升性能。

    • 减少延迟:避免频繁的TCP连接建立和关闭,减少网络延迟。
    • 降低资源消耗:减少CPU和内存开销,提高服务器的处理能力。

0.3 现在还需要吗?

虽然Connection: keep-alive在某些情况下依然有用,但现代HTTP/2和HTTP/3协议中已经内置了连接复用机制,使其重要性有所降低:

  • HTTP/2和HTTP/3:现代协议已经支持多路复用,一个连接可以处理多个请求和响应。
  • 高效网络:现代网络基础设施的改进使得TCP连接的建立和关闭开销相对较低。

是否需要使用Connection: keep-alive取决于具体的应用场景:

  • 需要:在使用HTTP/1.1的环境中,尤其是需要频繁请求的场景下,依然可以使用。
  • 不需要:在使用HTTP/2或HTTP/3的环境中,已经不需要显式设置keep-alive

1 Connection: keep-alive的机制

Connection 是一个请求和响应消息头,用于控制网络连接的持久性。常见的值包括keep-aliveclose

规范中规定,Connection: keep-alive表示请求结束后保持连接不断开,允许复用连接。相反,Connection: close则表示请求结束后立即关闭连接。

例如,如果使用keep-alive,服务器在处理完第一个请求后不会关闭连接,而是继续等待下一个请求。

Client Server HTTP Request 1 (Headers with Connection: keep-alive) HTTP Response 1 Connection remains open HTTP Request 2 HTTP Response 2 Connection remains open for further requests Client Server

在持久连接中,Connection头可以显著影响请求的性能。默认情况下,HTTP/1.1会使用keep-alive,但明确设置可以确保行为一致。

客户端发送带有Connection: keep-alive头的请求,服务器在响应后保持连接不断开,等待后续请求。这种机制可以减少连接建立和关闭的开销,提高性能。

在HTTP长连接(持久连接)中,客户端与服务器之间会复用同一个TCP连接以发送多个请求/响应对话。这通常会显著降低延迟和资源消耗。

注意: Connection: keep-alive机制与连接的长短无关。无论是短连接还是长连接,当客户端发送一个包含keep-alive头的请求时,都会触发保持连接的机制。

2 语法 && 通过设置Connection: keep-alive优化性能

目前规范中规定的值包括keep-aliveclose

Connection: keep-alive

例如,curl库默认设置,或者在频繁请求时:

# 客户端发送带有 Connection: keep-alive 消息头的请求,保持连接不断开。

GET /somewhere/fun HTTP/1.1
Host: origin.example.com
Connection: keep-alive

通过设置Connection: keep-alive,可以避免频繁的连接建立和关闭,提高性能。

3 验证与性能提升

原有:

[2023-03-05 09:38:02.209924][INFO][pid:2883,tid:2882][httpclient_keeplive.cpp:138][0b43001309a6] RequestHttps h.last_active_time: 1717551479, h: 1393928, tc_ts:565

优化后:

[2023-03-05 09:39:03.715435][INFO][pid:2883,tid:2882][httpclient_keeplive.cpp:138][0b43000d097e] RequestHttps h.last_active_time: 1717551543, h: 1393910, tc_ts:182

实测数据显示,启用长连接后, HTTP请求的平均耗时显著下降,TCP连接建立和关闭的开销大大减少。

4 总结

通过正确管理Connection头,尤其是使用Connection: keep-alive,可以避免频繁的连接建立和关闭,从而减少请求的整体耗时,提升性能。

References

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React的useState的基础使用

import {useState} from react // 1.调用useState添加状态变量 // count 是新增的状态变量 // setCount 修改状态变量的方法 // 2.添加点击事件回调 // userState实现计数实例import {useState} from react// 使用组件 function App() {// 1.调用useState添加状态变量// coun…

ChatTTS增强版V2,批量导出srt,语速控制,情感控制,支持朗读数字,问题修复

ChatTTS增强版最新版本已经发布,本次更新我主要增加了多文本批量、SRT导出、语速控制、情感控制、停顿控制等新功能,并针对上一版本中存在的数字读音异常、随机uv_break等问题进行了修复。 视频版本 【ChatTTS增强版V2,批量导出srt&#xff…

基于C#的计算机与安捷伦34970A通信方法

概述 安捷伦34970A采集数据,34970A支持RS232接口,但是如果直接用winform自带的seriaport类基本是没必要使用的,安捷伦等仪表通讯需要用到VISA的库。 库的获取 1. 是德科技的IO Library. 2. NI下载NI-VISA. 两者用法接近. 代码如下 using…

数据库安全加固与API防护策略

在数字化时代,数据库作为企业核心资产的安全性至关重要。然而,随着网络攻击手段的不断演进,数据库和API接口成为了黑客的主要攻击目标。本文将探讨数据库被攻击、API接口被滥用的情况,并提供一系列实用的防护措施,旨在…

JSP中连接数据库MySQL

JSP中连接数据库MySQL 一、软件环境 下载并安装MySQL,Tomacat,JDBC、IDEA或其他IDE,本文使用IDEA 二、环境配置 将其环境变量配置好之后,下载Java 专用的连接MySQL的驱动包JDBC。 下载链接:https://dev.mysql.com/…

机器学习----奥卡姆剃刀定律

奥卡姆剃刀定律(Occam’s Razor)是一条哲学原则,通常表述为“如无必要,勿增实体”(Entities should not be multiplied beyond necessity)或“在其他条件相同的情况下,最简单的解释往往是最好的…

一篇学会Arthas的基本使用及常用指令

下载安装 下载arthas的jar包 https://alibaba.github.io/arthas/arthas-boot.jar将jar包下载后放到指定的文件夹中 启动与结束 winr打开命令行使用命令运行arthas对应的jar包 java -jar D:\application\arthas\arthas-boot.jar会列出所有的java服务选择要监控的服务&#xff0c…

mqtt-emqx:paho.mqttv5的简单例子

# 安装emqx 请参考【https://blog.csdn.net/chenhz2284/article/details/139551293?spm1001.2014.3001.5502】 # 下面是示例代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</…

2024教资认定报名流程,点赞收藏!

2024年要进行教资认定的宝子们提早准备 &#x1f525;教资认定网上报名流程概览 一、进入教资认定网报入口 二、进行实名核验 三、申请网报时间查询 四、个人信息维护 五、认定申请报名 &#x1f525;教资认定所需材料 1⃣️身份证 2⃣️户口本&#xff0f;居住证&#xff0f;学…

算法导论实战(三)(算法导论习题第二十五、二十六章)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;算法启示录 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 第二十五章 25.1-10 25.2-5 25…

Liunx环境下redis主从集群搭建(保姆级教学)01

Linux 环境安装redis 准备一台linux虚拟机 我使用基于Linux的开源类服务器操作系统CentOS7。 打开虚拟机&#xff0c;输入密码登录 下载linux版本的redis安装包 已经下载redis-5.0.10.tar.gz 创建一个文件夹用来安装redis,我在/opt目录下创建redis文件夹 将下载好的redis…

Vue3 + TS + Antd + Pinia 从零搭建后台系统(一) 脚手架搭建 + 入口配置

简易后台系统搭建开启&#xff0c;分几篇文章更新&#xff0c;本篇主要先搭架子&#xff0c;配置入口文件等目录 效果图一、搭建脚手架&#xff1a;二、处理package.json基础需要的依赖及运行脚本三、创建环境运行文件四、填充vue.config.ts配置文件五、配置vite-env.d.ts使项目…

Vue3【十一】08使用toRefs和toRef

08使用toRefs和toRef toRefs()函数将person对象中的name和age属性转换为响应式引用&#xff0c;并返回一个对象&#xff0c;对象中的name和age属性都是响应式引用&#xff0c;具有响应式功能。 toRef()函数将person对象中的name属性转换为响应式引用&#xff0c;并返回一个响应…

每天五分钟深度学习pytorch:pytorch中的广播机制是什么?

本文重点 在pytorch中经常有张量和张量之间的运算,那么有一点需要注意,那就是维度要匹配,如果维度不匹配就有可能出现问题。如果维度不一致,此时也可以同时进行操作,此时就需要使用pytorch中的广播机制,本节课程就讲解pytorch中的广播机制。 广播机制示意图 如上就是py…

vue3+ts+vite项目开发--知识点梳理01

vue3tsvite项目开发--知识点梳理01 创建vue3项目01 tsconfig.node.json文件中extends报错02 知识点&#xff1a;用nvm安装最新版本的node03. template标签中的#表示啥意思04 ts中 &#xff1f;&#xff1f;使用05 ts中 reduce06 vue3ts中watch和watchEffect监听使用07 unocss用…

SwiftUI中Preference的理解与使用(ScrollView偏移量示例)

在 SwiftUI 中&#xff0c;Preference用于从视图层次结构的较深层次向上传递信息到较浅层次。这通常用于在父视图中获取子视图的属性或状态&#xff0c;而不需要使用状态管理工具如State或 ObservableObject。Preference特别用于自定义布局或组件&#xff0c;其中子视图需要向父…

构建智能汽车新质生产力丨美格智能亮相2024高通汽车技术与合作峰会

近日&#xff0c;以“我们一起&#xff0c;驭风前行”为主题的2024高通汽车技术与合作峰会在无锡国际会议中心隆重举行。作为高通公司的战略合作伙伴&#xff0c;美格智能受邀全程参与此次汽车技术与合作峰会。在峰会现场&#xff0c;美格智能产品团队隆重展示了多款基于高通平…

【Web API DOM07】事件委托

一&#xff1a;事件委托详解 1 什么是事件委托 利用事件流的特征&#xff08;事件冒泡&#xff09;&#xff0c;解决开发需求的知识技巧 2 事件委托好处 要真正执行任务的元素不注册事件&#xff0c;将对应的事件注册给祖先元素。减少事件的注册次数&#xff0c;提高程序运…

理解JVM内存模型与Java内存模型(JMM)

理解JVM内存模型与Java内存模型&#xff08;JMM&#xff09; 在Java程序的运行过程中&#xff0c;内存管理和线程的同步是两个重要的概念。本文将深入探讨JVM内存模型&#xff08;Java Virtual Machine Memory Model&#xff09;和JMM&#xff08;Java Memory Model&#xff0…

04 uboot 编译与调试

新手不需要详细掌握 uboot,只需要知道它是一个什么东西即可,工作中也只是改一些参数而已。 1、uboot 是什么 Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内…