多個客戶端如何同時連接到服務器上的一個端口,比如80?(譯)


多個客戶端如何同時連接到服務器上的一個端口,比如80?(譯)

 

原文:How do multiple clients connect simultaneously to one port, say 80, on a server? [duplicate]

 

 

平時我們使用ServerSocket指定了某個端口(例如8080),然后多個客戶端連接上socket之后就都用這個8080端口和服務器端通訊。或者http服務器使用80端口也是和多個瀏覽器進行連接通訊。為什么可以這樣呢?操作系統的進程在同個端口的多個連接是如何進行分辨的?


 

譯文:

我們這里講Socket連接:

1. 端口只是一個數字辨識,不是真正的物理端口; 

2. 一個Socket連接的主鍵(即不同socket之間的區分)是由一個五元組{SRC-IP, SRC-PORT, DEST-IP, DEST-PORT, PROTOCOL}組成,即{源地址,源端口,目標地址,目標端口,協議}組成,那些說四元組不包含協議的說法是錯誤的。 

3. 一個進程可以擁有多個socket連接。

例子一、兩個客戶端連接在同個服務器的同個端口80,即有兩個socket連接: 

- socket1 {SRC-A, 100, DEST-X,80, TCP} 

- socket2{SRC-B, 100, DEST-X,80, TCP} 

主機A和主機B的地址不同,兩台主機同時連接到服務器X的80端口。服務器要怎么處理這個連接是它的事,我們要理解的是為什么一個主機同個端口能監聽多個客戶端Socket連接。

解釋: 

1. 是因為兩個客戶端的IP不同,服務器能識別出不同的Socket; 

2. 即使IP地址相同,端口不同,服務器也能夠分辨; 

3. 只要服務器知道收到的請求和哪個socket相關,那么它就能使用這個socket正確地回復那個客戶端; 

4. 如果對於不同的socket需要不同的端口,那么不僅僅浪費服務器資源,而且每次客戶端連接上serverSocket之后還要另外分配新的端口和客戶端通信。沒必要。

例子二、不同的進程可以監聽同一個端口。

因此在服務器的兩個使用不同協議的進程可以監聽同一個端口。

如果一個socket的辨識只是四元組不包括協議{SRC-IP, SRC-PORT, DEST-IP, DEST-PORT},那么不同進程是不可能同時監聽同一個端口的。沒有協議的話一個客戶端連接到同一台某個有兩個進程監聽端口的服務器,那么就沒有什么機制可以確定客戶端是要連接哪一個進程了。

操作系統(特別是UNIX)中,子進程能夠繼承父進程的所有文件描述File-descriptors (FD),因此父進程A中監聽着的所有socket,也可以被進程的所有子進程A1,A2監聽。但是不同進程B是不能監聽同一個端口的。


 

個人理解:

1 問題:多個客戶端如何同時連接到服務器上的一個端口,比如80?

答:服務器和不同的客戶端進行通信,是通過80端口進行通信的。一個套接字是有五元組的{SRC-IP, SRC-PORT, DEST-IP, DEST-PORT, PROTOCOL},服務端監聽80端口號,收到連接請求后,根據客戶端的ip和端口號+服務端IP和80端口號+協議創建套接字,然后可以創建一個線程或一個協程通過剛才創建的套接字來和客戶端通信。

2 問題:多個客戶端同時連接到服務器上的一個端口(比如80),服務器是否會新起另一個端口進行通信?

答:服務器不會新起端口。服務器的80端口一直負責監聽客戶端的請求,如果有客戶端請求,服務器始終使用相同的初試套接字來響應(不需要分配另一個服務器端口),接着創建新的套接字(根據五元組),然后創建一個線程或一個協程通過剛才新創建的套接字來和客戶端通信。所以服務器從頭到尾只占用了一個80端口進行監聽和通信。

3 問題:如果有十萬個客戶端同時連接服務器,一個80端口是否能容納這么多客戶端連接進行交互?

答:一個80端口是否能容納和這么多客戶端交互,這就是機器性能和程序性能的問題了。


 

參考:

為什么多個客戶端可以連接服務器的同個端口?

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM