我在這個 netstat 輸出中發現了一些奇怪的東西。輸出是netstat -a -n -o -p TCP
在 win 7 上使用指令取得的。
Proto Local Address Foreign Address State PID
TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808
TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808
請注意這兩行。本機位址和外部位址都是localhost。但連接埠是如何配對的呢?兩個55486
端口中55487
哪一個是伺服器端口,哪一個是客戶端端口?
據我了解,該local-address
列表示 TCP 連線的客戶端,該foreign-adress
列表示伺服器端。從這個輸出看來,同一個連接埠充當兩個客戶端和伺服器.
我不明白TCP怎麼可能做到這一點?
答案1
線:TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808
表示客戶端正在連接到伺服器的 55487 端口,而客戶端使用端口 55486。
線: TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808
表示伺服器正在連接埠 55486 上從 55487 連線回客戶端。
TCP 需要「3 次握手」來建立客戶端和伺服器之間的連線。
客戶端連接到伺服器(3 次握手的第 1 部分)。伺服器回應確認連線(第 2 部分)。客戶端以自己的確認來回應確認(第 3 部分)。
TL;DR - 用戶端通常使用隨機連接埠連接到具有特定連接埠的伺服器。伺服器使用隨機連接埠響應該機器。客戶端和伺服器是不是在同一個連接埠上。
答案2
我不太清楚你現在明白了多少,所以請容許我說得有點迂腐。
顯然你了解客戶端和伺服器的概念,所以你寫的讓我感到驚訝,“該Local Address
列表示 TCP 連接的客戶端,該Foreign Address
列表示伺服器端。”這是錯誤的;該Local Address
列表示當地的TCP 連線的一側,該Foreign Address
列表示外國的(或者偏僻的) 邊。換句話說,該Local Address
列表示進程所使用的 (TCP) 套接字在你的電腦正在使用(即您的電腦所使用的套接字)擁有),此Foreign Address
列表示本地套接字連接到的套接字。正如您所理解的,電腦上的進程可以充當伺服器,因此本地套接字可以是伺服器套接字 - 然後相應的客戶端套接字將被列為「外部」。
當電腦上的客戶端進程連接到電腦上的伺服器進程時,事情開始變得混亂。現在,這個連接代表兩個本地套接字——並netstat
為每個套接字報告一行;一種將客戶端顯示為本地,將伺服器顯示為外國(即使它確實是本地套接字),另一種則相反。
你的情況有點令人困惑。當然,您的jetty伺服器(進程5808)正在創建套接字並接受它們上的連接——這就是伺服器所做的事情。但它同時創造了許多套接字。 (它們必然位於不同的連接埠號碼上;作業系統不允許具有相同協定和連接埠號碼的多個套接字共存。)並且它似乎使用隨機(作業系統分配的)連接埠號碼。例如,正如您所指出的,它正在監聽連接埠55484。
如果仔細檢查netstat
輸出,您將看到本機進程 184 使用連接埠 8081 上的套接字,具有到進程 5808/連接埠 55482 的連線。
我覺得很奇怪的部分是進程 5808 已連接對自己在其中幾個插座上。因此,您有多個 TCP 連接,其中兩個套接字都保留,不僅在同一主機上,而且在同一個過程中。我認為我們無法確定哪一端是客戶端,哪一端是伺服器。我實際上猜測較低的連接埠號碼更有可能是伺服器,但這只是一個猜測。
答案3
這並不是什麼不尋常的情況。127.0.0.1
是您的程式偵聽的有效 IP 位址。程式可以監聽這個位址。程式也可以連接到該位址。這符合客戶端-伺服器架構。你有客戶端,你有伺服器。它們可以位於不同的電腦上,但同時它們可以位於一台電腦上。
例如,當您使用 Google 網站時,您的電腦是用戶端,而 Google 的網站伺服器是伺服器。您的電腦與 Google 伺服器之間存在連線。
您可以在電腦上執行自己的 Web 伺服器並在介面上進行偵聽127.0.0.1
。開啟瀏覽器並輸入127.0.0.1
- 結果您將看到來自網頁伺服器的網頁。在這種情況下netstat
會表現出同樣的事情。
回答你的問題:
從這個輸出看來,同一個連接埠既充當客戶端又充當伺服器。
不。注意事項-它才不是說
TCP 127.0.0.1:55486 127.0.0.1:55486 ESTABLISHED 5808
它說:
TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808
TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808
這確實有道理。