接下來要優(yōu)化的,,依然和IP有關(guān)!
IP:“為什么受傷的還是我??!”
別擔心,不給你好好整整容,,你不知道自己有多美,!
IP協(xié)議使用IP地址來標識網(wǎng)絡(luò)中的節(jié)點,分為IPv4和IPv6,。雖然一直在推行IPv6,,但目前主流還是IPv4。
IPv4使用32位二進制,,分為A,、B、C類(D類和E類有特殊用途,,不用于標識網(wǎng)絡(luò)中的節(jié)點),,共計大約37億多個可用單播地址。聽上去很多,但是Internet發(fā)展太快了,,早在2011年,,IANA就宣布IPv4地址耗盡。
等等,,既然2011年IPv4地址就沒了,,那怎么直到現(xiàn)在,大家都還在高高興興地用著IPv4地址呢,?
這要歸功于NAT(Network Address Translation,,網(wǎng)絡(luò)地址轉(zhuǎn)換)。
其實,,在IPv4地址中,,有一些特殊的地址范圍:
A類地址中,10.0.0.0~10.255.255.255,;
B類地址中,,172.16.0.0~172.31.255.255;
C類地址中,,192.168.0.0~192.168.255.255,。
這些地址,我們稱之為“私有地址”,。
什么是私有地址,?就是說,這些地址不會在Internet公網(wǎng)上出現(xiàn),,任何人都可以隨便使用,,不用花錢!
隨便使用,?那不會沖突嗎,?
并不會,,因為這些地址只限于你所在的局域網(wǎng)內(nèi)部使用,,如家庭、企業(yè),、學校等,,公網(wǎng)上并沒有這些地址。就好像你在一個局域網(wǎng)用10.1.1.1,,我在另一個局域網(wǎng)也使用10.1.1.1,,只要保證各自局域網(wǎng)內(nèi)不沖突就行。
可是,,如果我們兩人要通信呢,?地址不是沖突了嗎?
不不,私有地址只在局域網(wǎng)內(nèi)部使用,,如果要訪問外網(wǎng),,需要NAT給你發(fā)的數(shù)據(jù)包整個容!
一般情況下,,局域網(wǎng)接入公網(wǎng)的出口設(shè)備上都會配置NAT功能,。家庭中常見的“無線路由器”,其實本質(zhì)上不過是一臺“無線NAT”而已,!
如果NAT設(shè)備發(fā)現(xiàn)有私有數(shù)據(jù)包要去公網(wǎng),,會給它整個容:把里面IP封裝中的私有地址換成公網(wǎng)地址,做好記錄,,再發(fā)出去,;數(shù)據(jù)包回來時,再把地址換回來,,發(fā)回你的電腦,。
企業(yè)、學校的公網(wǎng)地址可以花錢向運營商購買固定地址,,便于注冊域名,,向外提供網(wǎng)絡(luò)服務(wù);家庭上網(wǎng)一般由運營商動態(tài)分配,。
圖中電腦的IP地址是私有地址192.168.1.10,,出口NAT設(shè)備接入Internet的公網(wǎng)地址是12.34.56.78,假設(shè)公網(wǎng)上有一臺地址為98.76.54.32的www服務(wù)器,,內(nèi)網(wǎng)電腦通過瀏覽器訪問它,。
電腦產(chǎn)生http報文,向下交給傳輸層TCP協(xié)議,。TCP封裝時,,源端口在49152~65535間隨機選擇一個,如60128,,目的端口為80,。
TCP封裝后,交給網(wǎng)絡(luò)層IP協(xié)議,,IP封裝源地址為內(nèi)網(wǎng)電腦的私網(wǎng)地址192.168.1.10,,目的地址為公網(wǎng)服務(wù)器的地址98.76.54.32,協(xié)議號為6,。
鏈路層的封裝和前面文章所述一樣,,這里我們省略。這個報文發(fā)到NAT設(shè)備后,,NAT設(shè)備將源地址修改為12.34.56.78,,做好記錄“內(nèi)網(wǎng)地址192.168.1.10映射到外網(wǎng)地址12.34.56.78”,,然后將報文發(fā)到公網(wǎng)。
公網(wǎng)根據(jù)報文中的目的地址98.76.54.32,,將報文準確送達服務(wù)器,。
服務(wù)器返回的信息,數(shù)據(jù)是這樣封裝的:
源和目的端口號,、IP地址互換位置,,公網(wǎng)會根據(jù)目的地址12.34.56.78,把報文送達NAT設(shè)備,。NAT根據(jù)記錄“內(nèi)網(wǎng)地址192.168.1.10映射到外網(wǎng)地址12.34.56.78”,,把目的地址12.34.56.78換回192.168.1.10,然后根據(jù)內(nèi)網(wǎng)地址192.168.1.10把報文送達電腦,。
但這樣的轉(zhuǎn)換方式并不妥當,,因為一個內(nèi)網(wǎng)地址需要對應轉(zhuǎn)換為一個外網(wǎng)地址,內(nèi)網(wǎng)電腦數(shù)量多就會消耗大量外網(wǎng)地址,,并沒有起到節(jié)省地址的作用,。
因此,我們所使用的NAT,,叫做NAPT(Network Address Port Translation,,網(wǎng)絡(luò)地址端口轉(zhuǎn)換)。
NAT只轉(zhuǎn)換IP封裝中的IP地址,,而NAPT則把傳輸層的端口號和IP地址一起轉(zhuǎn)換,,可以實現(xiàn)一個公網(wǎng)地址的復用。
假設(shè)內(nèi)網(wǎng)有兩臺電腦,,地址分別為192.168.1.10和192.168.1.20,,NAT設(shè)備地址和服務(wù)器地址和上例相同。假設(shè)兩臺電腦同時訪問外網(wǎng)服務(wù)器,,電腦A發(fā)出的報文封裝是:
電腦B發(fā)出的報文封裝是:
兩個數(shù)據(jù)報文到達NAT設(shè)備后,,NAT設(shè)備做個記錄:
然后,NAT把電腦A的報文修改為:
而電腦B的報文也被NAT修改為:
可以看到,,NAT把兩臺內(nèi)網(wǎng)電腦發(fā)出去的報文轉(zhuǎn)換后,,僅傳輸層的源端口號不同,IP的封裝完全相同,。這樣一來,,就可以實現(xiàn)同一個公網(wǎng)地址被不同內(nèi)網(wǎng)電腦重復使用,,只需通過端口號區(qū)別開就可以,。外網(wǎng)返回的數(shù)據(jù)報文回到NAT設(shè)備后,NAT根據(jù)之前記錄的信息再轉(zhuǎn)換回內(nèi)網(wǎng)地址和內(nèi)網(wǎng)端口號,,即可把報文送達不同的內(nèi)網(wǎng)電腦,。
小Q:對于沒有傳輸層的報文,如ICMP,無法進行端口號轉(zhuǎn)換,,NAT會怎么處理呢,?
歡迎大家留言討論。