TCP Keepalive机制与应用层心跳Heartbeat

news/2024/5/17 16:16:48 标签: tcp, keepalive, 网络, 协议, heartbeat

TCP长连接中可能出现的问题

1.     很多防火墙路由器等对于空闲socket自动关闭

2.     对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制.

于是,就有了心跳(HeartBeat)机制。


心跳机制的两种实现方案

目前而言,有两种方式实现TCP的保活(业内现状是IM方面几乎都采用第一种)

1.     应用层协议自己实现的心跳机制

很多应用层协议都有HeartBeat机制,由应用自己实现的应用层的心跳, 为心跳消息额外定义一个消息类型。通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议

2.     TCP协议支持的心跳机制Keepalive

打开TCP协议已有的SO_KEEPALIVE选项. 一般实现在服务器侧,客户端被动响应前面一篇博客有具体介绍,这里就不多讲了。

 

TCP Keepalive和应用层HeartBeat优缺点

1.     TCP协议的Keepalive

优点:

系统内核完全替上层应用自动给做好了,内核层面计时器相比上层应用,更为高效

上层应用只需要处理数据收发、连接异常通知即可。

使用起来简单, 减少了应用层代码的复杂度. 也会更节省流量, 因为应用层的数据传输到TCP协议层时都会被加上额外的包头包尾. 由TCP协议提供的检活, 其发的探测包, 理论上实现的会更精妙, 耗费更少的流量.。

缺点:

第一点,keepAlive只能检测连接存活,而不能检测连接可用,比如某台服务器因为某些原因导致负载超高,CPU满了,无法响应任何业务请求,但是使用 TCP 探针则仍旧能够确定连接状态,这就是典型的连接活着但业务提供方已死的状态,对客户端而言,这时的最好选择就是断线后重新连接其他服务器,而不是一直认为当前服务器是可用状态,一直向当前服务器发送些必然会失败的请求;

第二点,如果tcp连接的另一端突然掉线,这个时候我们并不知道网络已经关闭。而此时,如果有发送数据失败,tcp会自动进行重传。重传包的优先级高于keepalive的包,那就意味着,我们的keepalive总是不能发送出去。 而此时,我们也并不知道该连接已经出错而中断。在较长时间的重传失败之后,我们才会知道。

2.     应用层HeartBeat

优点:

有着更大的灵活性,可以控制检测时机,间隔和处理流程,甚至可以在心跳包上附带额外信息,最重要的是可以做到没有上面所说的缺点,不光可以检测连接存在,还可以检测连接可用。

通用, 应用层的心跳不依赖协议. 如果有一天不用TCP要改为UDP了, 协议层不提供心跳机制了, 但是你应用层的心跳依旧是通用的, 可能只需要做少许改动就可以继续使用。

缺点:需要自己实现,增加开发工作量,由于应用特定的网络框架,还可能增加代码结构的复杂度,应用层心跳的流量消耗还是更大的,毕竟这本质上还是个普通的数据包。



http://www.niftyadmin.cn/n/1748190.html

相关文章

HDFS:edit log fsimage

在NameNode的${dfs.namenode.name.dir}/current目录下,有这样几个文件:在数据库系统中,log是用于记录写操作的日志的,并使用该Log进行备份、恢复数据等工作。有关写的操作的记录的,目前见过了两种:关系型数…

Wine中PE格式文件的加载(四):DLL的装入和连接

在加载完PE可执行文件后,回到kernel32的入口函数__wine_kernel_init中,接下来调用了函数LdrInitializeThunk。dll的装入和连接过程主要是该函数实现的。 函数部分代码如下图所示:先用main_exe_file判断主模块是否已经被建立了,这是…

《循序渐进Linux(第2版) 基础知识 服务器搭建 系统管理 性能调优 虚拟化与集群应用》——4.3 文件管理与编辑...

本节书摘来自异步社区《循序渐进Linux(第2版) 基础知识 服务器搭建 系统管理 性能调优 虚拟化与集群应用》一书中的第4章,第4.3节,作者:高俊峰著,更多章节内容可以访问云栖社区“异步社区”公众号查看 4.3 …

WebSocket协议讲解

WebSocket是什么 Wiki上是这样介绍的:WebSocket是一种在单个TCP连接上进行全双工通讯的协议。 这里做个补充:是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通…

浅谈Scala语法基础

为什么80%的码农都做不了架构师?>>> 编程语言设计中提到,一门语言包含了语法,语义,语用几个部分;语法是对语言规则的描述,语义是对语法单位,单词符号意义的定义;而了解语…

Netty4——Handler执行顺序

Netty4中, I / O事件由ChannelInboundHandler或ChannelOutboundHandler处理,并通过调用ChannelHandlerContext中定义的事件传播方法(如ChannelHandlerContext.fireChannelRead(Object)和ChannelHandlerContext.write&a…

getViewTreeObserver的用法

为什么80%的码农都做不了架构师?>>> ViewTreeObserver是个view事件的观察者。要注意的是它的初始化就是调用View.getViewTreeObserver()。 包含下面6个事件: interface ViewTreeObserver.OnDrawListener 挡在一个视图树绘制时,所…

OSChina 周五乱弹 ——下完雨朕的江山都湿了

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) 【今日歌曲】 shinningEyes丶果果 :分享The Chainsmokers/Coldplay的单曲《Something Just Like This》: 《Something Just Lik…