TCP保活机制

793 阅读3分钟

在需要长连接的网络通信程序中,经常需要心跳检测机制,来实现检测对方是否在线或者维持网络连接的需要。这一机制是在应用层实现的,对应的,在TCP协议中,也有类似的机制,就是TCP保活机制。

保活机制的作用

  • 1、探测对方是否存活 ·网络连接断开 ·客户端或服务端意外宕机、断电等
  • 2、防止因超时中间设备删除连接表 中间设备如防火墙、路由器等,会为经过它的数据报文建立相关的连接信息表,并为其设置一个超时时间的定时器,如果超出预定时间,某连接无任何报文交互的话,中间设备会将该连接信息从表中删除。

相关概念

  • 保活时间——此时间段内双方无交流,即处于非活动状态,默认为7200s 两小时
  • 保活时间间隔——每隔此间隔,发送保活探测报文
  • 保活探测数——持续发送探测报文的总次数,默认为9次
  • 保活探测报文——即为一个空报文段(或只包含1字节)。它的序列号等于对方主机发送的ACK报文的最大序列号减1。因为这一序列号的数据段已经被成功接收,所以不会对到达的报文段造成影响,但探测报文返回的响应可以确定连接是否仍在工作。探测及期响应报文都不包含任何新有效数据(它是”垃圾“数据),当它们丢失时也不会进行重传。

对方四种状态

  • i、对方主机仍在工作,并且可以到达 对方的tcp响应正常,并且请端也知道对方在正常正作。请求端将保活计时器重置(重新设定为保活时间值)。如果在计时器超时之前有应用程序通过该连接传输数据,那么计时器将再次被设定为保活时间值。
  • ii、对方主机已经崩溃,包括已经关闭或者正在重新启动 这种情况下,对方的tcp将不会响应。请求端不会接收到响应报文,并在经过保活时间间隔指定的时间后超时。超时前,请求端会持续发送探测报文,一共发送保活探测数据指定次数的探测报文,如果请求端没有收到任何探测报文的响应,那么它将认为对方主机已经关闭,连接也将断开。
  • iii、客户主机崩溃并且已重启 这种情况下,请求端会收到一个对其保活探测报文的响应,但这个响应是一个重置报文段,请求端将会断开连接。
  • iv、对方主机仍在工作,但是由于某些原因不能到达请求端 此情况如网络无法传输,而且可能使用ICMP通知也可能不通知对方这一事实。此情况与状态2相同,因为tcp不能区分状态2与状态4,结果都是没有收到探测报文的响应。

交互过程

可能带来的问题

  • 1、 中间设备因大量保活连接,导致其连接表满 网关设备由于保活问题,导致其连接表满,无法新建连接(XX局网闸故障案例)或性能下降严重
  • 2, 正常连接被释放 当连接一端在发送保活探测报文时,中间网络正好由于各种异常(如链路中断、中间设备重启等)而无法将该保活探测报文正确转发至对端时,可能会导致探测的一方释放本来正常的连接,但是这种可能情况发生的概率较小,另外,一般也可以增加保活探测报文发生的次数来减小这种情况发生的概率和影响。

感谢 blog.csdn.net/TT_love9527…

www.vants.org/?post=162