linux下netstat --timers / -o詳解及keepalive相關

來源:互聯網
上載者:User

標籤: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相關

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.