後端自學之路《基礎知識》第三篇:netstat -ano 各屬性含義 (轉!)

原文鏈接:https://www.jianshu.com/p/42af752082ab

通信協議,本地外部地址,狀態轉移和PID

 

通過觀察發現下面幾個問題:

  1.協議自然不用說,是網絡傳輸協議,類型屬於http或者https。那麼本地地址,外部地址,狀態以及PID的意思是什麼呢?

  2.這幾者之間的相關聯繫又是什麼呢?

  3.0.0.0.0和127.0.0.1的區別是什麼?

  4.同一本地地址不同端口對應相同外部地址?

  5.同一本地地址相同端口對飲不同外部地址?

  6.不同行相同PID?

 

1、本地地址,外部地址,狀態以及PID的意思是什麼?

網絡連接是有2方參與,自己就是“內部地址”,別人就是“外部地址”,就這麼簡潔。

  再舉個例子,你用瀏覽器打開百度時,自己的 IP 地址就是內部地址了,也叫“本地地址”,百度服務器的IP就是外部地址,也就“遠程地址”。

  狀態:TCP狀態轉移

  TCP協議規定,對於已經建立的連接,網絡雙方要進行四次握手才能成功斷開連接,如果缺少了其中某個步驟,將會使連接處於假死狀態,連接本身佔用的資源不會被釋放。網絡服務器程序要同時管理大量連接,所以很有必要保證無用連接完全斷開,否則大量僵死的連接會浪費許多服務器資源。在衆多TCP狀態中,最值得注意的狀態有兩個:CLOSE_WAIT和TIME_WAIT。

①LISTENING狀態

  FTP服務啓動後首先處於偵聽(LISTENING)狀態。

②ESTABLISHED狀態

  ESTABLISHED的意思是建立連接。表示兩臺機器正在通信。

③CLOSE_WAIT

 對方主動關閉連接或者網絡異常導致連接中斷,這時我方的狀態會變成CLOSE_WAIT 此時我方要調用close()來使得連接正確關閉

④TIME_WAIT

  我方主動調用close()斷開連接,收到對方確認後狀態變爲TIME_WAIT。TCP協議規定TIME_WAIT狀態會一直持續2MSL(即兩倍的分段最大生存期),以此來確保舊的連接狀態不會對新連接產生影響。處於TIME_WAIT狀態的連接佔用的資源不會被內核釋放,所以作爲服務器,在可能的情況下,儘量不要主動斷開連接,以減少TIME_WAIT狀態造成的資源浪費。

  目前有一種避免TIME_WAIT資源浪費的方法,就是關閉socket的LINGER選項。但這種做法是TCP協議不推薦使用的,在某些情況下這個操作可能會帶來錯誤。

  Process Identifier(進程控制符)簡稱PID,PID後面的數字就是各進程的身份標識編號,程序一運行系統就會自動分配給進程一個獨一無二的PID。進程中止後PID被系統回收,可能會被繼續分配給新運行的程序。PID一列代表了各進程的進程ID,也就是說,PID就是各進程的身份標識。

2、協議,本地地址,外部地址,狀態以及PID之間的聯繫

舉個通俗的例子來說,當你手機上的王者榮耀程序和騰訊的遊戲服務器進行網絡傳輸時,手機開放192.168.230.123本機地址,騰訊的遊戲服務器開放192.168.231.123外部地址,比如在查看遊戲戰績時,192.168.230.123:666和192.168.231.123:666進行通信,此時這個活動有唯一PID,狀態可能是ESTABLISHED,協議可能是TCP或者UDP。

3、0.0.0.0和127.0.0.1的區別是什麼

嚴格說來,0.0.0.0已經不是一個真正意義上的IP地址了。它表示的是這樣一個集合:所有不清楚的主機和目的網絡。這裏的“不清楚”是指在本機的路由表裏沒有特定條目指明如何到達。對本機來說,它就是一個“收容所”,所有不認識的“三無”人員,一律送進去。如果你在網絡設置中設置了缺省網關,那麼Windows系統會自動產生一個目的地址爲0.0.0.0的缺省路由。

  本機地址,主要用於測試。用漢語表示,就是“我自己”。在Windows系統中,這個地址有一個別名“Localhost”。尋址這樣一個地址,是不能把它發到網絡接口的。除非出錯,否則在傳輸介質上永遠不應該出現目的地址爲“127.0.0.1”的數據包。

  127.0.0.1 是一個環回地址。並不表示“本機”。0.0.0.0纔是真正表示“本網絡中的本機”。

在實際應用中,一般我們在服務端綁定端口的時候可以選擇綁定到0.0.0.0,這樣我的服務訪問方就可以通過我的多個ip地址訪問我的服務。

  比如我有一臺服務器,一個外放地址A,一個內網地址B,如果我綁定的端口指定了0.0.0.0,那麼通過內網地址或外網地址都可以訪問我的應用。但是如果我之綁定了內網地址,那麼通過外網地址就不能訪問。 所以如果綁定0.0.0.0,也有一定安全隱患,對於只需要內網訪問的服務,可以只綁定內網地址。

4.同一本地地址不同端口對應相同外部地址?

這種多對一的關係,代表着本地的多個服務和一個外部的單個服務進行通信。

5.同一本地地址相同端口對飲不同外部地址?

這種一對多的關係,代表着本地的單個服務和多個外部地址的的服務進行通信。

6.不同行相同PID?

其實第1個問題中就包含了答案:進程中止後PID被系統回收,可能會被繼續分配給新運行的程序。老的網絡通信終結,回收PID,當新的網絡通信建立時, 重新分配PID。所以會出現不用記錄,不同PID的情況。

7.爲什麼有的時候兩個地址的ip都是一樣的呢(比如:127.0.0.1)?

這個連接是自己連接到自己的,我們的程序是可以自己機器連接到自己的機器的,比如你開了代理服務器然後自己瀏覽器連接到代理服務器上,另一個例子就是 vscode 啓動一種程序來調試,vscode虛擬環境會開一個端口,然後vscode會連接上去,這時候本地地址和外部地址都是你的機器的 IP 。

 

轉自地址:https://www.jianshu.com/p/42af752082ab

如有侵權望告知!!!


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章