原文连接:http://www.vants.org/?post=162 数据库
做者:易隐者 发布于:2012-10-15 11:30 Monday 分类:网络分析windows
TCP保活的缘起服务器
双方创建交互的链接,可是并非一直存在数据交互,有些链接会在数据交互完毕后,主动释放链接,而有些不会,那么在长时间无数据交互的时间段内,交互双方都有可能出现掉电、死机、异常重启等各类意外,当这些意外发生以后,这些TCP链接并将来得及正常释放,那么,链接的另外一方并不知道对端的状况,它会一直维护这个链接,长时间的积累会致使很是多的半打开链接,形成端系统资源的消耗和浪费,为了解决这个问题,在传输层能够利用TCP的保活报文来实现。网络
TCP保活的做用ide
1, 探测链接的对端是否存活
在应用交互的过程当中,可能存在如下几种状况:
(1), 客户端或服务器端意外断电、死机、崩溃、重启
(2), 中间网络已经中断,而客户端与服务器端并不知道
利用保活探测功能,能够探知这种对端的意外状况,从而保证在乎外发生时,能够释放半打开的TCP链接。post
2, 防止中间设备因超时删除链接相关的链接表性能
中间设备如防火墙等,会为通过它的数据报文创建相关的链接信息表,并为其设置一个超时时间的定时器,若是超出预约时间,某链接无任何报文交互的话,中间设备会将该链接信息从表中删除,在删除后,再有应用报文过来时,中间设备将丢弃该报文,从而致使应用出现异常,这个交互的过程大体以下图所示:
spa
这种状况在有防火墙的应用环境下很是常见,这会给某些长时间无数据交互可是又要长时间维持链接的应用(如数据库)带来很大的影响,为了解决这个问题,应用自己或TCP能够经过保活报文来维持中间设备中该链接的信息,(也能够在中间设备上开启长链接属性或调高链接表的释放时间来解决,可是,这个影响可能较大,有机会再针对这个作详细的描述,在此很少说)。3d
常见应用故障场景:orm
某财务应用,在客户端须要填写大量的表单数据,在客户端与服务器端创建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参数的设置和修改,请你们自行百度谷歌,在此我就不作简单搬砖的事情了。