tcp keepalive介绍与netty 心跳实现
2016-08-19 17:45
316 查看
目录
编写过c/s 网络通信程序人都知道,一个网络通信程序必须包括客户端与服务端,在编写服务端程序的时候通常会设置一些tcp协议的参数来优化tcp层,常用的包括:SO_REUSEADDR、SO_KEEPALIVE、SO_SNDBUF、SO_RCVBUF。c 语言中可以通过setsockopt函数来设置。
今天这篇文章主要介绍与心跳相关的参数SO_KEEPALIVE以及如何用netty来实现应用级心跳,主要包括以下内容:
什么是保活与心跳,心跳的作用是什么
TCP/IP协议如何实现心跳
不同的操作系统如何查看或修改与心跳相关的参数
为什么需要应用级心跳
如何实现应用级心跳
1. 什么是保活与心跳,作用是什么
SO_KEEPALIVE 直译过来就是保活的意思,另一个更通俗易懂解释就是心跳,类似于人的心脏按一定频率跳动证明你还活着,但软件心跳不是用来证明自己还活着,而是要来证明或检测对方是否还活着,那为什么要来检查对方是否活着呢? 我们知道正常情况tcp连接关闭的时候,无论是客户端发起关闭还是服务发起关闭都会正常关闭连接,双方都会释放该连接占用的资源:应用释放资源,tcp层也会释放资源(主要是内存资源)。但是有些情况,该不该释放资源,就不知道了,如果服务端与客户端以长连接的方式保持连接,但是服务端已经长时间没有收到客户端发来的数据,造成这种原因包括以下几方面:客户端确实没有需要发送的数据
客户端进程意外终止运行
客户端所在的服务器宕机,或停电
网络中间设备掐断连接,如防火墙对长时间不活动的连接,进行强制关闭
针对以上4种情况,只有1是正常情况,不应该关闭双方的连接,其它都是异常情况,服务端就应该关闭已经建立的连接,释放服务端的资源。如果不释放,就会存在很多半连接状态的连接,占用服务端大量资源。由于存在1这种正常的情况,服务端就不断随意关闭连接,需要一种手段来解决连接该不该关闭的问题。TCP/IP协议实现中就包含了心跳机制,在服务端程序程序中我们只需要设置SO_KEEPALIVE参数,那么如连接超过指定的时间(见第3节心跳相关的参数)没有收到数据,就会触发TCP层发起心调检测,从这里看可以看出TCP协议自身心跳的目的是检测异常链接,关闭链接,及释放资源。
而应用侧心调还有其它目的。具体见第4节。
2. TCP/IP协议如何实现心跳
未完,待续。。。。。。相关文章推荐
- netty实现tcp长连接和心跳检测
- TCP心跳 | TCP keepAlive
- socket Tcp编程笔记--心跳包的实现逻辑
- Netty心跳功能的实现
- Netty实现消息推送以及内部心跳机制
- 基于Netty UDP实现的简单心跳机制
- 手持机(SC160)TCP/IP实现API介绍
- Netty 4.0 实现心跳检测和断线重连
- TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
- TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
- TCP的长连接、短连接、keepalive及心跳
- 基于MINA实现server端心跳检测(KeepAliveFilter)
- TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
- 基于MINA实现server端心跳检测(KeepAliveFilter)
- 心跳机制tcp keepalive的讨论、应用及“断网”、"断电"检测的C代码实现(Windows环境下)
- netty的心跳检测实现
- 利用netty实现支持高并发的Tcp短连接接收服务
- Mina、Netty、Twisted一起学(一):实现简单的TCP服务器
- netty的心跳检测实现
- Netty 4.0 实现心跳检测和断线重连