1. 程式人生 > >一個IP能建立的最大連線數是多少?

一個IP能建立的最大連線數是多少?

在探討這個問題前,我們先假設一種經典的連線模型:
Client -> Load Balancer-> RealServer Pool

並且我們假設這裡使用NAT模式的負載均衡,在這種模式下:

1.負載均衡器只留給客戶端一個公網IP地址(VIP);
2.客戶端發來的請求都被負載均衡器端截,然後通過排程演算法轉發到RealServer Pool裡面的某臺伺服器;
3.這些RealServer都在一個私有網路裡面,對外不可見;
4.負載均衡器轉發請求到真實伺服器(RealServer)的時候同時做了NAT,真實伺服器看到的連線都是來自負載均衡器的(和真實伺服器在一個私有網路的IP)。

首先,我們從Client Side(Client->Load Balancer)來分析:
這端的連線都由SourceIP:SoucePort->DesIP:DesPort唯一標識,所以對我們來說,能支援的連線數僅僅受限於負載均衡器的記憶體數(連線數可以是65000+),因為DesIP和DesPort都是已知的唯一的(比如IP:80).

然後再從Server Side(Load Balancer->RealServer)來分析:
這端的連線數剛好相反,每個連線都由負載均衡器的IP(這裡稱MIP:Mapped IP)和隨機的埠進行標識。即: MIP:RandomPort -> RealServerIP:80
這樣,因為負載均衡器的埠也受限於TCP/IP的最大埠數64k(65536)限制,因此最多隻能建立64k的伺服器連線(server connnections).

由於瓶頸很可能就出現在伺服器端連線上,針對這種情況,各負載均衡器廠家是怎麼解決的呢?
1. NetScaler
我們首先來看NetScaler的解決辦法,NetScaler的解決辦法很簡單,增加MIP的個數,這樣最大的伺服器連線數將變成:
MaxServerConnections = 65536 * MIP數

2. F5
F5其實也使用了一樣的辦法,但是F5首先建立一個Source-NAT pool,然後在SNAT Pool裡面加入多個IP地址。這樣得到的最大連線數和NetScaler完全一樣:
SA:SP -> DA:DP
10.1.1.1:1024 -> 10.1.1.100:80
10.1.1.2:1024 -> 10.1.1.100:80
PS: 這裡10.1.1.1和10.1.1.2都在一個SNAT pool裡面。

上述情況都是理論計算值,真實環境下的最大連線數還受限於各種因素:
1. 每個連線都要耗費一定的資源,比如CPU、MEM,所以,真實值往往很難達到理論值;
2. 根據協議的不同,能達到的最大連線數也不一樣,比如HTTP/1.0連線的建立和關閉都非常快,而且瀏覽器對併發連線數有限制,所以,很難達到最大的理論值。HTTP/1.1支援流線技術,多個請求可以複用一個連線,這樣就大大減少了併發連線數。FTP或者telnet連線都是長連線,很容易達到最大值;
3. 很多裝置(比如NetScaler)在伺服器端都支援連線池(連線複用),裡面的連線都是長連線,一樣實現了HTTP/1.1裡面的流線技術,一個連線就可以處理多個客戶端連線。這樣除了減少連線資源,同時還減少了負載均衡器的其他資源開銷,同時減低了內網的頻寬;
4. 一些裝置(比如NetScaler的TCP-OFFLOAD)支援TCP解除安裝,僅僅把已經建立的連線發到伺服器端,而TCP的三次握手完全有負載均衡器接管,這樣,伺服器端的連線就成倍的減少。