Tcp

伺服器如何找出要發送到的客戶端埠?

  • September 5, 2018

據我了解,這是客戶端發出連接請求時發生的情況:

  1. 伺服器將綁定到特定的埠號。埠號總是綁定到一個監聽程序。由於只有伺服器在監聽傳入的連接,我們不需要在客戶端綁定
  2. 伺服器將繼續偵聽該埠號。
  3. 客戶端將發送connect()請求。
  4. 伺服器將使用 接受請求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 查看數據包,它會為您標記所有數據。這是突出顯示的源埠(注意它在解碼的數據包中突出顯示,以及底部的十六進制轉儲):

Wireshark 顯示 TCP SYN 數據包

引用自:https://unix.stackexchange.com/questions/75011