TCP的keepalive和应用层的heart

从长链接说起

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

TCP的keepalive机制

服务器为了探测对端是否还活着,于是每隔两小时发送一个keepalive报文(携带一个字节的Data)。个人觉得保活机制也就是在局域网中用用,路由器表项每个几分钟老化一次,连接早就不存在了。

保活机制的缺点

1、网关设备由于保活问题,导致其连接表满,无法新建连接(XX局网闸故障案例)或性能下降严重

2、当连接一端在发送保活探测报文时,中间网络正好由于各种异常(如链路中断、中间设备重启等)而无法将该保活探测报文正确转发至对端时,可能会导致探测的一方释放本来正常的连接,但是这种可能情况发生的概率较小,另外,一般也可以增加保活探测报文发生的次数来减小这种情况发生的概率和影响。

应用层为何还要心跳报文

为什么我们需要使用应用层心跳来做检测,而不是直接使用 TCP 的特性呢?

我们知道 TCP 是一个基于连接的协议,其连接状态是由一个状态机进行维护,连接完毕后,双方都会处于 established 状态,这之后的状态并不会主动进行变化。这意味着如果上层不进行任何调用,一直使 TCP 连接空闲,那么这个连接虽然没有任何数据,但仍是保持连接状态,一天、一星期、甚至一个月,即使在这期间中间路由崩溃重启无数次。举个现实中经常遇到的栗子:当我们 ssh 到自己的 VPS 上,然后不小心踢掉网线,此时的网络变化并不会被 TCP 检测出,当我们重新插回网线,仍旧可以正常使用 ssh,同时此时并没有发生任何 TCP 的重连。

有人会说 TCP 不是有 KeepAlive 机制么,通过这个机制来实现不就可以了吗?但是事实上,TCP KeepAlive 的机制其实并不适用于此。Keep Alive 机制开启后,TCP 层将在定时时间到后发送相应的 KeepAlive 探针以确定连接可用性。一般时间为 7200 s(详情请参见《TCP/IP详解》中第23章),失败后重试 10 次,每次超时时间 75 s。显然默认值无法满足我们的需求,而修改过设置后就可以满足了吗?答案仍旧是否定的。

因为 TCP KeepAlive 是用于检测连接的死活,而心跳机制则附带一个额外的功能:检测通讯双方的存活状态。两者听起来似乎是一个意思,但实际上却大相径庭。

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

从上面我们可以知道,KeepAlive 并不适用于检测双方存活的场景,这种场景还得依赖于应用层的心跳。应用层心跳有着更大的灵活性,可以控制检测时机,间隔和处理流程,甚至可以在心跳包上附带额外信息。从这个角度而言,应用层的心跳的确是最佳实践。

原文地址:https://www.cnblogs.com/howo/p/8564148.html

时间: 2024-08-07 13:04:35

TCP的keepalive和应用层的heart的相关文章

在Linux环境下使用TCP的keepalive机制

Linux内置支持keepalive机制,为了使用它,你需要使能TCP/IP网络,为了能够配置内核在运行时的参数,你还需要procfs和sysctl的支持. 这个过程涉及到keepalive使用的三个用户驱使的变量: tcp_keepalive_time:表示的是最近一次数据包(简单的不含数据的ACKs包)发送与第一次keepalive探针发送之间的时间间隔:当连接被标记为keepalive之后,这个计数器就不会再使用. tcp_keepalive_intvl:表示的是并发keepalive探针

Linux下TCP的Keepalive相关参数

一 基本原理TCP的Keepalive可以简单理解成为keep tcp alive,用来检测TCP sockets的连接是否正常或是已经断开.Keeplived的原理很简单,当建立一个TCP连接时,发送端就会创建一些计时器,其中一些计时器就是处理keeplaive相关问题的.当keepalive的计时器计数到0时,发送端就会向对端发送一些不含数据的keepalive数据包并开启ACK标志.如果得到keepalive探测包的回复,就可以认为当前的TCP连接正常,不用担心用户层面的具体实现.事实上,

TCP/IP入门(4) --应用层

/** 本篇博客由汗青ZJF整理并发布, 转载请注明出处: http://blog.csdn.net/zjf280441589/article/category/1854365 */ TCP/IP中的应用层 DNS简介 域名系统是基于描述名字-地址映射的分布式计算机系统的实现,其作用是提供主机名和IP 地址间的映射关系. 名字到IP地址的解析是由若干个域名Server组成的, 域名Server程序在专设的结点上运行, 运行这些程序的机器成为域名服务器(Domain Server); 1)层次域名

设置TCP的keepalive来进行网络联调

使用TCP的keepalive来检查网络错误 为了检测网络错误和信令连接问题,你可以开启TCP的keep alive 功能. 它会增加信令使用的带宽,但信令通道使用的带宽要小于它的实际带宽,增加得并不多. 而且,还可以控制它keep alive的超时时长. 问题是大多数的系统对TCP keepalive的超时时长为7200秒,约两个小时. 你可能会想要这个时间更短此,如一分钟等. 对于每个系统,调整这个参数的方式是不一样的. 在设置完所有的相关参数后,需要检测下这些设置是否生效, 就需要生成一个

TCP的keep-alive小结

TCP的keep-alive可以在不增加服务器处理逻辑的前提下,检测客户端连接是否中断 /proc/sys/net/ipv4/tcp_keepalive_time 开始首次KeepAlive探测前的TCP空闭时间 /proc/sys/net/ipv4/tcp_keepalive_intvl 两次KeepAlive探测间的时间间隔 /proc/sys/net/ipv4/tcp_keepalive_probes 判定断开前的KeepAlive探测次数 对 于一个已经建立的tcp连接.如果在keepa

Linux下TCP的keepalive相关参数学习

一 基本原理 TCP的Keepalive可以简单理解成为keep tcp alive,用来检测TCP sockets的连接是否正常或是已经断开. Keeplived的原理很简单,当建立一个TCP连接时,发送端就会创建一些计时器,其中一些计时器就是处理keeplaive相关问题的.当keepalive的计时器计数到0时,发送端就会向对端发送一些不含数据的keepalive数据包并开启ACK标志.如果得到keepalive探测包的回复,就可以认为当前的TCP连接正常,不用担心用户层面的具体实现.事实

Http长连接和Keep-Alive以及Tcp的Keepalive

Keep-Alive模式:我们知道Http协议采用“请求-应答”模式,当使用普通模式,即非Keep-Alive模式时,每个请求/应答,客户端和服务器都要新建一个连接,完成之后立即断开连接:当使用Keep-Alive模式时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.http1.0中默认是关闭的,需要在http头加入”Connection: Keep-Alive”,才能启用Keep-Alive:http

tcp的keep-alive

TCP层面有自带的keep-alive,通过参数指定可以直接用,但是这种只能检测一个连接是否ok,如果一个系统连接可用,但是CPU高.IO阻塞无法返回response的话,那么这种检测属于没用的. 因此可以看到dubbo有自带的应用层心跳机制,可以做额外的包括future清理等业务处理. 另外对于http层的keep-alive指的是连接服用,不是探活 原文地址:https://www.cnblogs.com/notlate/p/10200605.html

http的keep-alive和tcp的keepalive区别

原文地址:http://blog.csdn.net/oceanperfect/article/details/51064574 1.HTTP Keep-Alive在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接.使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接.通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高htt