簡體   English   中英

服務器如何區分來自單個客戶端的多個連接?

[英]How does a server distinguish multiple connections from a single client?

我正在對客戶端服務器套接字示例進行一些 C 編程。 假設服務器偵聽端口 80,客戶端偵聽端口 4321。元組用於區分多個連接。 但是服務器如何區分來自同一個客戶端的連接呢? 我的意思是肯定會有來自客戶端的多個應用程序訪問同一端口上的同一服務器。

誰能解釋一下?

謝謝

正常的答案是你一開始就沒有那樣做。

客戶端通常會使用未綁定的套接字連接到服務器,這意味着它沒有指定接收回復的本地端口。 服務器將使用bind來指定本地端口,然后它將在該端口上偵聽來自客戶端的連接。

當客戶端與未綁定的套接字連接時,TCP 堆棧將選擇一個當前未使用的端口號,並將其分配給該連接。 當它向服務器發送請求時,服務器將回復分配的端口號。 在客戶端,TCP 堆棧將查看數據包中的端口號,並將其路由到分配了該端口號的任何進程。

因此,客戶端不會使用端口 4321——它將使用堆棧分配給它的任何端口。 當同一台機器上的另一個進程連接到同一台服務器時,它也不會使用端口 4321——它將使用分配給它的另一個端口。 網絡堆棧負責確保每個堆棧都獲得一個唯一的端口號。

對於它的價值,TCP 端口分為三個范圍。 從 0 到 1023 是服務器的“眾所周知的”端口,例如 FTP、SMTP、HTTP、POP 等。這些將采取一些特殊的步驟來保護這些可能的位使用,並用於服務器舉個例子,一個典型的操作系統將需要某種管理員/根級別的權限來授予一個進程,然后它才能使用這些端口。

從 1024 到 49151 是注冊的端口號。 這些通常比眾所周知的端口更寬松地控制。 幾乎任何人都可以設置監聽它們,但 IANA 為特定端口維護一個特定用途的注冊表。 根據注冊表,端口 4321 用於遠程 whois 協議。

從 49152 到 65535 是動態端口——當客戶端連接到服務器時,它通常會得到這個范圍內的本地端口號。 當然,如果您願意(例如,為了測試),您可以編寫一個服務器並將其綁定到此范圍內的端口號。 當/如果你這樣做,堆棧將跟蹤它,因此它不會嘗試將該端口用於其他目的。

兩個客戶端不能使用同一個端口。 如果一個客戶端使用端口 4321,則另一個客戶端必須使用不同的端口。

連接由元組(協議、源 IP、源端口、目標 IP、目標端口)標識。 這就是您可以區分連接的方式。

兩個客戶端不能使用同一個端口,所以沒有實際意義。

但是,如果您要定義自己的協議,為什么不在客戶端和服務器之間來回傳遞 ClientID 呢? 客戶端可以使用無效的 client_id 發出請求,服務器可以在 ack 中分配一個。

TCP Listener 端口根據套接字區分連接,這是IP:port 的組合。

對於從同一台機器多次連接到同一台服務器的客戶端,它使用多個端口(通常是臨時端口)連接到同一個已知(偵聽器)端口。

然后,服務器迭代連接 sockets,這可能包括來自同一台機器甚至應用程序的多個連接。

當您使用 connect() TCP function 時,操作系統會自動完成客戶端端口綁定,因此您實際上不需要管理這些東西。

然后服務器通過 IP:ports 的不同組合向客戶端發送數據(可能仍在同一個應用程序中),因此它不會真正混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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