NAT 那些事兒

2021-10-21 19:59:12 字數 2918 閱讀 8096

這篇文章並不是會講解太多很高深的 nat 知識,因為想要知道那些知識大可以直接去閱讀 《tcp/ip 協議詳解:卷一》。相對的,我只是在這裡記錄一些自己在了解到 nat 這種技術後的一些思考。

q1: 我們為什麼需要 nat 這項技術?為了緩解 ipv4 位址將要枯竭的問題。

q2: nat 的工作原理,以及它所帶來的的效果?

nat 實現了 ip 位址從區域網路中的私有位址到公網的 ip 的對映。

依據 nat 機制,我們可以在不需要全球唯一的公網 ip 的情況下,直接使用私有網路中的私有 ip 位址,通過 nat 路由的**來實現對網際網路上的資源和服務發起訪問。

對於 nat 機制的實現:

user host 的閘道器路由在**資料報(資料幀)時,記錄下包中所包含的:「源位址」 - 「目的位址」藉此形成「源」 到 「目的」的對映關係

拆解資料報,將 ip 資料報報頭中所記錄的源位址修改為,當前路由器的閘道器位址。

封裝資料報,效驗檢查資料報是否正確

**資料報

我的主機會通過檢索 local host 或者 dns server 請求查詢 bilibili 望著那的 ip 位址,最終得到目的位址為 「119.3.231.166」 (ps:ip 我修改過)

瀏覽器生成訪問請求資料報通過網絡卡傳送出去

nat 路由**後,再進過 n 個路由**到 bilibili server

server 傳回乙個資料報,經過 n 個路由**後到達我主機所在網段的閘道器路由 —— nat 路由

nat 在收到包後:

我的主機收到資料報,交給瀏覽器進行解析。

實現原理中重點在於 user host 所在的區域網的閘道器路由要能夠在**資料報時,記錄下」源「 與 「目的」的對映關係!

(世紀性的問題 ?)

q3: nat 機制能做到不出錯的對映 host 嗎?

在 q2 中我們已經簡單的介紹了 nat 的工作原理,這裡我們開始試著著手解決這個問題。

首先,必須要清楚的認識到 nat **機制的本質:

「就是 host 到 nat 路由的對映」。

nat -> ip 對映;

napt -> ip + port 對映

其次就是,host 到 nat 路由的對映一旦建立完成,nat 路由其實就已經相當於我們的 host 了(只是資料報**與接收上的)。

那麼,nat 路由是怎麼跟公網伺服器傳送資料的呢?

當然是,利用從 nat 路由的邏輯埠和物理埠(網絡卡)發出。

(ps:下面為了資料易於計算,將會把部分 全部 資料轉化為簡單的大小)

現在我們試著將 nat 路由的對映和 tcp 聯絡起來:

nat 路由**後的資料報,其 「源位址」 都是 nat 路由閘道器 ip 位址。

nat 路由也是小型計算機內有作業系統,那麼,其最多支援的埠號肯定不會超過 2^32 個,除去 0 ~ 1023 個已經被宣告專用的,剩餘的都可以用於埠**資料報。大概的估算,也就是 6000 (6 w)個埠

預設當前的 nat 路由只有繫結了乙個公網 ip

這裡我先假設 nat 路由記錄對映的關係是針對單個埠進行的記錄。(雖然確實就是這樣的?)

根據 tcp 四元組論,假如 nat 路由所建立其的 60000 個 tcp 連線都是對同一 ip::port 的連線,則此時 nat 無法在繼續建立這樣的連線

現在我們來看下,nat 路由如何向公網的一伺服器的固定埠建立起 6000 個 tcp 連線:

場景:家裡蹲大學 1w 名學生集體從校內網路訪問公網一網課**。

學生 host 啟動瀏覽器,瀏覽器隨機繫結到本機乙個埠號(1024 ~ 65535),向 網課ip::網課port 發起連線。

這裡我們人為的操縱下概率:

訪問這個網課**的前 60000 名同學都非常的幸運的通過了 nat 路由的對映。

如果後面繼續有人想要訪問這個**,

幸運的路人甲熟練的開啟筆記本、開啟瀏覽器、帥氣的輸入**,回車。

ta 瀏覽器繫結到 9527 埠。

資料報傳送,到達 nat 路由,此時 nat 路由所有埠都被占用。

結果,nat 路由檢索到這個包是 9527 埠,所以找到專門 9527 埠對映關係記錄表,新增進入這對新的對映關係。

然後,**。

這裡再假設,目標 server 也很好的沒有發現什麼異常,很自然的發了乙個包回來。到達了 nat 路由處:

好傢伙兒,nat 路由直接懵逼。。。

9527 埠上的記錄 ip 對映關係表中有兩組關係都符合,那這資料報我要轉給誰????

ok,nat 路由直接崩潰,除非有錯誤處理程式。

到這裡 q3 問題,我們就可以回答了:

在 nat 路由只繫結了 1 個公網 ip 位址的情況下,如果此區域網路下的使用者,當他們因為某些人類迷惑行為同時訪問到同一 ip 的**的 同一 port 時,

當 0 < user < 6w,資料報衝突概率從 0% 不斷上公升到 100%;

當 user >= 6w 時,100% 會出現 nat 失敗的情況。

回看 napt,它比 nat 具有更強的對映能力,

因為 napt 的對映關係,不僅僅包含 ip ,還包含 了 port !

簡單點分析:

如果 napt 採用每個 ip 為其分配乙個埠的模式工作,

那 napt 路由就算是在:

只繫結了乙個公網 ip

區域網中的使用者同時訪問同一 ip 同一 port 的情況下

只有當使用者滿 6w 才會發生資料報**衝突的問題。

(未完待續 ? )

關於NAT穿越的那些事兒

將一台閘道器裝置設為內部網路和外部網路的分界線,在這台閘道器裝置上一般會設定nat和防火牆功能。實現內外連線的方式,一般是內部主機發起連線,和外部伺服器或者主機進行連線,如果是部署在公網上的伺服器當然沒有問題,但是如果涉及到同樣部署在nat裝置內部的主機該如何實現主機互聯?這樣的應用有很多,比如當下...

鏈結那些事兒

鏈結,就是將不同部分的 和資料收集和組合成為乙個單一檔案的過程,這個檔案可被載入到儲存器中執行。鏈結可以執行於編譯時 compile time 也就是源 被翻譯成機器 時 eg.普通的鏈結器鏈結,以及靜態鏈結庫,由靜態鏈結器鏈結 也可以執行於載入時 例如動態鏈結庫的載入時鏈結 也可以執行於執行時 r...

指標那些事兒

1.野指標 也叫懸擺指標,迷失指標 野指標是導致bug的罪魁禍首之一。對指標呼叫delete後 釋放掉了它指向的記憶體,野指標還是指向原來的位址 如果沒有重新賦值就使用它,將導致難以預料的後果。因為此時操作野指標,它指向的記憶體位址可能已經分配給其他變數在使用了。所以指標在delete之後,如果不再...