linux下netstat --timers / -o详解及keepalive相关

时间:2017-01-02 00:26:56   收藏:0   阅读:7936

  在linux查看网络连接数或者网络状态,我一般用netstat或者lsof这两种,netstat的话有个时间计时功能,里面涉及到不少tcp/ip协议的知识,今天就来说一说我理解的netstat计时功能。

netstat -altpno 或者 netstat -altpn --timers,看显示结果:

Proto Recv-Q Send-Q Local Address    Foreign Address   State  PID/Program name  Timer

可以看到显示的标题,多出了一个Timer的列,这一列就是代表着计时功能。

       Timer
keepalive   (576.47/0/0)  
<第一列>      <第二列>

里面的数据又分为两列。

下面来详细的介绍这两列的具体参数和含义:


第一列,一般有一下几种状态;

keepalive - #表示是keepalive的时间计时

on - #表示是重发(retransmission)的时间计时

off - #表示没有时间计时

timewait - #表示等待(timewait)时间计时



第二列,

(576.47/0/0) -> (a/b/c)

a - #计时时间值(当第一列为keepalive的时候,a代表keepalive计时时间;当第一列为on的时候,a代表重发(retransmission)的时间计时;当第一列为timewait的时候,a代表等待(timewait)的时间计时)

b - #已经产生的重发(retransmission)次数

c - #keepalive已经发送的探测(probe)包的次数




注:

  1、keepalive的最大时间值跟tcp_keepalive_time的值有关系,tcp_keepalive_time的值,linux默认为7200秒,即2小时,代表的意思为:建立连接后,如果7200秒内连接没有任何数据交互传输,那么服务器将发送探测(probe)包。这里的探测(probe)包也相当于心跳一样。


  2、探测(probe)包的相关内核参数跟tcp_keepalive_intvl和tcp_keepalive_probes有关系,tcp_keepalive_probes代表总共发送探测(probe)包的个数(默认为9个),tcp_keepalive_intvl代表发送一个探测(probe)包后,多少秒没有收到回复,则再发送个探测(probe)包,也代表了之前发送的探测(probe)包超时失效(默认为75秒)。再所有的探测(probe)包都发完之后还是没收到回应,那么服务器会主动端口这个连接(长连接)。所以一般如果第二列的c为0的话,a的范围在0 ~ 7200之间,7200为tcp_keepalive_time的值,比如keepalive (178.06/0/0);如果c不为0,但是不可能大于tcp_keepalive_probes的值的,那么a的范围在0 ~ 75, 75为tcp_keepalive_intvl的值。比如keepalive (18.06/0/2)。


  3、这里再说一下keepalive的工作原理

    若在一个给定连接上,7200秒之内无任何活动,服务器便向客户端发送一个探测段。(我们将在下面的例子中看到探测段的样子。)客户端主机必须是下列四种状态之一:

    1) 客户端主机依旧活跃(up)运行,并且从服务器可到达。从客户端TCP的正常响应,服务器知道对方仍然活跃。服务器的TCP为接下来的两小时复位存活定时器,如果在这两个小时到期之前,连接上发生应用程序的通信,则定时器重新为往下的两小时复位,并且接着交换数据。

    2) 客户端已经崩溃,或者已经关闭(down),或者正在重启过程中。在这两种情况下,它的TCP都不会响应。服务器没有收到对其发出探测的响应,并且在75秒之后超时。服务器将总共发送10个这样的探测,每个探测75秒。如果没有收到一个响应,它就认为客户端主机已经关闭并终止连接。

    3) 客户端曾经崩溃,但已经重启。这种情况下,服务器将会收到对其存活探测的响应,但该响应是一个复位,从而引起服务器对连接的终止。

    4) 客户端主机活跃运行,但从服务器不可到达。这与状态2类似,因为TCP无法区别它们两个。它所能表明的仅是未收到对其探测的回复。


  4、等待(timewait)时间计时,第二列的a值,最大为60,这里说一下为什么为60,这里存在一个MSL(Maximum Segment Lifetime)的概念,tcp如果在time_wait状态下,会保持两倍MSL的时间值,然后连接才会断开,当然存在time_wait这种状态的话,那么肯定是主动关闭tcp连接那一方,这个如果了解tcp的四次握手概念就知道是为啥了。RFC793定义了MSL为2分钟,Linux设置成了30s,所以linux系统上,time_wait的值最大为60s。所以第一列为timewait时,第二列只有a有值,b、c都为0,比如

timewait (48.32/0/0)。


  5、如果State列为CLOSE_WAIT状态是,Timer列多为off (0.00/0/0),这又是为何,因为CLOSE_WAIT的是属于被动关闭那一方,这个是没有超时(timeout)设置的,所以也就不用计时了。CLOSE_WAIT除非你杀进程,CLOSE_WAIT是不会自动消失的。一个CLOSE_WAIT会维持至少2个小时的时间。当然不消失意味着占着资源呢,这里就是占着FD。比如:on (2.28/5/2)




本文出自 “郑小明的技术博客” 博客,谢绝转载!

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!