最簡單的上網流程
ip地址
我們現在常使用的IP地址是IPv4地址,由四組0-255的十進制數字組成,中間以小數點分隔。Internet上的每一台主機或者路由器都至少有一個IP地址。IP地址(IPv4地址,下文IP地址默認指IPv4)的長度是32位,總數為2的32次方,大約43億個。
43億IP地址假如全球每人分配一個IP就需要75億。為了快速解決IP地址匱乏的這個問題,NAT技術誕生了。
------------------------------------------------------------------
NAT(Network Address Translation),中文名喚作網絡地址轉換,誕生於IP地址匱乏的時代。
NAT的基本思想是ISP(Internet服務提供商)為每個家庭或者公司分配一個IP地址,這個IP地址用作Internet流量的傳輸,也就是大家常說的外網IP地址或者公網IP地址。在客戶網絡的內部,每台計算機有唯一一個IP地址,即內網IP地址,這些地址主要用於路由內部流量。當一個數據包離開客戶網絡發送至其他ISP時,需要進行地址轉換,把唯一的內網IP地址轉換成外網的IP地址。
這種地址轉化使用IP地址的三個范圍,這些地址已被聲明私有化,任何內網中的設備可以任意使用這些地址,但是在這三個范圍內的IP地址不允許出現在Internet(外網)上,這三個保留的地址范圍是:
10.0.0.0~10.255.255.255/8
172.16.0.0~172.31.255.255/12
192.168.0.0~192.168.255.255/16
他們分別可以容納16777216、1048576、65536台主機。一般家里用無線路由器,就用到了網絡地址轉換技術,我們連上wifi后分配的IP地址一般是以172或192為開頭。學校或者大企業里面的網絡可能會用到10開頭的地址范圍。
NAT將內網外網划分好之后,是如何使內網的設備訪問外網的呢?
如下圖,當計算機A在內網(假設IP為10.0.0.1)想去訪問一個Internet上的網站S(假設IP地址為54.223.189.245)時,A的數據包需要先經過一個NAT盒子(NAT box),這個盒子先將A的IP源地址轉換成外網的真實IP地址(假設IP為121.0.0.2),然后將轉換后的數據包發送至Internet。
於是問題來了,當網站S收到這個數據包后,會處理請求,並發送響應的數據包,然而這個數據包的目標地址是121.0.0.2(外網IP),數據包如何返回內網中的A呢?
這里要先介紹一下源端口(Source Port)和目標端口(Destination Port)的概念。當一個進程希望與另一個進程建立TCP連接時,它把自己綁定到一個本機尚未被占用的TCP端口上,這個端口稱為源端口,該TCP連接中所有入境的數據包都要被發送至這個端口。同時進程還需要提供一個目標端口,指明數據包到達遠程主機后送至哪一個端口處理。每一個出境的TCP數據包都包括一個源端口和目標端口。
舉例來說,如下圖,網站服務器S(IP地址為54.223.189.245)的HTTP服務運行在80端口上,公網上的計算機D(IP地址為121.141.56.23)想去訪問網站S,於是把自己綁定到本機的33121端口上,並發送請求的數據包,這個數據包中就包含了計算機D的源端口33121和目標端口80。網站S收到請求后,發送響應的數據包,這個數據包中包含了服務器S的源端口80和目標端口3312。
上面的例子是外網中的一台計算機訪問一個網站。在內網中計算機發送的數據包同樣存在着源端口和目標端口。NAT盒子做的事情就是對出入境數據包的端口進行修改。
回到最初舉的例子,假設內網計算機A(IP地址為10.0.0.1)發送的請求包的源端口是45421,目標端口是80,請求訪問網站服務器S(IP地址為54.223.189.245)。
當這個出境數據包經過NAT盒子時,其源地址被修改成公網的真實IP(121.0.0.2),源端口被修改一個索引值(假設為50002),這個索引值指向NAT盒子的地址轉化表中的某一項,這一表項保存了計算機A的內網源地址和源端口。最后NAT盒子將重新生成的數據包發送出去。
當網站S響應的入境數據包到達NAT盒子時,數據包經過處理,目的地址由公網IP(121.0.0.2)還原為計算機A的內網IP(10.0.0.1),目標端口由索引值(50002)還原為計算機A的源端口(45421)。還原后數據包可以正常的在內網路由。
這個過程基本如下圖所示。
如此一來,NAT解決了數據包在內網公網之間的地址和端口的轉換問題,暫時緩解了IP地址的短缺,但是它卻有着不少的缺點。
NAT違背了IP的結構模型(每個IP地址唯一標識世界上的一台機器),采用NAT后可能有無數台主機使用10.0.0.1這個IP地址。NAT還打破了Internet的端-端的連接模型。內網中的主機可以通過NAT與一台公網上的服務建立連接,但是反過來卻不行,公網上的主機無法與某一內網中的主機建立連接。舉個簡單的例子來說,你在內網某台計算機上搭建了一個網站,在外網是無法訪問的。而且使用NAT后,Internet變得如電路交換網絡一樣脆弱。NAT盒子為每個經過它的連接維護必要的信息(即映射關系),若NAT盒子崩潰,並且所有映射表被摧毀,所有TCP連接將被摧毀。
目前的IP地址匱乏,歸根結底是IPv4設計者的鍋,NAT只是權宜之策。既然NAT這么復雜,有人要問了,在IPv6普及后,NAT是否就會被取締了呢?答案是不會的。因為NAT已被廣泛使用,尤其是家庭和小型企業的網絡,即使IPv6普及了,NAT在短時間內也很難被取代。
參考資料:《計算機網絡》(第5版)
————————————————
原文鏈接:https://blog.csdn.net/SmalOSnail/article/details/53018236