HTTP 长连接和 TCP 长连接有什么区别

news2024/9/19 20:08:58

目录

一、HTTP 的 Keep-Alive

二、TCP 的 Keepalive

三、总结

 事实上,这两个完全是两样不同东西,实现的层面也不同:

  • HTTP 的 Keep-Alive,是由应用层(用户态) 实现的,称为 HTTP 长连接;

  • TCP 的 Keepalive,是由 TCP 层(内核态) 实现的,称为 TCP 保活机制;

接下来,分别说说它们。

一、HTTP 的 Keep-Alive

HTTP 协议采用的是「请求-应答」的模式,也就是客户端发起了请求,服务端才会返回响应,一来一回这样子。

请求-应答

由于 HTTP 是基于 TCP 传输协议实现的,客户端与服务端要进行 HTTP 通信前,需要先建立 TCP 连接,然后客户端发送 HTTP  请求,服务端收到后就返回响应,至此「请求-应答」的模式就完成了,随后就会释放 TCP 连接。

一个 HTTP 请求

如果每次请求都要经历这样的过程:建立 TCP -> 请求资源 -> 响应资源 -> 释放连接,那么此方式就是 HTTP 短连接,如下图:

HTTP 短连接

这样实在太累人了,一次连接只能请求一次资源。

能不能在第一个 HTTP 请求完后,先不断开 TCP 连接,让后续的 HTTP 请求继续使用此连接?

当然可以,HTTP 的 Keep-Alive 就是实现了这个功能,可以使用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,避免了连接建立和释放的开销,这个方法称为 HTTP 长连接

HTTP 长连接

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 请求。

右边为 HTTP 流水线机制

但是服务器还是按照顺序响应,先回应 A 请求,完成后再回应 B 请求。

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

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

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

比如设置了 HTTP 长连接的超时时间是 60 秒,web 服务软件就会启动一个定时器,如果客户端在完后一个 HTTP 请求后,在 60 秒内都没有再发起新的请求,定时器的时间一到,就会触发回调函数来释放该连接。

HTTP 长连接超时

二、TCP 的 Keepalive

TCP 的 Keepalive 这东西其实就是 TCP 的保活机制,它的工作原理我之前的文章写过,这里就直接贴下以前的内容。

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

  • 如果对端程序是正常工作的。当 TCP 保活的探测报文发送给对端, 对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。

  • 如果对端主机崩溃,或对端由于其他原因导致报文不可达。当 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/62220.html

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

相关文章

简约的博客网页制作 大学生个人博客网页设计模板 学生个人网页成品 DIV简单个人网站作品下载 静态HTML CSS个人网页作业源代码

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

【翻译】Domain Enhanced Arbitrary Image Style Transfer via Contrastive Learning

文章目录ABSTRACT1 INTRODUCTION2 RELATED WORK3 METHOD3.1 Multi-layer Style Projector3.2 Contrastive Style Learning3.3 Domain Enhancement3.4 Network Training4 EXPERIMENTS4.1 Qualitative Evaluation4.2 Quantitative Evaluation4.3 Ablation Study5 CONCLUSION AND …

装饰模式Decorator

1.意图:动态地给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更加灵活。 2.结构 Component定义一个对象接口,可以给这些对象动态地添加职责; ConcreteComponent定义一个对象,可以给这个对象…

[附源码]JAVA毕业设计六如文学网站(系统+LW)

[附源码]JAVA毕业设计六如文学网站(系统LW) 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术:…

康力源在创业板提交注册:预计全年收入同比下滑,衡墩建持股98%

12月4日,江苏康力源体育科技股份有限公司(下称“康力源”)在深圳证券交易所创业板提交招股书(注册稿)。据贝多财经了解,康力源于2021年11月12日在创业板递交招股书,2022年8月11日获得上市委会议…

螺旋矩阵||真的很有趣!(蓝桥杯宝贝们看过来)

献丑了&#xff0c;画了个图&#xff0c;如果图看不同&#xff0c;没关系&#xff0c;我们还有注释 class Solution { public:vector<vector<int> > generateMatrix(int n) {vector<vector<int> >num(n,vector<int>(n,0)); int startX0,startY0;…

向黑客精神致敬!

不是第一次想在一个特殊的时间写点什么&#xff0c;但是每次都是刚写了几个字就又停下来&#xff0c;有什么好说的呢&#xff1f;既然整个行业都是说的多&#xff0c;做的少&#xff0c;我们不如更多的踏实做点事情比较好&#xff0c;所以又把编辑器关掉。 但这次还是希望能和大…

Java 最常见的800道面试题,老话说:临阵磨枪,不快也光,涨薪指日可待

前言 春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们 Java 程序员的面试之路&#xff0c;是挺难的&#xff0c;过了 HR&#xff0c;还得被技术面&#xff0c;鄙人在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终…

kubernetespod控制器详解2与service详解1

kubernetespod控制器详解2与service详解1 Horizontal Pod Autoscaler(HPA) Kubernetes期望可以实现通过监测Pod的使用情况&#xff0c;实现pod数量的自动调整&#xff0c;于是就产生了Horizontal Pod Autoscaler&#xff08;HPA&#xff09;这种控制器。 HPA可以获取每个Pod利…

【并发】J.U.C之Java锁

java锁 锁的种类和特点 无锁/偏向锁/轻量级锁/重量级锁 这四种锁是指锁的状态&#xff0c;专门针对synchronized的。在介绍这四种锁状态之前还需要介绍一些额外的知识。 首先为什么Synchronized能实现线程同步&#xff1f; 在回答这个问题之前我们需要了解两个重要的概念&a…

室外定位:高精度北斗RTK定位技术

北斗RTK定位技术&#xff0c;也称北斗差分定位技术&#xff0c;利用我国自主研发的北斗卫星定位系统实现精确定位功能。定位精度可根据需要&#xff0c;通过选择不同精度的人员定位终端来实现。 在科技强国的战略驱动下&#xff0c;北斗RTK定位技术迎来了广阔的发展机遇&#x…

【无锁队列】无锁CAS_无锁队列

1 引言 锁是解决并发问题的万能钥匙&#xff0c;可是并发问题只有锁能解决吗&#xff1f; 2 什么是CAS&#xff1f; ⽐较并交换(compare and swap, CAS)&#xff0c;是原⼦操作的⼀种&#xff0c;可⽤于在多线程编程中实现不被打断的数据交换操作&#xff0c;从⽽避免多线程…

[附源码]计算机毕业设计基于Springboot的专业技能认证系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Thread类的常用方法

目录 1.Thread类常用的构造方法 2.Thread类的几个常见属性 2.1 什么是守护线程?isDaemon 2.2线程是否存活 isAliye() 3.终止线程的方法 3.1使用共享标志位通知中断线程 3.2使用Thread自带的标志位通知 4.等待线程 join 5.获取当前线程的引用 6.休眠当前线程 Thread …

Java安全--篇2-类的动态加载

类的动态加载 首先我们来了解一下构造代码块和静态代码块&#xff1a;Java中静态代码块、构造代码块、构造函数、普通代码块 - YSOcean - 博客园 // 静态代码块 static {System.out.println("静态代码块"); }// 构造代码块 {System.out.println("构造代码块&q…

使用Jetpack组件Navigation实现Android开发中页面跳转

使用Jetpack组件Navigation实现Android开发中页面跳转 ​目录 一、前言 1.概述 2.导航图的创建&#xff08;官网&#xff09; 二、基本使用 1.依赖配置 2.具体实例&#xff1a;使用Navigation实现页面的跳转。 2.1.class的创建 2.2 、页面布局文件的创建 2.3 向 Acti…

Abaqus血管支架仿真攻略之几何创建与网格划分

作者&#xff1a;江丙云&#xff0c;仿真秀平台优秀讲师 前不久&#xff0c;笔者推送的冠脉支架的参数化建模和优化、Abaqus网格卷曲WrapMesh&#xff0c;冠脉支架的参数化建模和优化&#xff0c;以及Abaqus疲劳分析|Goodman插件等原创文章后&#xff0c;后台留言的读者众多&a…

GDP-海藻糖,5‘-鸟苷二磷酸岩藻糖,GDP-fucose ,CAS:15839-70-0

产品名称&#xff1a;GDP-海藻糖&#xff0c;5-鸟苷二磷酸岩藻糖&#xff0c;二磷酸鸟苷岩藻糖&#xff0c;GDP-L-岩藻糖 英文名称&#xff1a;GDP-fucose&#xff0c;Guanosine 5-diphosphate-L-fucose disodium salt CAS&#xff1a;15839-70-0 Mol. Formula C16H23N5O…

基于模糊神经网络算法预测电价(Matlab代码实现)

&#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;⛳️⛳️⛳️ ​ 目录 1 概述 2 模糊神经网络简介 3 运行结果 4 参考文献 5 Matlab代码实现 1 概述 近年来,随着能源短缺和环境问题的日益凸显,太阳能、风能等各种形式的清洁能源得到广泛应用,微网作为分布式…

【云原生 | 46】高可用的开源键值数据库Etcd的安装与使用

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…