面试官问(客户端突然没电关机,服务器怎么知道?)

(1)使用定时器(适合有数据流动的情况)。
(2)使用socket选项SO_KEEPALIVE(适合没有数据流动的情况)。

心跳包的发送,通常有两种技术:
心跳包技术:

心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个
客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不
过一般都是很小的包,或者只包含包头的一个空包。

方法1:应用层自己实现的心跳包。

由应用程序自己发送心跳包来检测连接是否正常。大致的方法是:服务器端在一个 定时事件中 
定时向客户端发送一个短小的数据包,然后启动一个线程,在该线程当中不断检测客户端的AC
K应答包。如果在定时时间内收到了客户端的ACK应答包,说明客户端与服务器端的TCP连接仍
然是可用的。但是,如果定时器已经超时、而服务器仍然没有收到客户端的ACK应答包,即可以
认为客户端已经断开。同样道理,如果客户端在一定时间内没有收到服务器的心跳包,则也会认
为改TCP连接不可用了。

方法2:TCP协议的KeepAlive保活机制。

因为要考虑到一个服务器通常会连接很多个客户端,因此,由用户在应用层自己实现心跳包,
代码较多而且稍显复杂。而利用TCP/IP协议层的内置的KeepAlive功能来实现心跳功能则简
单得多。不论是服务器端还是客户端,只要一端开启KeepAlive功能后,就会自动的在规定时
间内向对端发送心跳包,而另一端在收到心跳包后就会自动回复,以告诉对端主机我仍然在线
。因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认是不开启KeepAli
ve功能的。尽管这微不足道,但是在按流量计费的环境下增加了费用,另一方面,KeepAlive
设置不合理的话有可能会 因为短暂的网络波动而断开健康的TCP连接。并且,默认的KeepAli
ve超时需要即2小时,探测次数为5次。对于很多服务端应用程序来说,2小时的空闲时间太长
。因此,我们需要手工开启KeepAlive功能并设置合理的KeepAlive参数。

猜你喜欢

转载自blog.csdn.net/N1314N/article/details/91354169