
我知道 NAT 表。我只想知道如果私有區域網路中的兩個客戶端想要在同一連接埠上下載完全相同的資源會發生什麼?換句話說,當資料包來自伺服器時,路由器如何決定哪個客戶端應該接收該資料包?
如果我沒記錯的話,來自伺服器的傳入封包具有路由器的目標IP 位址,該位址是公共的,對於兩者來說都是相同的,並且目的地的連接埠號碼在本例中也恰好相同。
路由器或伺服器中是否有任何機制可以偵測到這一點?或者這種行為一開始就可能發生嗎?
我搜尋過類似的問題這,這是有道理的,因為端口繁忙而引發錯誤,但我詢問的是兩個獨立的系統。
更新 :從評論中我發現我還不夠清楚,所以讓我用一個例子再說一次:
我只關心設備的“來源”連接埠。假設我有兩台筆記型電腦(192.168.2.10
和192.168.2.11
),它們都從網路上某處的同一伺服器下載相同的檔案。它們每個都有一個產生隨機連接埠的作業系統,因此來源 IP 和來源連接埠類似於:192.168.2.10:6321
和192.168.2.11:7132
。我認為在 NAT 中,路由器將設置它的(公共)IP 位址以及筆記型電腦的端口,因此如果家庭路由器的公共 IP 位址是65.82.23.32
,這兩個套件將分別獲取這些來源 IP 和來源端口:65.82.23.32:6321
和65.82.23.32:7132
。
現在,當回應返回時,路由器可以從連接埠號碼中找出哪個封包是針對哪台筆記型電腦的,對嗎?到目前為止,一切都很好。但是,如果兩台筆記型電腦無意或有意生成完全相同的來源端口,會發生什麼情況?例如:192.168.2.10:6000
和192.168.2.11:6000
。現在路由器將像以前一樣將其公共 IP 位址設定為來源 IP 位址,但現在如果它嘗試使用這些連接埠號,這些套件將具有完全相同的來源 IP 和來源連接埠號,例如 :65.82.23.32:6000
和65.82.23.32:6000
。
這就是我感到困惑的地方,當回應返回時,路由器如何決定哪個資料包是針對哪台筆記型電腦的?
在 @mfinni 的回答之後,我注意到這不是 PAT 的工作原理! NAT 裝置(此處為路由器)將為每台筆記型電腦指派唯一的連接埠(私人 IP 位址),然後使用這些唯一的連接埠傳送封包(例如7777
和7778
)。因此,當回應返回時,很明顯哪個資料包來自連接埠的哪個筆記型電腦,然後路由器將分別將這些65.82.23.32:7777
,轉換65.82.23.32:7778
為 -- 192.168.2.10:6000
> 192.168.2.11:6000
。
答案1
TCP 連線(HTTP 和許多其他協定的基礎)由 4 個參數唯一地(在給定時間點)定義:
- 本地IP
- 當地港口
- 遠端IP
- 遠端埠
即使您從同一台電腦同時發出相同請求兩次,即使兩個 IP 位址相同且目標連接埠相同,來源連接埠也會不同。
同樣,如果來自兩個設備的兩個請求通過相同 NAT 設備,則 NAT 設備將使用不同的來源連接埠。根據設備的不同,它可能會保留原始來源連接埠(並且僅在存在衝突時更改一個連接埠),或始終獨立於原始來源連接埠分配一個新來源連接埠。
然後,NAT 設備將在其轉換表中為每個連接保留一個映射,該映射指出外部連接(外部IP、外部來源連接埠、目標IP、目標連接埠)映射到內部連接(內部主機IP、內部主機來源連接埠、目標連接埠)。
答案2
NAT表知道每個用戶端上的來源連接埠是不同的,因此它不會意外地將錯誤的封包傳送到錯誤的內部用戶端。 NAT 設備還分配不同的出站端口,並且不同內部客戶端之間的出站端口不相同。
答案3
當您提到時,NAT
您可能實際上指的是NAPT
。這會更改 NAT 設備中的來源連接埠(至少在需要時)。因此來源連接埠將會改變。
例如iptables
MASQUERADE
在這種情況下進行 NAT 時,還需要“連接追蹤”,它只是追蹤哪個“外部連接埠”與哪個“內部客戶端和連接埠”相關。在 iptables 中你會經常看到RELATED,ESTABLISHED
使用的規則。您還會發現,如果重新啟動執行 NAPT 的路由器,它將丟棄所有連線。而沒有任何 NAT 的路由器通常只會恢復任何連線。 (假設它在客戶端超時之前完成重新啟動)
答案4
路由器不使用筆記型電腦在向 WAN 發出的傳出請求中產生的相同來源連接埠號,而是產生自己唯一的來源連接埠。路由器中的 NAT 表將laptop1:6000 轉換為publicip:N,並將laptop2:6000 轉換為publicip:M。然後,它知道將傳入封包路由到何處,流量從 Internet 到達哪個連接埠。