tcp keepalive介绍与netty 心跳实现

目录

编写过c/s 网络通信程序人都知道,一个网络通信程序必须包括客户端与服务端,在编写服务端程序的时候通常会设置一些tcp协议的参数来优化tcp层,常用的包括:SO_REUSEADDR、SO_KEEPALIVE、SO_SNDBUF、SO_RCVBUF。c 语言中可以通过setsockopt函数来设置。

今天这篇文章主要介绍与心跳相关的参数SO_KEEPALIVE以及如何用netty来实现应用级心跳,主要包括以下内容:

  1. 什么是保活与心跳,心跳的作用是什么
  2. TCP/IP协议如何实现心跳
  3. 不同的操作系统如何查看或修改与心跳相关的参数
  4. 为什么需要应用级心跳
  5. 如何实现应用级心跳

1. 什么是保活与心跳,作用是什么

SO_KEEPALIVE 直译过来就是保活的意思,另一个更通俗易懂解释就是心跳,类似于人的心脏按一定频率跳动证明你还活着,但软件心跳不是用来证明自己还活着,而是要来证明或检测对方是否还活着,那为什么要来检查对方是否活着呢? 我们知道正常情况tcp连接关闭的时候,无论是客户端发起关闭还是服务发起关闭都会正常关闭连接,双方都会释放该连接占用的资源:应用释放资源,tcp层也会释放资源(主要是内存资源)。但是有些情况,该不该释放资源,就不知道了,如果服务端与客户端以长连接的方式保持连接,但是服务端已经长时间没有收到客户端发来的数据,造成这种原因包括以下几方面:

  1. 客户端确实没有需要发送的数据
  2. 客户端进程意外终止运行
  3. 客户端所在的服务器宕机,或停电
  4. 网络中间设备掐断连接,如防火墙对长时间不活动的连接,进行强制关闭

针对以上4种情况,只有1是正常情况,不应该关闭双方的连接,其它都是异常情况,服务端就应该关闭已经建立的连接,释放服务端的资源。如果不释放,就会存在很多半连接状态的连接,占用服务端大量资源。由于存在1这种正常的情况,服务端就不断随意关闭连接,需要一种手段来解决连接该不该关闭的问题。TCP/IP协议实现中就包含了心跳机制,在服务端程序程序中我们只需要设置SO_KEEPALIVE参数,那么如连接超过指定的时间(见第3节心跳相关的参数)没有收到数据,就会触发TCP层发起心调检测,从这里看可以看出TCP协议自身心跳的目的是检测异常链接,关闭链接,及释放资源
而应用侧心调还有其它目的。具体见第4节

2. TCP/IP协议如何实现心跳

未完,待续。。。。。。

你可能感兴趣的:(netty)