关于操作系统TCP Keepalive功能使用的说明
Posted 平台人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于操作系统TCP Keepalive功能使用的说明相关的知识,希望对你有一定的参考价值。
问题描述
man手册中关于net的参数“tcp_keepidle”的含义:指定保持一个空闲TCP连接活动的时间长度,以半秒测量。客户发现他的应用在系统上生成的半连接在到达tcp_keepidle规定的时间后并没有被系统中断回收。
实验内容:telnet测试实验
实验环境:两个节点使用AIX7.1操作系统
实验<一>
1. 在节点 node1 改变 tcp_keepidle 的值 :
#no -p -o tcp_keepidle=60 ---->30秒
2.在节点 node2使用tcpdump命令trace IP 包:
#tcpdump -i en1 -l dst host node2 and src host node1
3.从 node2 telnet 到 node1,node1作为服务器
在这个测试中,我们可以看到当达到 tcp_keepidle规定的30秒后,node1发送了一个keepalive的测试包给node2来测试空闲连接。
实验<二>
1.在节点 node1 改变 tcp_keepidle 的值 :
#no -p -o tcp_keepidle=60 ---->30秒
2.在节点 node2使用tcpdump命令trace IP 包:
#tcpdump -i en1 -l dst host node2 and src host node1
3.从 node1 telnet 到 node2 ---->node1 做客户端
在这个测试中,我们可以看到当达到 tcp_keepidle规定的30秒后,node1并没有发送keepalive的测试包。
如何及时有效地检测到一方的非正常断开,一直有两种技术可以运用。一种是由TCP协议层实现的Keepalive,另一种是由应用层自己实现的心跳包。由于Keepalive功能一直存在争议,因此,并没有直接写入TCP/IP的协议中,但是各个操作系统基本都实现了这个功能,因此默认并不开启Keepalive功能。因此,如果要使用系统的keepalive功能,应用必须在建立socket连接时声明KEEPALIVE flag,否则此功能不生效。
可以用如下方法查看某一个socket连接是否声明了KEEPALIVE flag:
1. find the connection:
#netstat -Aan|grep 23
2. Write down the PCB/ADDR for each established connection (value in the first column).
3. check the socket information in kdb
#echo "sockinfo <PCB/ADDR> tcpcb" | kdb >sockinfo.out
经过进一步的检查,我发现telnet的服务器端软件创建socket时声明了KEEPALIVE flag, 而telnet客户端软件没有声明 KEEPALIVE flag. 因此才会出现之前的实验结果。另外,我还测试了ftp服务,服务器和客户端两端均使用了SO_KEEPALIVE功能,因此两端操作系统都会检查空闲TCP连接并予以回收。最后的结论就是,如果要使用操作系统的TCP keepalive回收功能,必须要求对应的服务器或客户端应用程序使用SO_KEEPALIVE参数加以声明才行。
关注平台人生 拓展人生平台
以上是关于关于操作系统TCP Keepalive功能使用的说明的主要内容,如果未能解决你的问题,请参考以下文章