1、连接假死
连接假死的现象是:在某一端(服务端或者客户端)看来,底层的TCP连接已经断开,但是应用程序并没有捕获到,因此会认为这条连接仍然是存在的。从TCP层面来说,只有收到四次握手数据包或者一个RST数据包,才表示连接的状态已断开。
连接假死会带来以下两大问题。
1.对于服务端来说,因为每个连接都会耗费CPU和内存资源,大量假死的连接会逐渐耗光服务器的资源,最终导致性能逐渐下降,程序崩溃。
2.对于客户端来说,连接假死会造成发送数据超时,影响用户体验。
通常,连接假死由以下几个原因造成。
1.应用程序出现线程堵塞,无法进行数据的读写。
2.客户端或者服务端网络相关的设备出现故障,比如网卡、机房故障。
3.公网丢包。公网环境相对内网而言,非常容易出现丢包、网络抖动等现象,如果在一段时间内用户接入的网络连续出现丢包现象,那么对客户端来说,数据一直发送不出去;而服务端也一直收不到客户端的数据,连接就一直耗着。如果应用程序是面向用户的,那么公网丢包这个问题出现的概率是非常高的。对于内网来说,内网丢包、抖动也会有一定概率发生。一旦出现此类问题,客户端和服务端都会受到影响。接下来,我们分别从服务端和客户端的角度来解决连接假死的问题。
2、什么是空闲检测
对于服务端来说,客户端的连接如果出现假死,那么服务端将无法收到客户端的数据。也就是说,如果能一直收到客户端发来的数据,则说明这个连接还是活的。因此,服务端对于连接假死的应对策略就是空闲检测。
何为空闲检测?空闲检测指的是每隔一段时间,检测这段时间内