Ps
netstat 中的非對稱 ESTABLISHED 會話
在第一台主機上,
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。這會導致主機之間定期交換保活數據包,以便即使沒有正常流量也可以檢測到網路中斷。