Tcp
伺服器如何找出要發送到的客戶端埠?
據我了解,這是客戶端發出連接請求時發生的情況:
- 伺服器將綁定到特定的埠號。埠號總是綁定到一個監聽程序。由於只有伺服器在監聽傳入的連接,我們不需要在客戶端綁定
- 伺服器將繼續偵聽該埠號。
- 客戶端將發送
connect()
請求。- 伺服器將使用 接受請求
accept()
。服務端接受客戶端請求後,核心會為服務端分配一個隨機埠號,用於進一步send()
和receive()
監聽新連接鑑於所有這些,伺服器如何找出客戶端正在接收的埠?我知道客戶端將發送帶有源埠和目標埠的 TCP 段,因此伺服器將使用該段的源埠作為其目標埠,但是伺服器呼叫什麼函式來查找該埠?是
accept()
嗎?
它是數據包中 TCP(或 UDP 等)標頭的一部分。所以伺服器發現是因為客戶端告訴它的。這類似於它如何找出客戶端的 IP 地址(它是 IP 標頭的一部分)。
例如,每個 TCP 數據包都包含一個 IP 頭(帶有源 IP、目標 IP 和協議)
$$ TCP $$, 至少)。然後是一個 TCP 標頭(帶有源埠和目標埠,以及更多)。 當核心接收到遠端 IP 為 10.11.12.13(在 IP 標頭中)和遠端埠為 12345(在 TCP 標頭中)的 SYN 數據包(TCP 連接的開始)時,它就會知道遠端 IP 和埠. 它發回一個 SYN|ACK。如果它收到一個 ACK,則
listen
呼叫返回一個為該連接設置的新套接字。一個 TCP 套接字由四個值(遠端 IP、本地 IP、遠端埠、本地埠)唯一標識。您可以有多個連接/套接字,只要其中至少一個不同。
通常,所有到伺服器程序的連接的本地埠和本地 IP 都是相同的(例如,所有到 sshd 的連接都在 local-ip:22 上)。如果一台遠端機器進行多個連接,每個連接都將使用不同的遠端埠。因此,除了遠端埠之外的所有內容都將相同,但這很好——四個中只有一個必須不同。
您可以使案例如wirehsark 查看數據包,它會為您標記所有數據。這是突出顯示的源埠(注意它在解碼的數據包中突出顯示,以及底部的十六進制轉儲):