原文地址:http://www.javashuo.com/article/p-ucuznwpy-hg.htmlhtml
首先解釋一下「內網」與「外網」的概念:服務器
內網:即所說的局域網,好比學校的局域網,局域網內每臺計算機的IP地址在本局域網內具備互異性,是不可重複的。但兩個局域網內的內網IP能夠有相同的。網絡
外網:即互聯網,局域網經過一臺服務器或是一個路由器對外鏈接的網絡,這個IP地址是唯一的。也就是說內網裏全部的計算機都是鏈接到這一個外網IP上,經過這一個外網IP對外進行交換數據的。也就是說,一個局域網裏全部電腦的內網IP是互不相同的,但共用一個外網IP。(用ipconfig/all查到的IP是你本機的內網IP;在www.ip138.com上看到的是你鏈接互聯網所使用的IP,即外網)。orm
在局域網中,每臺電腦均可以本身分配本身的IP,這個IP只在局域網中有效。而若是你將電腦鏈接到互聯網,你的網絡提供商(ISP)的服務器會爲你分配一個IP地址,這個IP地址纔是你在外網的IP。兩個IP同時存在,一個對內,一個對外。htm
當你家裏買了兩臺電腦,你想組建一個局域網,你除了要用網線和路由器等設備將兩臺電腦相連,你還要將兩臺電腦設置固定IP,好比電腦A設爲192.168.1.2,電腦B設爲192.168.1.3,這樣你就能夠用這兩個IP地址互相訪問兩臺電腦,但這兩個IP地址只在這兩臺電腦間有效,對外網無效。因此局域網中分配的IP與廣域網中的IP徹底沒有對應關係。blog
你在內網的機子在上網時,都是在向網關發出請求,再由網關(通常爲路由器)用外網IP轉到INT網上,接受數據後,再分發到你的內網IP上。接口
再者,咱們大多人都是使用寬帶上網,結果發現,A 和 B 的局域網 IP 都是192.168.31.11,當他們都訪問百度瀏覽網頁時,百度服務器回覆數據時,如何區分是給 A 仍是給 B 呢?ip
公有 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,由於這二者已經創建好映射,如上圖,這樣,咱們的服務器就能收到數據。