服务端怎么知道客户端是否断开网络连接了?

假设我开了一个客户端链接 mysql server (假设客户端在西部,服务器在东部,相隔几千公里),但是我直接一个 kill -9 杀死了这个客户端,此时 mysql server 会知道客户端死了吗?还是说要等到 timeout 时间才行?kill -9 杀死进程的时候,会用四次挥手告诉 mysql server

再假设是默认的 kill 命令呢?

再假设是客户端机器直接一瞬间炸毁了,mysql server 可以知道断开链接了吗?还是说要等到 timeout 超时?

阅读 5.7k
3 个回答

断网肯定是没法发数据的,服务端会有超时关闭进程。
另外两种情况实际操作一下,就知道了。

exit:
image.png

kill:

image.png

先跟你讨论网络正常的情况下:

这个时候如果你 kill -9 杀死了客户端进程,服务端是能够被通知到断开连接的。

不加 -9 也肯定也行了,你都能自己在退出时通知服务端。

网络不正常的情况下:

服务端是无法被通知到的,这也是数据库死锁的来源之一,如果你的客户端进程还在,开启了一个事物,这时你的客户端网络突然断开了,服务端是收不到通知的,就形成了死锁,你可以自己测试一下,客户端开启事务,然后关闭wifi。

你自己的写的 socket 服务同理。

客户端机器炸毁的情况结局就是在问进程网络还在不在,谁先谁后。

最保险的方式

最保险的方式,还是你自己使用心跳包的方式检测活动。

通常的做法是:

  1. 做好基本的断开处理,即正常关闭(fin)的处理
  2. 可以开启 tcp keepalive,增加一些心跳
  3. 做应用层心跳探测,处理连接异常关闭

有3可以不用2了,双重保障才稳妥

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题