TCP保活(TCP keepalive)

简介:

原文链接:http://www.vants.org/?post=162


TCP保活(TCP keepalive)

作者:易隐者 发布于:2012-10-15 11:30 Monday 分类:网络分析

TCP保活的缘起

       双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动释放连接,而有些不会,那么在长时间无数据交互的时间段内,交互双方都有可能出现掉电、死机、异常重启等各种意外,当这些意外发生之后,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,为了解决这个问题,在传输层可以利用TCP的保活报文来实现。

TCP保活的作用

1, 探测连接的对端是否存活
        在应用交互的过程中,可能存在以下几种情况:
(1), 客户端或服务器端意外断电、死机、崩溃、重启
(2), 中间网络已经中断,而客户端与服务器端并不知道
        利用保活探测功能,可以探知这种对端的意外情况,从而保证在意外发生时,可以释放半打开的TCP连接。

2, 防止中间设备因超时删除连接相关的连接表

       中间设备如防火墙等,会为经过它的数据报文建立相关的连接信息表,并为其设置一个超时时间的定时器,如果超出预定时间,某连接无任何报文交互的话,中间设备会将该连接信息从表中删除,在删除后,再有应用报文过来时,中间设备将丢弃该报文,从而导致应用出现异常,这个交互的过程大致如下图所示:

点击查看原图

       这种情况在有防火墙的应用环境下非常常见,这会给某些长时间无数据交互但是又要长时间维持连接的应用(如数据库)带来很大的影响,为了解决这个问题,应用本身或TCP可以通过保活报文来维持中间设备中该连接的信息,(也可以在中间设备上开启长连接属性或调高连接表的释放时间来解决,但是,这个影响可能较大,有机会再针对这个做详细的描述,在此不多说)。

常见应用故障场景:

       某财务应用,在客户端需要填写大量的表单数据,在客户端与服务器端建立TCP连接后,客户端终端使用者将花费几分钟甚至几十分钟填写表单相关信息,终端使用者终于填好表单所需信息后,点击“提交”按钮,结果,这个时候由于中间设备早已经将这个TCP连接从连接表中删除了,其将直接丢弃这个报文或者给客户端发送RST报文,应用故障产生,这将导致客户端终端使用者所有的工作将需要重新来过,给使用者带来极大的不便和损失。

TCP保活报文格式:

1, TCP keepalive probe报文

       我们看到,TCP保活探测报文是将之前TCP报文的序列号减1,并设置1个字节,内容为“00”的应用层数据,如下图所示:

点击查看原图

发送keepalive probe报文之前的TCP报文

点击查看原图

 TCP keepalive probe报文


2, TCP keepalive ACK报文

        TCP保活探测确认报文就是对保活探测报文的确认, 其报文格式如下:

点击查看原图

TCP keepalive ACK报文

TCP保活报文交互过程

        TCP保活的交互过程大致如下图所示:

点击查看原图


TCP保活可能带来的问题

1, 中间设备因大量保活连接,导致其连接表满

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

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

TCP保活的设置

        一般而言,保活探测主要在服务器端实现,如果应用层有相应的保活机制时,传输层的TCP保活就可以不用。

        在windows系统中,我们可以通过修改注册表等来达到开启、调整保活相关
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
KeepAliveInterval 
项:Tcpip\Parameters
数值类型:REG_DWORD - 时间(以毫秒为单位)
有效范围:1 - 0xFFFFFFFF
默认值:1000(1 秒)
说明:此参数确定在收到响应之前,保活重传之间的时间间隔。一旦收到一个响应,将由 KeepAliveTime 值重新控制在下一次保活传输之前的延迟。如果经过 TcpMaxDataRetransmissions 指定的重新传输次数后仍无响应,将放弃连接。 
KeepAliveTime 
项:Tcpip\Parameters
数值类型:REG_DWORD - 时间(以毫秒为单位)
有效范围:1 - 0xFFFFFFFF
默认值:7,200,000(两个小时)
说明:此参数控制 TCP 试图通过发送保活数据包来验证空闲连接是否仍然保持的次数。如果远程系统仍然可以连接并且正在运行,它就会响应保活传输。默认情况下不发送保活数据包。应用程序可以在连接上启用此功能。

       关于Linux、HP UNIX、IBM AIX、SUN solaris等系统keepalive参数的设置和修改,请大家自行百度谷歌,在此我就不做简单搬砖的事情了。





      本文转自1清风揽月1  51CTO博客,原文链接:http://blog.51cto.com/watchmen/1975587 ,如需转载请自行联系原作者


相关文章
|
网络协议 Linux 关系型数据库
TCP Keepalive HOWTO
TCP Keepalive HOWTO Fabio Busatto 2007-05-04 Revision History Revision 1.0 2007-05-04 Revised by: FB First release, reviewed by TM.
1232 0
|
网络协议 Linux Windows
TCP连接探测中的Keepalive 和心跳包
采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃、当机、网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回。很多时候,这不是我们需要的。
1407 0
|
网络协议 网络安全 C++
TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制.   2. 导致TCP断连的因素 如果网络正常, socket也通过close操作来进行优雅的关闭, 那么一切完美.
1451 0
|
网络协议
TCP keepAlive
路上,有朋友说到服务端异常死掉,而客户端无法感知的情况。我说可以用KEEPLIVE去增加检测,刚好,网上有一文章写得很详细。 http://space.itpub.net/25259598/viewspace-684112 在一个正常的TCP连接上,当我们用无限等待的方式调用下面的Rec...
1062 0
|
监控 网络协议 Windows
Delphi2010中DataSnap高级技术(4)—TCP keepAlive和KeepAliveInterval参数详解
Delphi2010中DataSnap,如果客户端异常掉线或拔掉网线,那么在服务端会留下一个TCP连接,这个连接会变成死连接(经过测试,如果windows的TCP保持连接禁用的话,三个小时该死连接还不消失)。
1336 0
|
6月前
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
100 4
|
监控 网络协议 网络架构
IP协议【图解TCP/IP(笔记九)】
IP协议【图解TCP/IP(笔记九)】
141 0