Server端如何感知客户端的状态
如果网络拥塞严重,chatserver端如何感知客户端在线还是掉线了?
客户端主动发送close(fd),相当于TCP的四次挥手,发送FIN包,进行挥手操作,对应服务端,就有一个响应:recv=0(判断客户端掉线,下线了)
这是我们在局域网的聊天服务器里面,网络是良好的,是不会出现问题的。
但是,如果放在真实的网络环境中,这个客户端发送的FIN包有可能服务器根本收不到,因为真实的网络环境是非常非常复杂的,有可能现在我们的客户端到服务端的中间网络节点的路由器里面的报文非常多,网络拥塞非常严重,导致FIN包到达不了服务端。
TCP协议下,发送的每一个包都会去等待这个包的响应,如果没有响应,会超时重传,但是超时重传是有一定的次数,如果超过次数,TCP就会reset把socket重置了,但是还是导致这个FIN包最终还是没有到达服务端,导致这个客户端已经下线了,但是服务端并没有感知到,客户端已经自己重置了,服务端却一直以为这个客户端在线,把这个客户端所给的socketfd没有释放,相关的其他资源也没有释放,就积累越来越多的僵尸客户端连接。、
解决方法
心跳机制!!!