簡體   English   中英

服務器套接字的工作原理是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM