1.TCP保活的必要性
1)很多防火墙等对于空闲socket自动关闭
2)对于非正常断开
2.导致TCP断连的因素
如果网络正常
3.保活的两种方式:
1)应用层面的心跳机制
自定义心跳消息头
PS:
2)TCP协议自带的保活功能
打开
4.两种方式的优劣性
TCP
由应用自己实现的应用层的心跳
应用层心跳的好处我个人的理解有两点:
一是比较灵活
二是通用
应用层心跳的不好的地方也很显而易见
5.到底选用那种心跳方式?
优劣点第
6.类
keepalive
1)在代码里针对每个
除了
int keepAlive = 1; // 开启keepalive属性. 缺省值: 0(关闭)int keepIdle = 60; // 如果在60秒内没有任何数据交互,则进行探测. 缺省值:7200(s)int keepInterval = 5;// 探测时发探测包的时间间隔为5秒. 缺省值:75(s)int keepCount = 2; // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount));
使用时需要
ps: 忍不住吐槽一下, 网上大量毫不负责的转载, 千篇一律的搜索结果, 很多人根本都没进行过任何验证吧. 为了找这么个头文件都费了不小的事. 大多数帖子里的说的都是不可用的.
2)修改配置文件
我们可以用
#cat/proc/sys/net/ipv4/tcp_keepalive_time7200
#cat/proc/sys/net/ipv4/tcp_keepalive_intvl75
#cat/proc/sys/net/ipv4/tcp_keepalive_probes9
修改它们:
#echo60>/proc/sys/net/ipv4/tcp_keepalive_time
#echo5>/proc/sys/net/ipv4/tcp_keepalive_intvl
#echo3>/proc/sys/net/ipv4/tcp_keepalive_probes
链接推荐:
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
TCP Keepalive HOWTO
,让我们从自身的禁锢中放心地飞出去,重新审视自己,