這裏不討論繁瑣的概念,主要討論一下,一個局域網怎樣利用一個IP地址和公網互聯。
涉及兩個難點問題:
1.局域網中的一臺主機 A(192.168.1.110)如何與外網服務器(20.173.12.22)通信?
2.服務器的返回數據包,是如何找到內網的客戶端電腦A,並將數據傳給電腦A上運行的程序p呢?
1.第一個問題:局域網中的主機A,如何與外網服務器(20.173.12.22)通信?
局域網中的主機A,想要訪問外網服務器時,是通過NAT,將地址轉換成外網地址。然後與服務器通信的。
這樣問題自然就來了
2.第二個問題:那麼服務器返回的消息之後,是如何知道是內網中那一臺電腦發送的請求呢?
答案:通過端口來區分。
端口號是從0~65535的一個數字,每個局域網內的電腦在發出請求時,要帶上自己的端口號,這樣就可以區分了。帶自己的端口,就是爲了服務器在返回消息時,知道要給誰。
問題又來了:
3.第三個問題:但是,局域網內的電腦發的請求,端口號會重複嗎?允許重複嗎?
答案:會重複。允許重複。
4.第四個問題:怎麼辦?
答案:局域網內的電腦發的請求,帶的是局域網內部的"IP+端口號",在向外發請求時,NAT會重新給一個IP和端口號。這個IP就是整個局域網共用的IP,而端口則是臨時生成一個,給這個請求。NAT設備內部,記錄這個轉換的映射表。到時候,可以根據這張表,來倒推原來的請求的內網IP和端口。雖然端口一樣,但是IP不一樣,是可以區分清楚的。
5.第五個問題:那麼同一臺電腦上,不同的軟件訪問相同的網站,是否"IP+端口"會出現重複?
比如用谷歌瀏覽器,和IE瀏覽器訪問同一個網站?
答案:不會。首先有個概念要澄清。"IP+端口",有兩對:一個是客戶端,一般是我們自己局域網內的電腦;一個是服務端,一般是網站。我們客戶端的“IP+端口”稱爲“源IP和源端口”,服務端的稱爲“目的IP和目的端口”。我們自己電腦上的軟件佔用的端口是“源”端口。“源”端口用於在服務器返回響應時,尋找目標程序所使用的端口。不同的程序,在運行時,如果要訪問網絡,電腦會分配不同的端口。當兩個軟件同時使用相同的端口時,後打開的的那個軟件會被電腦提示:“端口已被佔”用而出錯。因此,不同的軟件,軟件自身始終是不同的端口。這個和訪問的網站是否一樣沒有關係。
以上總結一下:
局域網內的主機發請求時,會帶上自己的 IP+端口,走到NAT時,會將IP替換成公網IP,並重新分配一個端口給這個請求。當有了這個新的IP+端口之後,就可以訪問外網服務器。服務器返回消息時,返回到NAT,NAT根據IP+端口找到當時局域網內的IP和端口,併發送到局域網內的目標機器上,併發給對應的程序。
6.那麼問題又來了:局域網內電腦太多時,是否NAT的端口不夠分配?
比如,局域網內有70000臺電腦,大於65535了。
答:不錯。這個時候,端口就不夠了。一般情況下,是需要另一個公網IP的。這個時候,如果電腦的同一個程序,比方說大家都登陸QQ,發送請求時,源端口都是4000,發送到NAT時,大家都用同一個IP,端口都一樣,需要重新給端口時,就不夠用了。
不過,如果可以實現分時複用的話,應該還是可以的。