TCP自带心跳keepalive

TCP 已经实现 KeepAlive,为什么应用层还要实现一遍? TCP Keepalive 是一种用于检测 TCP 连接是否活跃的机制,通过定期发送探测数据包来确定连接的状态,主要用于检测空闲 (僵尸) 连接、保持 NAT 映射 (NAT 设备、防火墙设备) 等。 阅读详情

今天去hj面试,面试官问了一个网络方面的问题,TCP有心跳包功能,为什么我们一般在写程序时还要在应用层加心跳功能? 

以前我写的通信程序,都在应用层加了心跳功能,虽然TCP是可靠传输,某一端断开连接的话,是会通知到另一端的,但对于断电、拔网线、路由器故障这种突发情况,就无法通知到网络上的另一端了,所以需要心跳功能隔一段时间来帮我们检测当前连接是否可用。

之前接触别人和自己写的代码都在应用层实现了心跳功能,就一直以为传输层本身是没有心跳功能的,所以还跟面试官争了半天传输层是没有心跳功能的,回来查了下资料,原来TCP是有KeeAlive机制的,想想真是太丢人了。

在TCP协议里,本身的心跳包机制SO_KEEPALIVE,系统默认设置的是7200秒的启动时间。默认是关闭的,需要用setsocketopt将SOL_SOCKET.SO_KEEPALIVE设置为1打开,有三个参数可以设置,tcp_keepalive_time、tcp_keepalive_probes、tcp_keepalive_intvl,分别表示连接闲置多久才开始发心跳包、连发几次心跳包没有回应表示连接已断开、心跳包之间间隔时间。

这里有一篇非常详细介绍TCP Keepalive的文章: http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO,2.2节提到

Why use TCPkeepalive?

1.Checking for dead peers(断线检测)

2.Preventing disconnection due to network inactivity(保活)

心跳包的作用:

1.保活

在传输的链路上,有的节点(防火墙、NAT)会自动把一定时间内没有数据交互的连接给断掉,这个时候就需要我们定时发送心跳包,让这些节点知道这条连接仍在使用中,维持长连接,保活。

2.断线处理

通过心跳包获知连接断开后,启动相应的处理机制,如重新连接、断线后的数据清理等。

对之前面试官提的问题:“既然TCP已有心跳机制,为什么我们还要在应用层实现自己的心跳功能呢?”,现在我想有这么几点理由:

1.TCP心跳机制是传输层实现的,只要当前连接是可用的,对端就会ACK我们的心跳,而对于当前对端应用是否能正常提供服务,TCP层的心跳机制是无法获知的。我们在应用层实现的心跳功能是依赖于对端应用的,如果对端当前无法正常提供服务,通过应用层心跳功能马上就可以获知,我们可以进行相应的处理;

2.tcp_keepalive_time参数的设置是秒级,对于极端情况,我们可能想在毫秒级就检测到连接的状态,这个TCP心跳机制就无法办到;

3.通用性,应用层心跳功能不依赖于传输层协议,如果有一天我们想将传输层协议由TCP改为UDP,那么传输层不提供心跳机制了,应用层的心跳是通用的,此时或许只用修改少量地方代码即可;

4.有些运营商会过滤掉keep包;

应用层心跳包不好的地方

增加开发工作量,由于应用特定的网络框架,还可能增加代码结构的复杂度,再就是根据上面的推测,应用层心跳的流量消耗还是更大的,毕竟这本质上还是个普通的数据包。

memcached源码分析-----memcached启动参数详解以及关键配置的默认值 本文将给出memcached启动时各个参数的详细解释以及一些关键配置的默认值。以便在分析memcached源码的时候好随时查看。当然也方便使用memcached时可以随时查看各个参数的含义。《如何阅读memcached源码》说到memcached有很多全局变量(也就是关键配置),这些全局变量会给 阅读详情

相关推荐

移远BC260Y-CN实现TCP(IP)通讯

ESP32 BC260Y-CN NBIOT TCP/IP

hantusoft的博客 2541

HTTP keep-alive、TCP Keep-Alive、心跳检测,傻傻分不清?

大家都知道HTTP 1.0和HTTP 1.1的区别在于连接复用,表现在协议里就是HTTP 1.1的请求头中会多一个 Connection: keep-alive,但是具体如何进行连接复用的可能很多同学并不是很清楚,今天我就通过抓包来具体解析HTTP 1.1协议,跟大家一起来看看连接复用到底是怎么一回事,跟随这个过程,同样也回答下HTTP keep-alive、TCP Keep-Alive以及心跳检测之间的区别。 先来说说HTTP keep-alive 首先问大家一个问题:浏览器刷新页面,可能会同时有多个请求

sslulu520的博客 3867

linux内核协议栈 TCP连接探测中的Keepalive和心跳包使用

目录 1TCP保活的必要性 2导致TCP断连的因素 3保活的两种方式 3.1应用层面的心跳机制 3.2TCP协议自带的保活功能 4两种方式的优劣性 5到底选用那种心跳方式? 6 配置 Keep-alive 6.1socket 进行单独设定keepalive(代码层面) 6.2修改系统配置文件 7 测试结果 1TCP保活的必要性 多防火墙等对于空闲socket自动关闭 对于非正常断开,服务器并不能检测到.为了回收资源,必须提供一种检测机制. 2导致TCP...

2036

TCP心跳检测机制(异常处理)

心跳检测通常通过发送心跳包(也称为心跳消息或保持活动消息)来实现。这是一种小型的数据包或消息,它在连接上定期发送,用于验证连接的存活状态。客户端发起心跳:客户端每隔一段时间发送心跳包,如果客户端在设定时间没有收到服务端返回的应答消息,经重试机制后,客户端认为服务器异常,断开与服务器的连接。服务器发起心跳:服务器设置超时机制,主动向客户端发送心跳包,客户端未在规定时间内返回应答包导致超时,服务器将认为客户端异常,关闭与客户端的连接。

qq_65072319的博客 3412

航天仿真必看:如何用SOFA库实现高精度GCRS-ITRS坐标转换?避坑指南

本文深入解析了航天仿真中高精度GCRS-ITRS坐标转换的关键技术,重点介绍了SOFA库在天球系与轨道系转换中的权威应用。通过对比传统方法的误差来源,详细阐述了SOFA库的转换算法优势、工程实现步骤及误差控制策略,为航天器轨道仿真提供毫米级精度的解决方案。

7h6j5k4l3的博客 850

OCR开发车架号识别vin码识别系统

一、vin码识别车架号识别系统简介   vin码识别车架号识别系统,结合VIN码主机厂数据库及自身多年文字识别经验,针对机动车配置参数等信息的查询及采集业务推出的一款VIN码自动识别产品。   车架号识别vin码识别,主要应用在智能手机IOS与Android两个平台中。前端扫描查询模式,无需联网,只需扫描汽车前挡风玻璃右下角的VIN玛(车架号),即可轻松识别出车辆产地、品牌、车

OCR13512721355的博客 1433

TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活

TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活     TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活 分类: linux2013-11-29 17:46 3855人阅读 评论(1) 收藏 举报 Linuxtcp心跳keepalive保活 1. TCP保活的必要性 1) 很多防...

linuxheik的专栏 337

手把手教你用Arduino和开源电路DIY一个手机连接的电化学传感器(附GitHub源码)

本文详细介绍了如何利用Arduino和开源电路DIY一个手机连接的电化学传感器,成本不到300元即可复现价值数千元的专业设备。从硬件选型、电路搭建到固件开发和手机应用实现,手把手教你完成整个项目,特别适合科研人员、环境监测爱好者和理工科学生。附GitHub源码,方便快速上手和扩展功能。

weixin_42561040的博客 336

TCP协议的KeepAlive机制与HeartBeat心跳包

心跳包 很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。 心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小

why is this 1032

国内开发者福音:手把手教你用微软Authenticator搞定GitHub 2FA验证(附Recovery Codes保存指南)

本文详细介绍了国内开发者如何使用微软Authenticator中国版轻松配置GitHub双重身份验证(2FA),解决短信验证不可用和国际验证器访问困难的问题。重点强调了恢复码(Recovery Codes)的安全备份策略,确保账户安全无忧。

weixin_28840143的博客 435

PHP服务端 苹果支付(IAP)处理

公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每...

山水的博客 1万+

java tcp heartbeat_TCP协议的KeepAlive机制与HeartBeat心跳包

心跳包很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含...

weixin_39861734的博客 311

人工智能大模型原理与应用实战:AI模型转换为API的步骤和方法

传统的开发模式下,构建复杂的软件系统是非常费时费力的,而通过云计算、微服务等技术手段可以实现快速部署、弹性扩展的能力。在这种背景下,越来越多的公司将重点转移到研发人员的产品思维上,希望能够将自己的AI模型转换为一个可供他人调用的API接口。但是对于许多从事AI领域的研发人员来说,如何将自己的AI模型转换为API是一个比较棘手的问题。在这篇文章中,作者将从AI模型转换为API的过程分为以下几个步骤:AI模型准备阶段——模型选择、数据准备、模型训练。

AI天才研究院 2599

TCP连接探测中的Keepalive和心跳包

TCP连接探测中的Keepalive和心跳包 tcp keepalive  心跳  保活 Linuxtcp心跳keepalive保活1. TCP保活的必要性  1) 很多防火墙等对于空闲socket自动关闭  2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素  如果网络正常, socket也...

weixin_33895657的博客 160

YOLOv12改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是基于StarNet的YOLOv12轻量化改进方法研究。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 1215

uniapp - 解决在线预览PDF文件空白打不开的问题,无论是后端下载二进制文件流pdf还是本地插件或JS预览查看打开白屏不显示,详细排查解决(适用于移动端H5网页、安卓/苹果app、微信小程序)

uniapp App端 实现pdf文件预览打开白屏解决,uniapp 在线预览pdf打开一片空白,跨域白屏,uni-app中使用WebView预览PDF文件打开空白,微信小程序(uniapp)预览PDF空白怎么办,下载PDF文件流后打开空白或无法打开的问题,Uniapp H5网页下载二进制pdf文件页面空白以及解决文件损坏打不开的情况,Uniapp app在线预览pdf文件流,PDF加载出来怎么办,服务器后端返回PDF文件流后前端进行下载但打开后一片白屏,解决pdf文件流,预览全是空白页,pdf文件流,下载

🏆 前端领域优质创作者 1万+

为什么基于TCP的移动端IM仍然需要心跳保活?

TCP协议自身先天就有KeepAlive机制,为何基于它的通讯链接,仍然需要在应用层实现额外的心跳保活?心跳一般是指某端(绝大多数情况下是客户端)每隔一定时间向对端发送自定义指令,以判断双方是否存活,因其按照一定间隔发送,类似于心跳。

zzu_zzdysq的博客 1585

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java tcp 心跳机制_Java实现心跳机制的方法

一、心跳机制简介在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效。为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息,如果长时间没有收到对方的回复,则断开与对方的连接。发包方既可以是服务端,也可以是客户端,这要看具体实现。因为是每隔固定时间发送一次,类似心跳,所以发送的固定信息称为心跳包。心跳包一般为比较小的包,可根...

weixin_33435783的博客 1546

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TCP心跳机制

心跳机制实现方式,基于TCP自带的心跳包,TCP的SO_KEEPALIVE选项可以,系统默认的默认跳帧频率为2小时,超过2小时后,本地的TCP 实现会发送一个数据包给远程的 Socket. 如果远程Socket 没有发回响应, TCP实现就会持续尝试 11 分钟, 直到接收到响应为止。 否则就会自动断开Socket连接。 ...

RuiDer的博客 2675

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

tcpserver检测断开qt_socket选项自带的TCP异常断开检测

TCP异常断开是指在突然断电,直接拔网线等等情况下,如果通信双方没有进行数据发送通信等处理的时候,无法获知连接已经断开的情况.在通常的情况下,为了使得socket通信不受操作系统的限制,需要自己在应用层实现心跳包机制,来检查异常断开的情况,一般的方式就是服务器在一段时间没有收到客户端数据包时,定时发包,然后客户端回应,如果已经出现异常断开则服务器接收会返回错误,而客户端在指定时间内没有收到数据包,...

weixin_31837543的博客 1731

java 心跳程序_Java实现心跳机制的方法

一、心跳机制简介在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效。为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息,如果长时间没有收到对方的回复,则断开与对方的连接。发包方既可以是服务端,也可以是客户端,这要看具体实现。因为是每隔固定时间发送一次,类似心跳,所以发送的固定信息称为心跳包。心跳包一般为比较小的包,可根...

weixin_39689377的博客 708
上一篇: 主线程退出后,子线程会不会退出
下一篇: Windows客户端开发技能树
farrellcn
博客等级 码龄17年 55粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值