HTTP中 Connection: keep-Alive与TCP中中keepalive有什么区别?

news2025/1/11 4:15:13

有小伙伴不明白keep-Alive和keepalive有什么区别?今天写这篇文章详细讲清楚!

HTTP是请求响应模型也就是客户端发起了请求,服务端才会返回响应,一来一回。

在这里插入图片描述
由于 HTTP 是基于 TCP 传输协议实现的,客户端与服务端要进行 HTTP 通信前,需要先建立 TCP 连接,然后客户端发送 HTTP 请求,服务端收到后就返回响应,至此「请求-应答」的模式就完成了,随后就会释放 TCP 连接。
那么是否是每一个请求都需要一个TCP连接呢?
在这里插入图片描述

如果每个请求都建立一个TCP连接,那么会造成巨大的网络开销,这对于网络资源本来就很珍贵的情况下显然是不可取的。因此为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接(HTTP Persistent Connections)也称为 HTTP keep-alive 或HTTP connection reuse持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
在这里插入图片描述

客户端与服务端的连接保活技术(连接复用),可以减少 TCP 连接的重复建立和断开所造成的额外开销,减轻服务器端的负载,减少响应时间
HTTP 长连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
怎么才能使用 HTTP 的 Keep-Alive 功能?
在 HTTP 1.0 中默认是关闭的,如果浏览器要开启 Keep-Alive,它必须在请求的包头中添加:

Connection: Keep-Alive

然后当服务器收到请求,作出回应的时候,它也添加一个头在响应中:

Connection: Keep-Alive

这样做,连接就不会中断,而是保持连接。当客户端发送另一个请求时,它会使用同一个连接。这一直继续到客户端或服务器端提出断开连接。

从 HTTP 1.1 开始, 就默认是开启了 Keep-Alive,如果要关闭 Keep-Alive,需要在 HTTP 请求的包头里添加:

Connection:close

现在大多数浏览器都默认是使用 HTTP/1.1,所以 Keep-Alive 都是默认打开的。一旦客户端和服务端达成协议,那么长连接就建立好了。

HTTP 长连接不仅仅减少了 TCP 连接资源的开销,而且这给 HTTP 流水线技术提供了可实现的基础。

所谓的 HTTP 流水线,是客户端可以先一次性发送多个请求,而在发送过程中不需先等待服务器的回应,可以减少整体的响应时间。

举例来说,客户端需要请求两个资源。以前的做法是,在同一个 TCP 连接里面,先发送 A 请求,然后等待服务器做出回应,收到后再发出 B 请求。HTTP 流水线机制则允许客户端同时发出 A 请求和 B 请求。
在这里插入图片描述
但是服务器还是按照顺序响应,先回应 A 请求,完成后再回应 B 请求。

而且要等服务器响应完客户端第一批发送的请求后,客户端才能发出下一批的请求,也就说如果服务器响应的过程发生了阻塞,那么客户端就无法发出下一批的请求,此时就造成了「队头阻塞」的问题。

可能有的同学会问,如果使用了 HTTP 长连接,如果客户端完成一个 HTTP 请求后,就不再发起新的请求,此时这个 TCP 连接一直占用着不是挺浪费资源的吗?

对没错,所以为了避免资源浪费的情况,web 服务软件一般都会提供 keepalive_timeout 参数,用来指定 HTTP 长连接的超时时间。

比如设置了 HTTP 长连接的超时时间是 60 秒,web 服务软件就会启动一个定时器,如果客户端在完后一个 HTTP 请求后,在 60 秒内都没有再发起新的请求,定时器的时间一到,就会触发回调函数来释放该连接。
在这里插入图片描述
TCP 的 Keepalive
TCP 的 Keepalive 这东西其实就是 TCP 的保活机制,它的工作原理我之前的文章写过,这里就直接贴下以前的内容。

如果两端的 TCP 连接一直没有数据交互,达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文。

如果对端程序是正常工作的。当 TCP 保活的探测报文发送给对端, 对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。
如果对端主机宕机(注意不是进程崩溃,进程崩溃后操作系统在回收进程资源的时候,会发送 FIN 报文,而主机宕机则是无法感知的,所以需要 TCP 保活机制来探测对方是不是发生了主机宕机),或对端由于其他原因导致报文不可达。当 TCP 保活的探测报文发送给对端后,石沉大海,没有响应,连续几次,达到保活探测次数后,TCP 会报告该 TCP 连接已经死亡。
所以,TCP 保活机制可以在双方没有数据交互的情况,通过探测报文,来确定对方的 TCP 连接是否存活,这个工作是在内核完成的。
在这里插入图片描述
注意,应用程序若想使用 TCP 保活机制需要通过 socket 接口设置 SO_KEEPALIVE 选项才能够生效,如果没有设置,那么就无法使用 TCP 保活机制。
HTTP 的 Keep-Alive 也叫 HTTP 长连接,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。

TCP 的 Keepalive 也叫 TCP 保活机制,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。

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

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

相关文章

【中阳期货】国际期货与股票的区别

摘要:“股票之后就是期货”这句话生动地揭示了股票交易与期货交易的内在联系。期货交易的重要功能首先是有利于增强商品价格的预期性,为商业活动的顺利进行创造良好的条件。期货借助市场功能可以找到商品真正的市场价格,有利于制造厂商和生产者确定产品成本产品生产费用,以便顺…

ubuntu下使用python进行简单的UDP通信

目录 一、参考链接二、主要工作1.查看本机ip2.下载Ubuntu下网络调试助手 NetAssist3.编写一个python脚本测试UDP通信4.测试简单的UDP通信 一、参考链接 Ubuntu下网络调试助手 NetAssist 使用python实现UDP通信 python代码实现简单的udp通信 二、主要工作 1.查看本机ip #下载…

如何压缩过大的H2数据库文件

平台自带的H2数据库在使用过程中会随着数据量的增加而增长,但是并不会在删除数据后自动缩小。所以O2OA提供了数据库压缩命令用于缩小数据库占用的空间。 一、先决条件 1、O2Server服务器正常运行,系统安装部署请参考文档《如何在服务器上安装部署O2OA》…

微软收购暴雪战未结束;迪士尼流失 4 百万用户;苹果 iPhone 销量增长;国际旅行回暖机票订单火爆;美国年通胀率再次下降 | 经济学人第 20 周

文章目录 苹果 iPhone 销量增长,但总体收入下降微软收购暴雪战未结束迪士尼流失 4 百万用户美国年通胀率再次下降国际旅行回暖,机票订单火爆瑞银认命首席执行官,完成对瑞士信贷的最终收购最后 苹果 iPhone 销量增长,但总体收入下降…

【Linux环境基础开发工具】编辑器-vim

写在前面 vim是一个编辑器,是在Linux下编程的常用工具,如果要学习在Linux下的编程, 那学会使用vim是一个必修课,今天我就来讲解如何使用vim编辑器。 目录 写在前面 什么是vim vim的常用命令 (1)gg&a…

C++之堆排

堆排的原理和结构: 堆排序是一种常见的排序算法,基于堆这种数据结构实现。堆是一种特殊的树形数据结构,它满足以下两个条件: 堆是一棵完全二叉树。 堆的任意节点的值,都必须大于等于(或小于等于&#xff0…

平板第三方电容笔怎么样?apple pencil一代平替笔推荐

我是一位数码产品的爱好者,所以我对电容笔也有一定的了解。我认为,苹果的原装电容笔和一般的电容笔的区别,在于它们所能产生的压感效果不同。由于苹果的电容笔具有独特的“重力压感”,因此,这款画笔能让我们快速地在画…

搜索二维矩阵 II——力扣240

文章目录 题目描述法一)二分查找法二)抽象二叉搜索树BST法三)直接查找 题目描述 法一)二分查找 与搜索二维矩阵——力扣74不同,本题没有保证「每行的第一个整数大于前一行的最后一个整数」,因此无法采取「两…

CentOS安装过程笔记

以前弄过一个ls的版本是直接虚拟机带起的。是系统都是别人给设置好调好的win系统的。后来发现问题,自己也不会搞,所以那个平台就一直扔在那里也没用过。 这次自己搞就想从0试一下吧。一直以为服务器必须Linux才行,所以就想安个CentOS&#x…

TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案

作者:vivo 互联网服务器团队- Ye Feng 本文介绍了 Intel QAT 技术方案,通过Multi-Buffer技术和QAT硬件加速卡的两种方式实现对TLS的加速 一、背景 当前 TLS 已经成为了互联网安全的主要传输协议,TLS带来更高的安全性的同时,也带…

【C++】用红黑树迭代器封装map和set

封装有点难 - . - 文章目录 前言一、红黑树原先代码的修改二、红黑树迭代器的实现总结 前言 因为我们要将红黑树封装让map和set使用,所以我们要在原来的基础上将红黑树代码进行修改,最主要的是修改模板参数,下面我们直接进入正题&#xff1a…

C++ 布隆过滤器哈希切割

前言 现实生活中,存在很多key_value的模型,我们可以使用哈希或者红黑树存储这些数据。但是二者只是内存的存储方式,无法处理海量数据。 海量数据的处理我们可以使用位图处理。但是位图的局限性是,其只能映射整型,对于…

【k8s】Jenkins实现springcloud应用CI、CD实践 【三】【待写】

一、运行Jenkins流水线流程思路: 场景:java微服务应用, 单体仓库,多个微服务模块,(并行构建、自动化构建、根据模块变更仅更新特定模块) java、nodejsCI阶段 并行方式; 根据模块变…

港联证券|标普500指数年内涨逾9%,美股牛市已至?

今年以来,美国标普500指数累计上涨超过9%,这引发了一场关于美股牛市是否已经到来的辩论。 持悲观态度的摩根士丹利股票策略师威尔逊(Michael Wilson)警告称,最近的反弹不过是一种假象。而美国银行的萨勃拉曼尼亚&#…

四、数据仓库详细介绍(规范)

大家好,这是数据仓库系列的第三个话题,排序在架构之后、建模之前。为什么会提的这么靠前呢? 因为规范约束的是数仓建设的全流程,以及后续的迭代和运维。事实上,数仓规范文档,应该随着架构设计文档&#xf…

chatgpt赋能Python-python_lambdify

Python Lambdify: 一个方便的数学表达式转换工具 Python是一种广泛使用的编程语言,适用于各种领域,如数据科学、机器学习和科学计算等。在这些领域中,数学表达式起到了至关重要的作用,而Python Lambdify(简称为“lamb…

计算机操作系统(慕课版)第四章课后题答案

一、简答题 1.什么是临界资源?什么是临界区? 临界资源:以互斥形式访问的资源;临界区:访问临界资源的代码。 2.同步机制应遵循的准则有哪些? 空闲让进;忙则等待;有限等待&#xff1b…

Windows本地快速搭建SFTP服务共享文件【外网访问】

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#xff0…

数据结构与算法-单调栈1

先介绍一下单调栈是什么 一种特别设计的栈结构,为了解决如下的问题: 给定一个可能含有重复值的数组arr,i位置的数一定存在如下两个信息 1)arr[i]的左侧离i最近并且小于(或者大于)arr[i]的数在哪? 2)arr[…

买法拍房注意事项

1、查清法拍房房屋属性。 竞拍前需查清楚法拍房的使用年限、能否办理房产证、土地性质等。 若土地为划拨属性,房屋可能需补缴土地出让金,该费用最好提前咨询当地不动产登记中心了解。 2、产权是否涉及二次过户。 二次过户指的是房屋已经过2次交易&…