TCP长连接中可能出现的问题
1. 很多防火墙路由器等对于空闲socket自动关闭
2. 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制.
于是,就有了心跳(HeartBeat)机制。
心跳机制的两种实现方案
目前而言,有两种方式实现TCP的保活(业内现状是IM方面几乎都采用第一种)
1. 应用层协议自己实现的心跳机制
很多应用层协议都有HeartBeat机制,由应用自己实现的应用层的心跳, 为心跳消息额外定义一个消息类型。通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。
2. TCP协议支持的心跳机制Keepalive
打开TCP协议已有的SO_KEEPALIVE选项. 一般实现在服务器侧,客户端被动响应前面一篇博客有具体介绍,这里就不多讲了。
TCP Keepalive和应用层HeartBeat优缺点
1. TCP协议的Keepalive
优点:
系统内核完全替上层应用自动给做好了,内核层面计时器相比上层应用,更为高效
上层应用只需要处理数据收发、连接异常通知即可。
使用起来简单, 减少了应用层代码的复杂度. 也会更节省流量, 因为应用层的数据传输到TCP协议层时都会被加上额外的包头包尾. 由TCP协议提供的检活, 其发的探测包, 理论上实现的会更精妙, 耗费更少的流量.。
缺点:
第一点,keepAlive只能检测连接存活,而不能检测连接可用,比如某台服务器因为某些原因导致负载超高,CPU满了,无法响应任何业务请求,但是使用 TC