標籤:linux netstat keepalive -o timers
在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的列,這一列就是代表著計時功能。
Timerkeepalive (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)
本文出自 “鄭小明的技術部落格” 部落格,謝絕轉載!
linux下netstat --timers / -o詳解及keepalive相關