tcp连接探测中的keepalive和心跳包

songjy2116 songjy2116     2022-09-24     408

关键词:

转载:http://blog.csdn.net/aa2650/article/details/17027845

1. TCP保活的必要性

1) 很多防火墙等对于空闲socket自动关闭

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

 

2. 导致TCP断连的因素

如果网络正常, socket也通过close操作来进行优雅的关闭, 那么一切完美. 可是有很多情况, 比如网线故障, 客户端一侧突然断电或者崩溃等等, 这些情况server并不能正常检测到连接的断开. 

 

3. 保活的两种方式:

1) 应用层面的心跳机制

自定义心跳消息头. 一般客户端主动发送, 服务器接收后进行回应(也可以不回应). 这里不进行详述.

PS: 有人从软件的功能角度列出第三种方式, 就是通过第三方软件来进行探测, 确定连接的有效性. 这种方式局限性很大, 而且不属于软件内部的功能实现. 不进行讨论.

2) TCP协议自带的保活功能

打开keep-alive功能即可. 具体属性也可以通过API设定.

 

4. 两种方式的优劣性

TCP协议自带的保活功能, 使用起来简单, 减少了应用层代码的复杂度. 推测也会更节省流量, 因为一般来说应用层的数据传输到协议层时都会被加上额外的包头包尾. 由TCP协议提供的检活, 其发的探测包, 理论上实现的会更精妙(用更少的字节完成更多的目标), 耗费更少的流量.

由应用自己实现的应用层的心跳, 为心跳消息额外定义一个消息类型就可以了. 就是应用正常的消息包, 只是这个包特殊点, 专门用来检活而已, 通常比较小, 可能只有消息头就可以了, 除非需要额外的信息. 

应用层心跳的好处我个人的理解有两点: 

一是比较灵活, 因为协议层的心跳只能提供最纯粹的检活功能, 但是应用层自己可以随意控制, 包括协议可能提供的是秒级的, 但是你想做成毫秒级的都任意(虽然实际几乎不会有这种时间级别的心跳), 包里还甚至可以携带额外的信息, 这些都是灵活之处.

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

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

 

5. 到底选用那种心跳方式?

优劣点第4节已经进行了阐述, 因此如果能确定你们更换协议的可能性非常小, 同时只是需要检活的功能, 那么用协议自带的就绝对OK了, 使用简单而且高效. 有些自负的人总喜欢用自己搞的, 来代替成熟协议自带的东西, 代替系统内核提供的东西, 其实往往你应用层实现的东西, 都是更拙劣的

centostcp不发送

...用TCP的机制,通过设置系统参数,从系统层面,监测tcp的连接状态。以下为linux下的方法:1,首先查看系统tcp_keepalive相关参数(centos和Ubuntu)#sysctl-a|greptcp_keepalive显示如下:net.ipv4.tcp_keepalive_intvl=75net.ipv4.tcp_keepalive_probes=9n... 查看详情

socket如何保证长连接

...自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个Timer事件中定时向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应,如果... 查看详情

tcp心跳包与keepalive

“cli和ser建立连接后,cli挂掉,ser知道吗?”方法1:应用层自己实现的心跳包TCPsocket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能更大。因此一般是由客户端给... 查看详情

tcpkeepalive超时会触发啥事件

采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃、当机、网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回。很多时候,这不是我们需要的。... 查看详情

grpc-源码-网络模型

...tcp基础上的http2协议,http2协议负责grpc基础的数据传输、连接管理、流控等,具体的业务层service定义是基于protobuf的整个的网络过程和关键点如下图说明:TCPKeepAlive则是为了探测/保鲜(心跳检测,连接错误检测):用于探测对端... 查看详情

socket心跳包机制

...用层自己实现的心跳包由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个Timer事件中定时向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户... 查看详情

socket心跳包机制

...用层自己实现的心跳包由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个Timer事件中定时向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户... 查看详情

心跳包(heartbeat)

...的方法吗?TCP提供的KeepAlive机制可以替代HeartBeat吗?由于连接丢失 查看详情

socket心跳包

...告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。  在TCP的机制里面,本身是存在有心跳包的机制的,也就... 查看详情

ios即时通讯(二):心跳保活

...是TCP协议,应用层的心跳保活仍旧必不可少。在使用TCP长连接的IM服务设计中,往往都会涉及到心跳。心跳一般是指客户端每隔一定时间向服务端发送自定义指令,以判断双方是否存活,因其按照一定间隔发送,类似于心跳,故... 查看详情

tcp的keepalive和应用层的heart

从长链接说起TCP是长链接的,也就是说连接建立后,及时数年没有通信连接仍然存在。这样做的好处是:免去了DNS解析的时间,连接建立等时间,大大加快了请求的速度,同时也有利于接受服务器的实时消息。但前提是连接可用... 查看详情

keepalive

...的keepalivekeepalive是设置在操作系统级别,作用于到本机的连接。在一定时间内对远程主机发送TCP探测报文用于探测对方是否存活。上图2个场景是最常见的,但是针对于keepalive的问题是一样的。无非就是客户端和最终的WEB服务器... 查看详情

自定义协议:如何实现keepalive(代码片段)

...么是keepaliveKeepalive是一种技术,它可以帮助保持网络连接活跃,避免链路失效。它可以通过给双方发送定期的探测报文,来确认对侧主机是否仍然处于可用状态,并采取必要的措施保持链路的连接性、可靠性和可... 查看详情

mqtt协议学习:keepalive和连接保活

...我们提到过Broker需要知道Client是否非正常地断开了和它的连接,以发送遗愿消息。实际上Client也需要能够很快地检测到它失去了和Broker的连接,以便重新连接。MQTT协议是基于TCP的一个应用层协议,理论上TCP协议在丢失连接时会... 查看详情

socketkeepalive理解

...ket编程中有个keepalive选项,看到这个选项经常会误解为长连接,不设置则为短连接,实则不然。socket连接建立之后,只要双方均未主动关闭连接,那这个连接就是会一直保持的,就是持久的连接。keepalive只是为了防止连接的双方... 查看详情

socket中的短连接与长连接,心跳包示例详解(代码片段)

TCP连接简介当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,... 查看详情

傻傻分不清的tcpkeepalive和httpkeepalive

...”)正如概念中说的,用于探测对端是否存活,从而防止连接处于“半打开”状态。所谓半打开,就是网络连接的双端中,有一端已经断开,而另一端仍然处于连接状态。(图一)TCPkeepalive流程图建立连接的双端在通信的同时,... 查看详情

socket心跳包机制总结

...己组建心跳包的方式向对端发送通过Keep-alive机制对tcp的连接保持,也就是Tcp的心跳包,见MSDN:Ifkeep-aliveisenabledforaTCPsocketwithSO_KEEPALIVE,thenthedefaultTCPsettingsareusedforthekeep-alivetimeoutandintervalunlessthesevalueshavebeenchangedbycallingtheWSAIoctlfuncti... 查看详情