天天看點

【網絡】内網通路外網和外網通路内網的原理

公有 IP 和私有 IP 的差別

首先,我們需要了解一下什麼是公有 IP 和私有 IP ?

公有位址(Public address):由 Inter NIC(Internet Network Information Center 網際網路資訊中心)負責。這些 IP 位址配置設定給注冊并向Inter NIC提出申請的組織機構,公有 IP 全球唯一,通過它直接通路網際網路(直接能上網)。

私有位址(Private address):屬于非注冊位址,專門為組織機構内部使用,說白了,私有 IP 不能直接上網。

而我們平時通過營運商(電信、移動、聯通寬帶等)上網,家裡面通過路由器分出來的 IP 都是私有 IP(區域網路 IP),大家可能會疑問,我們可以上網啊,怎麼會是私有 IP 呢?

租用(申請)公有 IP 是需要錢的。 營運商買了一些公有 IP,然後通過這些公有 IP 分出來,再分給一個一個的使用者使用。這個過程有點類似于,我們去安裝了寬度,通過路由器分出幾個 IP,讓好幾個人都能上網,當然營運商通過公有 IP 分出來的過程肯定比這個複雜多了。是以,我們平時上網用的 IP 是私有 IP,真正擁有公有 IP 的是營運商(當然,我們可以租用一個公有 IP )。是以,A 家庭的區域網路 IP 和 B 家庭的區域網路 IP 相同很正常,但是,最終 A 和 B 能上網(資料走出去)還是通過營運商的公有 IP,畢竟,公有 IP 的資源有限,這一片區域的使用者使用的很有可能(實際上就是這樣的)是同一個公有 IP,這樣的話,又回到前面的問題,假如 A 和 B 的區域網路 IP 相同(192.168.31.11),當他們同時通路百度伺服器的時候,百度伺服器如何區分哪個是 A,哪個是 B 呢?

假如設A 和 B 的區域網路 IP 相同(192.168.31.11),當他們同時通路百度伺服器的時候,百度伺服器如何區分哪個是 A,哪個是 B 呢?

解決方案:端口映射

什麼是端口映射?

​​端口映射​​是 NAT 的一種,它将外網主機的 IP 位址的一個端口映射到内網中一台機器,提供相應的服務。當使用者通路該 IP 的這個端口時,伺服器自動将請求映射到對應區域網路内部的機器上。

現在市場上的家庭路由器都具備 NAT 功能,也可以實作端口映射。下圖為小米路由器的端口映射設定圖:

【網絡】内網通路外網和外網通路内網的原理

我們平時經過路由器,通過寬帶,最終去到營運商那邊,資料是從營運商出去,最終資料是回到營運商那邊,營運商再把資料發送到使用者的電腦。

路由器,至少有兩個端口:WAN 口和 LAN 口。

WAN:接外部 IP 位址用,通常指的是出口,轉發來自内部 LAN 接口的 IP 資料包,這個口的 IP 是唯一的。

LAN:接内部 IP 位址用,LAN 内部是交換機。

這裡,我們簡化這個過程,我們把營運商當做一個 NAT 裝置。

【網絡】内網通路外網和外網通路内網的原理

A 電腦的 IP 是區域網路 IP(192.168.31.11),這個 IP(192.168.31.11)是從路由器的 lan口配置設定的。

當我們上百度的時候,經過路由器的 wan口,進行相應的IP、端口轉化:192.168.31.11:80 -> 10.221.0.24:8080,是以,從 wan口出去的位址為:10.221.0.24:8080。

【網絡】内網通路外網和外網通路内網的原理

最後,經過營運商,營運商那邊會做相應的端口映射(而且是動态端口映射),子網 IP(10.221.0.24:8080)轉化為公網IP(128.0.0.1:8888),通過這個公網 IP 去通路百度伺服器

【網絡】内網通路外網和外網通路内網的原理

同理,B 的過程也是一樣。通過這樣的層層端口映射,最終保證位址(IP + 端口)的唯一性。A 和 B 通路百度伺服器,盡管它們的區域網路 IP 是一樣的,但是最終它們通路百度的位址(IP + 端口)是唯一的,是以,百度伺服器回複時,原路傳回時能夠區分到底給誰回。

如何讓外網能夠通路自己寫的網絡程式(伺服器)

首先,我們需要在營運商那邊申請(租用)一個公有 IP (長城寬帶一年需要 2000 元左右),假如這個公有 IP 為:128.0.0.123。

假如,我們寫的伺服器如下:

【網絡】内網通路外網和外網通路内網的原理

接着,找個 NAT 裝置進行相應的端口映射,家庭路由器都有這個功能。這裡以小米路由器為例:

【網絡】内網通路外網和外網通路内網的原理

映射關系如下:

【網絡】内網通路外網和外網通路内網的原理

最後,其他人寫用戶端程式時(電腦能上外網),隻要指定目的 IP 位址為 128.0.0.123,端口為 8888,通過這個位址,就能找到192.168.31.248:8080,因為這兩者已經建立好映射,如上圖,這樣,我們的伺服器就能收到資料。

假如設A 和 B 的區域網路 IP 相同(192.168.31.11),當他們同時通路百度伺服器的時候,百度伺服器如何區分哪個是 A,哪個是 B 呢?

解決方案:端口映射

什麼是端口映射?