
接下來要優(yōu)化的,依然和IP有關(guān)!
IP:“為什么受傷的還是我!!”
別擔(dān)心,不給你好好整整容,你不知道自己有多美!
IP協(xié)議使用IP地址來標(biāo)識網(wǎng)絡(luò)中的節(jié)點,分為IPv4和IPv6。雖然一直在推行IPv6,但目前主流還是IPv4。
IPv4使用32位二進(jìn)制,分為A、B、C類(D類和E類有特殊用途,不用于標(biāo)識網(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è)、學(xué)校等,公網(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è)、學(xué)校的公網(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間隨機(jī)選擇一個,如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,將報文準(zhǔn)確送達(dá)服務(wù)器。
服務(wù)器返回的信息,數(shù)據(jù)是這樣封裝的:

源和目的端口號、IP地址互換位置,公網(wǎng)會根據(jù)目的地址12.34.56.78,把報文送達(dá)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把報文送達(dá)電腦。
但這樣的轉(zhuǎn)換方式并不妥當(dāng),因為一個內(nèi)網(wǎng)地址需要對應(yī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)地址的復(fù)用。
假設(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ù)報文到達(dá)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)電腦重復(fù)使用,只需通過端口號區(qū)別開就可以。外網(wǎng)返回的數(shù)據(jù)報文回到NAT設(shè)備后,NAT根據(jù)之前記錄的信息再轉(zhuǎn)換回內(nèi)網(wǎng)地址和內(nèi)網(wǎng)端口號,即可把報文送達(dá)不同的內(nèi)網(wǎng)電腦。
小Q:對于沒有傳輸層的報文,如ICMP,無法進(jìn)行端口號轉(zhuǎn)換,NAT會怎么處理呢?
歡迎大家留言討論。