2015-10-20 33 views
2

我有很多(10萬)連接的移動設備,它們正在維護與服務器的打開連接。如果我對64k連接限制的理解是正確的,則每個客戶端IP不能超過64k(由於TCP/IP協議)連接到服務器的單個端口(由於客戶端的臨時端口範圍) 。64k連接神話和NAT翻譯

但大多數情況下,您處於這些設備通過使用NAT轉換地址的網絡提供商連接的環境中。 (例如,智能手機將不會有靜態IP地址)。

因此,在這種情況下,我的服務器將看到相同的IP地址,並且沒有保證源端口在2個不同的客戶端中不會相同。

我的問題可能是愚蠢的,但它是這樣的:如果我們將連接想象爲5元組(協議,服務器端口,服務器IP,客戶端IP,客戶端端口),我的服務器如何識別正確的連接情況?是否有失去連接或兩個不同客戶之間的衝突的風險?

回答

3

我的服務器將看到相同的IP地址,並且不保證源端口在2個不同的客戶端上不會相同[...]是否有丟失連接或衝突的風險?

不,這是路由器執行NAT的工作:將IP:端口組合保持在一端與另一端相連。

所以:

Client | IP | Src | <NAT> | IP | Src | Dest | Dst 
====================================================== 
1  | .1 | 42 | <-----> | .3 | 1 | Server | 80 
2  | .2 | 84 | <-----> | .3 | 2 | Server | 80 

鑑於兩個客戶端,與(源IP 10.0.0.1,源端口42)和(源IP 10.0.0.2,源端口84)希望在80端口連接到服務器,那麼NAT將通過給它們一個唯一的源端口(在上的那個那側)來將它們的IP:端口對轉換成在NAT(例如11.0.0.3)的其他(右側) NAT)。它會將這個轉換保留在內存中,以便能夠雙向發送數據包。

你會看到,在NAT(你的服務器發現有啥)的右側的元組是唯一的:

11.0.0.3:1 - Server:80 
11.0.0.3:2 - Server:80 

如果路由器確定對你的服務器可能的元組已經用盡了(所以在11.0.0.3:65535 - Server:80之後),它可能拒絕打開新的連接。

+0

好的。非常明確的答案。我認爲網絡提供商的NAT(主要用於移動網絡類型2G/3G/4G)可以輕鬆處理這個用例。 – jobou

+0

@jobou其中一個解決方案就是讓你的NAT在右側有多個IP地址。 :) ISPs可以做到這一點很好。 – CodeCaster