假設我們有一個可以接受多個客戶端的服務器。首先,它必須創建一個套接字,然后將其與埠和 IP 系結,最后偵聽來自客戶端的連接請求。accept()與客戶端建立連接后,服務器會創建一個新的套接字來與特定客戶端進行通信。我的問題是客戶端是否要將其資料發送到它發送初始請求的同一個埠,如果不是,它如何知道將資料發送到哪里?
uj5u.com熱心網友回復:
套接字連接由 的元組唯一標識[Protocol, Local IP, Local Port, Peer IP, Peer Port]。
TCP服務器創建一個監聽用的元組插座[TCP, Listen IP, Listen Port, 0, 0]。當客戶端請求連接到服務器時,網路會將請求路由到指定的 IP/埠。接收設備然后將請求路由到匹配的偵聽套接字,與客戶端執行 3way 握手,并將其放入佇列中。稍后,當accept()被呼叫時,它從佇列中提取下一個掛起的客戶端,并回傳一個以 元組標識的新套接字[TCP, Listen IP, Listen Port, Client IP, Client Port]。因此,單個偵聽套接字可以接受來自不同客戶端 IP/埠組合的多個客戶端。
TCP 客戶端創建一個連接套接字,其元組為[TCP, Local IP, Local Port, 0, 0]. 當 3way 握手完成時,套接字的元組更新為[TCP, Local IP, Local Port, Server IP, Server Port]。因此,客戶端可以將不同的套接字連接到不同服務器 IP/埠組合的不同服務器。
所有后續的資料交換都使用這些元組。
從客戶端的連接套接字發出的資料將被發送到關聯的服務器 IP/埠,并存盤在接受的服務器套接字的緩沖區中,其元組與客戶端和服務器都匹配。
從服務器的偵聽套接字發出的資料將被忽略,因為沒有關聯的客戶端。
從接受的服務器套接字發出的資料將被發送到關聯的客戶端 IP/埠,并存盤在連接的客戶端套接字的緩沖區中,其元組與客戶端和服務器匹配。
uj5u.com熱心網友回復:
一般為每一種通信分配一個默認埠。作業系統可以保持打開或關閉它,可以檢查它。
假設對于 FTP 連接,有一個單獨的埠分配給握手,無論請求多少個新的 FTP 連接,所有新連接都將轉到同一個埠,一旦握手完成,資料交換將通過另一個埠完成, 即使我們不指定埠。如果網路管理器之前有埠串列條目,它將請求到相同的埠。
SSH 示例(如果您要求)
ssh -X <IP>
即使您不提及 port ,您的系統也知道要請求哪個埠,并且在服務器端總是有一些埠打開,誰將偵聽您的請求,并且根據您在握手時發送的資料,它會繼續偵聽或阻止您。
獎勵是您可以在服務器端打開您的自定義埠,該埠將偵聽您的請求。TCP 實作默認宣告哪個埠將用于哪種通信。
uj5u.com熱心網友回復:
客戶端使用源 IP 和埠連接到具有目標 IP 和埠的服務器。雙方接受完全相同的IP和埠后,繼續用于資料交換至建立連接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386857.html
上一篇:如何將輸出更改為等邊三角形數字?
