1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
---
你問的非常深入,這些問題直指 NAT 實作的細節和內網穿透服務如何維持連接的機制。

### 1. 路由器的 NAT 表都是依循相同邏輯做管理嗎?

**基本邏輯是相同的,但具體實作會有差異。**

* **相同邏輯 (核心原理):**
* 所有執行 **SNAT (Source Network Address Translation)**,也就是將內部私有 IP 轉換為外部公共 IP 的路由器,都必須維護一個類似連接表(Connection Table)或 NAT 表的狀態機。
* 這個表的核心功能是:
1. **記錄出站連接:** 當內部設備發起一個新連接時,為其分配一個臨時的外部埠,並記錄 `(內部IP:內部埠 <-> 外部IP:外部埠)` 的映射關係。
2. **反向轉換入站回應:** 當外部服務發送回應時,根據目標外部 IP 和埠(即路由器為該連接分配的外部埠),查詢 NAT 表,找到對應的內部 IP 和埠,然後將回應轉發給正確的內部設備。
* 這種「有狀態」的設計是 NAT 能夠運作的基礎。

* **實作差異 (細節部分):**
* **連接超時時間 (Timeout):** 不同路由器製造商或韌體版本,對於 TCP、UDP 等不同協議的連接超時時間設定可能不同。例如,一個 TCP 連接如果長時間沒有數據傳輸,路由器可能在數分鐘後將其從 NAT 表中移除。
* **最大連接數:** 消費級路由器通常會限制其 NAT 表能同時維護的最大連接數。如果連接數過多,可能會導致新的連接無法建立或舊的連接被提前清除。
* **NAT 類型:** 路由器可以實作不同類型的 NAT (如 Full Cone NAT, Restricted Cone NAT, Port Restricted Cone NAT, Symmetric NAT)。這些類型會影響 NAT 表如何處理來自外部的、未經請求的流量,以及埠的重用方式。這會直接影響某些 P2P 應用和遊戲的連接成功率。
* **底層晶片和韌體優化:** 高階路由器可能有更強大的處理器和更優化的韌體來管理 NAT 表,提供更高的吞吐量和更大的連接數。

### 2. 通常多久時間會被判定「連結死了」而刪除連結表中該記錄?

這稱為 **NAT 超時 (NAT Timeout)**。具體的超時時間因協議類型和路由器配置而異,但常見的經驗法則是:

* **TCP 連接:**
* **已建立的活躍 TCP 連接 (Established):** 如果持續有數據傳輸,NAT 表中的記錄會保持活躍。如果長時間沒有數據(例如,數分鐘到數小時),路由器可能會將其標記為空閒並最終移除。常見的默認值可能在 **15 分鐘到 2 小時**之間。
* **半開連接 (SYN_SENT, SYN_RECV) 或關閉連接 (FIN_WAIT, TIME_WAIT):** 這些狀態的超時時間通常短得多,可能只有幾秒到一分鐘。
* **UDP 連接:**
* UDP 是無連接協議,路由器沒有像 TCP 那樣的會話狀態(如三次握手、四次揮手)。
* 對於 UDP,路由器會為每個 UDP 流分配一個臨時埠,並在一段時間內保持其在 NAT 表中。如果在這段時間內沒有收到來自外部的回應,該條目就會被移除。這個超時時間通常比 TCP 短,常見的默認值可能在 **30 秒到 5 分鐘**之間。
* **ICMP (Ping):**
* 通常超時時間更短,可能只有幾秒。

路由器會定期掃描 NAT 表,移除那些超時的或已終止的連接記錄,以釋放資源。

### 3. 穿透服務的「用戶端」如何達成「由內發起的通道」狀態?

是的,你的理解非常正確!**內網穿透服務(如 Ngrok)的客戶端正是透過這種方式來維持「由內發起的通道」狀態的。**

具體來說,它們會執行以下操作:

* **建立持久連接:** Ngrok 客戶端會向 Ngrok 服務器建立一個或多個**持久的 TCP 連接**。這些連接會嘗試保持活躍。
* **心跳包 (Keep-Alive Packets):** 為了防止路由器因為閒置超時而關閉連接,Ngrok 客戶端會定期向 Ngrok 服務器發送**「心跳包」**或 **「保持活躍封包 (Keep-Alive Packets)」**。
* 這些心跳包是小型的、無數據負載的封包,它們的作用就是告訴路由器:「嘿,這個連接還活著,別把它從 NAT 表中刪除!」
* 這些心跳包的頻率通常會設定為比路由器默認的 TCP 或 UDP 超時時間短,以確保連接在路由器端始終被視為活躍狀態。
* **自動重連:** 即使連接因為某些原因(例如網路瞬斷、路由器重啟、Ngrok 服務器維護、或者確實被路由器超時刪除)而斷開,Ngrok 客戶端也會具備**自動重連機制**。它會檢測到連接斷開,然後立即嘗試重新向 Ngrok 服務器發起新的連接。
* 每次成功重連,路由器都會為這個新的連接在 NAT 表中創建一個新的條目,從而再次建立起從內網到外網的「隧道」。

透過這種**「主動維持連接 + 自動重連」**的策略,內網穿透服務的客戶端能夠確保即使底層的 NAT 表條目會超時或連接會斷開,它們也能迅速地重建連接,從而為外部用戶提供看似持續可用的服務。這正是這種「精巧的實作技術」的核心所在。