在互联网领域,客户端和服务端之间通常需要建立和保持TCP长连接。所谓长连接,就是通信双方在建立TCP连接后进行数据通信,一次或若干次通信交互完成之后,不主动断开连接,而是保持TCP连接不释放,在随时需要通信的时候,不再需要重新建立连接。长连接可以提高通信速度、确保实时性、避免短时间内重复连接所造成的网络资源浪费,例如:即时通信,物联网等应用场景。对于服务器来说,接入和保持海量的客户端长连接,需要付出大量的服务器资源(网络、内存、CPU、文件句柄等)。由于很多客观原因(例如网络环境、客户端本身出现故障等),双方会建立一些无效的连接,既没有有效的数据通信,又不会主动关闭,称之为“死”连接。为了提高服务器资源的利用率,需要将“死”连接主动关闭释放资源,这就是心跳保活机制。所谓心跳保活,就是在通信过程中,通信双方定期给对方发送心跳包(一种特殊的数据报文),表示发送方还存活着。服务器收到客户端定期发送的心跳包之后,就认为客户端还活着,反之,如果超过规定时间内没有收到心跳包,则认为客户端已“死”,需要将TCP连接关闭。因此,服务端需要管理所有客户端连接会话,记录所有会话的超时时间,定期把超时的会话连接进行清除。
如何定期把超时的会话清除,如何将有数据通信的活跃连接的会话进行保持?
一种简单和常用的实现方法是在每次客户端连接建立的时候,就设置一个定时器和该TCP连接关联,该定时器在指定超时时间到达之后会关闭该关联的TCP连接。如果在该定时器超时时间到达之前,关联的TCP连接链路有数据通信,则重置定时器的超时时间。这种方法可以非常精确设置每一个TCP连接保活的超时时间。但是当客户端