「連接埠位址轉換 (PAT) 解決了當多個主機碰巧使用相同的來源連接埠號碼同時建立不同的外部連線時出現的衝突。然後,PAT 可以為連線分配來自某個主機的連接埠號碼。可用連接埠池,將此連接埠號碼插入來源連接埠欄位。
https://en.wikipedia.org/wiki/Network_address_translation
如果我們有 10 台高度可擴展的伺服器來接受數千個請求怎麼辦?連接埠耗盡似乎是一個非常基本的限制(64k),我們很容易達到。
業界如何處理此類場景?
答案1
歸根結底,NAT 實際上只是歸結為 NAT 裝置上的一個查找表,其中包含連接到何處的對應。然而,這些表條目是在每個會話基礎。
前任。如果我有一個主機在10.10.10.10,想要與互聯網上的伺服器通信8.8.8.8,透過我的互聯網網關,其公共IP是1.1.1.1,當這種通訊發生時,我的網路網關可能會創建一對看起來像這樣的條目:
來源 | 運動 | 目的地 | 港口 | 行動 |
---|---|---|---|---|
10.10.10.10 | 20000 | 8.8.8.8 | 80 | SNAT 10.10.10.10:20000 --> 1.1.1.1:40000 |
8.8.8.8 | 80 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000 --> 10.10.10.10:20000 |
雖然看起來可能是這樣1.1.1.1:40000現在該會話已被佔用,現在留下約 63999 個端口,這並不完全正確。由於這些條目是基於每個會話的,因此進行後續通信並建立如下表是完全合理的:
來源 | 運動 | 目的地 | 港口 | 行動 |
---|---|---|---|---|
10.10.10.10 | 20000 | 8.8.8.8 | 80 | SNAT 10.10.10.10:20000 --> 1.1.1.1:40000 |
8.8.8.8 | 80 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000 --> 10.10.10.10:20000 |
10.10.10.10 | 20001 | 8.8.8.8 | 81 | SNAT 10.10.10.10:20001 --> 1.1.1.1:40000 |
8.8.8.8 | 81 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000 --> 10.10.10.10:20001 |
10.10.10.10 | 20002 | 8.8.4.4 | 80 | SNAT 10.10.10.10:20002 --> 1.1.1.1:40000 |
8.8.4.4 | 80 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000 --> 10.10.10.10:20002 |
10.10.10.10 | 20003 | 8.8.4.4 | 81 | SNAT 10.10.10.10:20003 --> 1.1.1.1:40000 |
8.8.4.4 | 81 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000 --> 10.10.10.10:20003 |
因此,在公共介面(通常是您擔心 NAT 耗盡的地方)上,我們可以看到實際上有 4 個會話:
1.1.1.1:40000 --> 8.8.8.8:80
1.1.1.1:40000 --> 8.8.8.8:81
1.1.1.1:40000 --> 8.8.4.4:80
1.1.1.1:40000 --> 8.8.4.4:81
但這 4 個會話並不完全佔用 4 個端口,並且 NAT 設備確切地知道屬於這 4 個會話中任何一個的流量應路由到哪裡。
因此,雖然看起來有 64k 連接埠限制,但實際上更像是每個目標套接字 64k(有一些注意事項)。並非取之不盡,用之不竭,但肯定比純 64k 更具可擴展性。