关于操作系统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功能使用的说明的主要内容,如果未能解决你的问题,请参考以下文章

linux tcp keepalive 如何 设置 参数

Tcp协议的keepalive功能

关于WebSocket心跳的理解

TCP漫谈之keepalive

KeepAliveHttp--Keep-Alive及Tcp--Keepalive

关于Keepalive的那些事