UNIX编程专题-TCP连接探测详解
发布时间:2020-12-15 16:41:55 所属栏目:安全 来源:网络整理
导读:此问题在面试中经常出现 为什么需要TCP连接探测保活? 对于某端的非正常断开(如突然断电、网络故障、服务器突然崩溃等) ,tcp连接的另一端 并不能检测到 . 为了回收资源 , 必须提供一种检测机制 . 很多防火墙对于scoket会检测,若是长时间处于空闲状态,可
此问题在面试中经常出现 为什么需要TCP连接探测保活?
方案1:设置SO_KEEPALIVE套接字选项给一个TCP套接字设置保持存活选项。如果keepalivetime小时内在该套接字的任意方向都没有数据的交换,则TCP就自动给对端发送一个保持存活探测分节(keep-alive probe)。这是一个对端必须响应的TCP分节,导致三种情况
此选项的功用是检测对端主机是否崩溃或变得不可达。如果对端进程崩溃,它的tcp将跨连接发送一个FIN,这可以通过select很容易检测到
使用方法:(类UNIX中) 在代码里针对每个socket进行单独设定,使用起来灵活. 除了keepAlive开关,还有keepIdle,keepInterval,keepCount3个属性,使用简单,如下: 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,TCP_KEEPINTVL,(void*)&keepInterval,sizeof(keepInterval)); setsockopt(s,TCP_KEEPCNT,(void*)&keepCount,sizeof(keepCount));使用时需要 #include<netinet/tcp.h>, 否则 SOL_TCP 和 TCP_KEEPIDLE 等 3 个宏找不到 . 修改配置文件,对整个系统所有的socket有效. 我们可以用cat命令查看到系统中这几个默认的值. #cat /proc/sys/net/ipv4/tcp_keepalive_time 7200 #cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75 #cat /proc/sys/net/ipv4/tcp_keepalive_probes 9 修改它们: #echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time #echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl #echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes 方案2:自己在应用层实现心跳机制自定义心跳消息结构,具体是服务器端还是客户端发送心跳包,看具体情况,另一端接收心跳信息后也要回应,逻辑上来说和设置SO_KEEPALIVE后tcp自带的探测过程相似。
方案3:利用第三方软件来实现心跳机制(原理其实和上述类似,只是我们从编码的角度出发)
不同方案间的比较:tcp协议自带心跳的优势和劣势:
应用层实现的心跳机制优势额劣势: 优势:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |