一、TCP存活(keepalive)检测的背景
对于TCP设计来说,如果一个客户端和服务器端建立连接后,不在进行数据传输,那么这个连接将会一直存在下去,理论上即使中间的路由器崩溃重启、或者中间的网络线路拔掉在插上等等,只要客户端和服务器端的主机没有发生异常,这个TCP连接仍然是处于连接状态的。这样会有两个问题
1、服务器端可能需要内存等资源保存每个连接的状态信息,即使这个连接在实际上已经不能通信而没有存在的必要了。比如客户端崩溃时,服务器可能仍然认为这个连接是有效的而继续占用为这个连接分配的资源
2、防火墙和NAT设备可能会保存一个连接超时的定时器,如果这个TCP连接长时间没有数据传输,定时器超时后,服务器端和客户端实际上已经不能在进行通信。
为了解决上面的两个问题,TCP连接需要一个存活(keepalive)检测机制,定时检测当前的TCP连接是否可用,以刷新防火墙和NAT信息,或者当检测到连接失败的时候释放相关资源。
二、存活检测的两种方式:
1、应用层面的心跳机制(application-managed keepalive)
自定义心跳消息头. 一般客户端主动发送, 服务器接收后进行回应(也可以不回应)。相比传输层的keepalive检测,应用层的检测更灵活且不依赖传输层的协议。 例如最新的ssh就有应用层的存活检测机制。本文不做额外介绍。
2、传输层的存活检测
TCP的存活检测就属于传输层的存活检测功能,相比于应用层的检测,传输层的检测可以提供更通用的检测从而减少应用层的工作量,另外传输层的探测包不需要添加应用层的头,从而减轻了网络负载。传输层的TCP keepalive是接下来介绍的功能。
三、TCP的存活检测
TCP