Ps

netstat 中的非對稱 ESTABLISHED 會話

  • May 2, 2015

在第一台主機上,

root@xxx:~# netstat -natup | grep xxx
tcp        0      0 10.2.5.3:40740      xxx:10051   ESTABLISHED 1482/zabbix_proxy:

我們可以看到已經與遠端主機建立了連接。

root@xxx:~# ps -eo uid,pid,etime | grep 1482
     106  1482 18-17:10:17

連接已經建立了大約 18 天。當我 SSH 到遠端主機並執行時:

root@xxx:~# netstat -natup | grep 10.2.5.3

絕對沒有條目!

這怎麼可能?

首先,該etime欄位指示程序何時開始。這並不一定意味著連接在那個時間綁定到它。

接下來,也許正在使用一些網路地址轉換?如果是這樣,請grep提供遠端主機上的埠號:netstat -natup|grep 40740查看返回的內容。

如果第一台主機沒有發起流量,連接將愉快地永遠保持在“ESTABLISHED”狀態,直到本地程序關閉連接或遠端主機關閉連接。

現在想像一下主機之間的網路中斷;來自遠端主機的數據包無法到達第一台主機。在此中斷期間,遠端主機嘗試向第一台主機發送一些內容;超時是因為沒有收到來自第一台主機的 ACK 數據包。一段時間後,連接超時,遠端主機關閉連接。然而,第一台主機對另一台主機上發生的事情一無所知,因此連接仍處於“已建立”狀態。

如果遠端主機遇到電源故障並重新啟動,也會發生同樣的事情;沒有機會首先終止現有的網路連接。

為了防止這種情況,需要在套接字級別打開 tcp keepalive。這會導致主機之間定期交換保活數據包,以便即使沒有正常流量也可以檢測到網路中斷。

引用自:https://unix.stackexchange.com/questions/199792