1. 程式人生 > >內網和外網之間的通訊

內網和外網之間的通訊

對於初學者而已,我們學習的網路程式設計(如TCP,UDP程式設計),我們通常都是在區域網內進行通訊測試,有時候我們或者會想,我們現在寫的內網網路資料和外網的網路資料有什麼不同,我們內網的資料是如何走出外網的呢?

再者,我們大多人都是使用寬頻上網,結果發現,A 和 B 的區域網 IP 都是192.168.31.11,當他們都訪問百度瀏覽網頁時,百度伺服器回覆資料時,如何區分是給 A 還是給 B 呢?   公有 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 呢?

 埠對映
接下來,給大家介紹一下什麼是埠對映?

埠對映是 NAT 的一種,它將外網主機的 IP 地址的一個埠對映到內網中一臺機器,提供相應的服務。當用戶訪問該 IP 的這個埠時,伺服器自動將請求對映到對應局 域網內部的機器上。
現在市場上的家庭路由器都具備 NAT 功能,也可以實現埠對映。下圖為小米路由器的埠對映設定圖:   我們平時經過路由器,通過寬頻,最終去到運營商那邊,資料是從運營商出去,最終資料是回到運營商那邊,運營商再把資料傳送到使用者的電腦。

路由器,至少有兩個埠:WAN 口和 LAN 口。
WAN:接外部 IP 地址用,通常指的是出口,轉發來自內部 LAN 介面的 IP 資料包,這個口的 IP 是唯一的。
LAN:接內部 IP 地址用,LAN 內部是交換機。

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

為了方便大家理解,我們把 IP 的轉化方向反過來分析(準確來說,公網轉區域網)。

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,因為這兩者已經 建立好對映,如上圖,這樣,我們的伺服器就能收到資料。