[英]How exactly does a Server Socket work?
服務器套接字的工作原理是什么? 當我創建一個java服務器套接字並在端口1234接受連接時。服務器是否實際使用端口1234用於所有客戶端? 我已經讀過,當您編寫網絡服務器時,套接字實際上會在接受連接后打開另一個端口。
這是真的? 如果是這樣,為什么我沒有在netstat中看到它? 我看到很多像這樣的連接
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:97.37.134.95:39236 ESTABLISHED
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:89.204.153.101:26117 ESTABLISHED
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:195.240.16.70:26193 ESTABLISHED
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:80.187.98.116:15012 ESTABLISHED
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:218.78.248.190:30794 ESTABLISHED
所以他們真的都在1234連接到我的服務器嗎? 如果是這樣,這是不是意味着您的服務器將能夠接受無限數量的連接?
所以他們真的都在1234連接到我的服務器嗎?
是
如果是這樣,這是不是意味着您的服務器將能夠接受無限數量的連接?
您可以擁有2 ^ 32-2-1(IP4)地址(保留一個可以在同一網絡上擁有另一台主機)和2 ^ 16個遠程套接字端口。 這很多,但不是無限的。 無論如何,你之前會耗盡內存。
TCP / IP套接字由元組(本地地址,本地端口,遠程地址,遠程端口)唯一標識。
這將提供非常多的套接字,但不是無限的。
是的,你基本上是對的。
服務器正在偵聽某個端口(您設置的端口),但是當您接受連接時,它將歸屬新的連接套接字號。
如果您沒有使用netstat看到連接的套接字,可能是因為您沒有使用正確的選項調用它。 您應該在服務器端口上有一個LISTEN連接,並且每個活動遠程連接都有一個ESTABLISHED連接和一個分配的本地端口。 您還可以使用TIME WAIT狀態保留一些終止連接(端接不良)。
下面是我系統當前狀態的一些摘錄(在Linux上使用netstat -anlp
)
tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN 27002/rdpproxy
tcp 0 0 10.10.4.185:3389 10.10.4.13:36725 ESTABLISHED 27233/rdpproxy
服務器是10.10.4.185,正在偵聽端口3389.允許任何遠程IP和遠程端口連接。
第二行顯示連接的會話。 遠程地址是10.10.4.13,並為此地址保留端口36725。 因此,您可以從10.10.4.185(成千上萬)開始大量連接,而更多來自其他系統。
並且,不,這並不意味着您的服務器將能夠接受無限數量的連接,您的系統可能會耗盡資源,並且無法在該限制之前打開新連接。
是的,服務器可以接受單個端口上的任意數量的連接。 這是服務器和客戶端套接字之間的區別,客戶端套接字每個端口只能有一個連接。
這不是無限的。 有一個限制。 在基於Unix的操作系統上, ulimit
命令將告訴您進程可以擁有的“打開文件”的最大數量,並且還允許您更改它。 如果超出此限制,您將開始看到與“打開的文件太多”相關的IOExceptions。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.