應(yīng)用

技術(shù)

物聯(lián)網(wǎng)世界 >> 物聯(lián)網(wǎng)新聞 >> 物聯(lián)網(wǎng)熱點(diǎn)新聞
企業(yè)注冊(cè)個(gè)人注冊(cè)登錄

我畫了 40 張圖就是為了讓你搞懂計(jì)算機(jī)網(wǎng)絡(luò)層

2021-01-05 15:04 程序員cxuan

導(dǎo)讀:網(wǎng)絡(luò)層是 OSI 參考模型的第三層,它位于傳輸層和鏈路層之間,網(wǎng)絡(luò)層的主要目的是實(shí)現(xiàn)兩個(gè)端系統(tǒng)之間透明的數(shù)據(jù)傳輸。

前面我們學(xué)習(xí)了運(yùn)輸層如何為客戶端和服務(wù)器輸送數(shù)據(jù)的,提供進(jìn)程端到端的通信。那么下面我們將學(xué)習(xí)網(wǎng)絡(luò)層實(shí)際上是怎樣實(shí)現(xiàn)主機(jī)到主機(jī)的通信服務(wù)的。幾乎每個(gè)端系統(tǒng)都有網(wǎng)絡(luò)層這一部分。所以,網(wǎng)絡(luò)層必然是很復(fù)雜的。下面我將花費(fèi)大量篇幅來(lái)介紹一下計(jì)算機(jī)網(wǎng)絡(luò)層的知識(shí)。

網(wǎng)絡(luò)層概述

網(wǎng)絡(luò)層是 OSI 參考模型的第三層,它位于傳輸層和鏈路層之間,網(wǎng)絡(luò)層的主要目的是實(shí)現(xiàn)兩個(gè)端系統(tǒng)之間透明的數(shù)據(jù)傳輸。

網(wǎng)絡(luò)層的作用從表面看上去非常簡(jiǎn)單,即將分組從一臺(tái)主機(jī)移動(dòng)到另外一臺(tái)主機(jī)。為了實(shí)現(xiàn)這個(gè)功能,網(wǎng)絡(luò)層需要兩種功能

轉(zhuǎn)發(fā):因?yàn)樵诨ヂ?lián)網(wǎng)中有很多路由器的存在,而路由器是構(gòu)成互聯(lián)網(wǎng)的根本,路由器最重要的一個(gè)功能就是分組轉(zhuǎn)發(fā),當(dāng)一個(gè)分組到達(dá)某路由器的一條輸入鏈路時(shí),該路由器會(huì)將分組移動(dòng)到適當(dāng)?shù)妮敵鲦溌?。轉(zhuǎn)發(fā)是在數(shù)據(jù)平面中實(shí)現(xiàn)的唯一功能。

在網(wǎng)絡(luò)中存在兩種平面的選擇

數(shù)據(jù)平面(data plane):負(fù)責(zé)轉(zhuǎn)發(fā)網(wǎng)絡(luò)流量,如路由器交換機(jī)中的轉(zhuǎn)發(fā)表(我們后面會(huì)說(shuō))。控制平面(control plane):控制網(wǎng)絡(luò)的行為,比如網(wǎng)絡(luò)路徑的選擇。路由選擇:當(dāng)分組由發(fā)送方流向接收方時(shí),網(wǎng)絡(luò)層必須選擇這些分組的路徑。計(jì)算這些路徑選擇的算法被稱為路由選擇算法(routing algorithm)。

也就是說(shuō),轉(zhuǎn)發(fā)是指將分組從一個(gè)輸入鏈路轉(zhuǎn)移到適當(dāng)輸出鏈路接口的路由器本地動(dòng)作。而路由選擇是指確定分組從源到目的地所定位的路徑的選擇。我們后面會(huì)經(jīng)常提到轉(zhuǎn)發(fā)和路由選擇這兩個(gè)名詞。

那么此處就有一個(gè)問(wèn)題,路由器怎么知道有哪些路徑可以選擇呢?

每臺(tái)路由器都有一個(gè)關(guān)鍵的概念就是轉(zhuǎn)發(fā)表(forwarding table)。路由器通過(guò)檢查數(shù)據(jù)包標(biāo)頭中字段的值,來(lái)定位轉(zhuǎn)發(fā)表中的項(xiàng)來(lái)實(shí)現(xiàn)轉(zhuǎn)發(fā)。標(biāo)頭中的值即對(duì)應(yīng)著轉(zhuǎn)發(fā)表中的值,這個(gè)值指出了分組將被轉(zhuǎn)發(fā)的路由器輸出鏈路。如下圖所示

上圖中有一個(gè) 1001 分組到達(dá)路由器后,首先會(huì)在轉(zhuǎn)發(fā)表中進(jìn)行索引,然后由路由選擇算法決定分組要走的路徑。每臺(tái)路由器都有兩種功能:轉(zhuǎn)發(fā)和路由選擇。下 面我們就來(lái)聊一聊路由器的工作原理。

路由器工作原理

下面是一個(gè)路由器體系結(jié)構(gòu)圖,路由器主要是由 4 個(gè)組件構(gòu)成的

輸入端口:輸入端口(input port)有很多功能。線路終端功能和數(shù)據(jù)鏈路處理功能,這兩個(gè)功能實(shí)現(xiàn)了路由器的單個(gè)輸入鏈路相關(guān)聯(lián)的物理層和數(shù)據(jù)鏈路層。輸入端口查找/轉(zhuǎn)發(fā)功能對(duì)路由器的交換功能來(lái)說(shuō)至關(guān)重要,由路由器的交換結(jié)構(gòu)來(lái)決定輸出端口,具體來(lái)講應(yīng)該是查詢轉(zhuǎn)發(fā)表來(lái)確定的。交換結(jié)構(gòu):交換結(jié)構(gòu)(Switching fabric)就是將路由器的輸入端口連接到它的輸出端口。這種交換結(jié)構(gòu)相當(dāng)于是路由器內(nèi)部的網(wǎng)絡(luò)。輸出端口:輸出端口(Output ports)通過(guò)交換結(jié)構(gòu)轉(zhuǎn)發(fā)分組,并通過(guò)物理層和數(shù)據(jù)鏈路層的功能傳輸分組,因此,輸出端口作為輸入端口執(zhí)行反向數(shù)據(jù)鏈接和物理層功能。路由選擇處理器:路由選擇處理器(Routing processor)在路由器內(nèi)執(zhí)行路由協(xié)議,維護(hù)路由表并執(zhí)行網(wǎng)絡(luò)管理功能。

上面只是這幾個(gè)組件的簡(jiǎn)單介紹,其實(shí)這幾個(gè)組件的組成并不像描述的那樣簡(jiǎn)單,下面我們就來(lái)深入聊一聊這幾個(gè)組件。

輸入端口

上面介紹了輸入端口有很多功能,包括線路終端、數(shù)據(jù)處理、查找轉(zhuǎn)發(fā),其實(shí)這些功能在輸入端口的內(nèi)部有相應(yīng)的模塊,輸入端口的內(nèi)部實(shí)現(xiàn)如下圖所示

每個(gè)輸入端口中都有一個(gè)路由處理器維護(hù)的路由表的副本,根據(jù)路由處理器進(jìn)行更新。這個(gè)路由表的副本能 夠使每個(gè)輸入端口進(jìn)行切換,而無(wú)需經(jīng)過(guò)路由處理器統(tǒng)一處理。這是一種分散式的切換,這種方式避免了路 由選擇器統(tǒng)一處理造成轉(zhuǎn)發(fā)瓶頸。

在輸入端口處理能力有限的路由器中,輸入端口不會(huì)進(jìn)行交換功能,而是由路由處理器統(tǒng)一處理,然后根據(jù) 路由表查找并將數(shù)據(jù)包轉(zhuǎn)發(fā)到相應(yīng)的輸出端口。

一般這種路由器不是單獨(dú)的路由器,而是工作站或者服務(wù)器充當(dāng)?shù)穆酚?,這種路由器內(nèi)部中,路由處理器其實(shí)就是CPU,而輸入端口其實(shí)只是網(wǎng)卡。

輸入端口會(huì)根據(jù)轉(zhuǎn)發(fā)表定位輸出端口,然后再會(huì)進(jìn)行分組轉(zhuǎn)發(fā),那么現(xiàn)在就有一個(gè)問(wèn)題,是不是每一個(gè)分組都有自己的一條鏈路呢?如果分組數(shù)量非常大,到達(dá)億級(jí)的話,也會(huì)有億個(gè)輸出端口路徑嗎?

我們的潛意識(shí)中顯然不是的,來(lái)看下面一個(gè)例子。

下面是三個(gè)輸入端口對(duì)應(yīng)了轉(zhuǎn)發(fā)表中的三個(gè)輸出鏈路的示例

可以看到,對(duì)于這個(gè)例子來(lái)說(shuō),路由器轉(zhuǎn)發(fā)表中不需要那么多條鏈路,只需要四條就夠,即對(duì)應(yīng)輸出鏈路 0 1 2 3 。也就是說(shuō),能夠使用 4 個(gè)轉(zhuǎn)發(fā)表就可以實(shí)現(xiàn)億級(jí)鏈路。

如何實(shí)現(xiàn)呢?

使用這種風(fēng)格的轉(zhuǎn)發(fā)表,路由器分組的地址前綴(prefix)會(huì)與該表中的表項(xiàng)進(jìn)行匹配。

如果存在一個(gè)匹配項(xiàng),那么就會(huì)轉(zhuǎn)發(fā)到對(duì)應(yīng)的鏈路上,可能不好理解,我舉個(gè)例子來(lái)說(shuō)吧。

比如這時(shí)有一個(gè)分組是 11000011 10010101 00010000 0001100 到達(dá),因?yàn)檫@個(gè)分組與 11000011 10010101 00010000 相匹配,所以路由器會(huì)轉(zhuǎn)發(fā)到 0 鏈路接口上。如果一個(gè)前綴不匹配上面三個(gè)輸出鏈路中的一種,那么路由器將向鏈路接口 3 進(jìn)行轉(zhuǎn)發(fā)。

路由匹配遵循最長(zhǎng)前綴原則(longest prefix matching rule),最長(zhǎng)匹配原則故名思義就是如果有兩個(gè)匹配項(xiàng)一個(gè)長(zhǎng)一個(gè)短的話,就匹配最長(zhǎng)的。

一旦通過(guò)查找功能確定了分組的輸出端口后,那么該分組就會(huì)進(jìn)入交換結(jié)構(gòu)。在進(jìn)入交換結(jié)構(gòu)時(shí),如果交換結(jié)構(gòu)正在被使用,就會(huì)阻塞新到的分組,等到交換結(jié)構(gòu)調(diào)度新的分組。

交換結(jié)構(gòu)

交換結(jié)構(gòu)是路由器的核心功能,通過(guò)交換功能把分組從輸入端口轉(zhuǎn)發(fā)至輸出端口,這就是交換結(jié)構(gòu)的主要功能。交換結(jié)構(gòu)有多種形式,主要分為通過(guò)內(nèi)存交換、通過(guò)總線交換、通過(guò)互聯(lián)網(wǎng)絡(luò)進(jìn)行交換,下面我們分開來(lái)探討一下。

經(jīng)過(guò)內(nèi)存交換:最開始的傳統(tǒng)計(jì)算機(jī)就是使用內(nèi)存交換的,在輸入端口和輸出端口之間是通過(guò) CPU 進(jìn)行的。輸入端口和輸出端口的功能就好像傳統(tǒng)操作系統(tǒng)中的 I/O 設(shè)備一樣。當(dāng)一個(gè)分組到達(dá)輸入端口時(shí),這個(gè)端口會(huì)首先以中斷的方式向路由選擇器發(fā)出信號(hào),將分組從輸入端口拷貝到內(nèi)存中。然后,路由選擇處理器從分組首部中提取目標(biāo)地址,在轉(zhuǎn)發(fā)表中找出適當(dāng)?shù)妮敵龆丝谶M(jìn)行轉(zhuǎn)發(fā),同時(shí)將分組復(fù)制到輸出端口的緩存中。

這里需要注意一點(diǎn),如果內(nèi)存帶寬以每秒讀取或者寫入 B 個(gè)數(shù)據(jù)包,那么總的交換機(jī)吞吐量(數(shù)據(jù)包從輸入端口到輸出端口的總速率) 必須小于 B/2。

經(jīng)過(guò)總線交換:在這種處理方式中,總線經(jīng)由輸入端口直接將分組傳送到輸出端口,中間不需要路由選擇器的干預(yù)??偩€的工作流程如下:輸入端口給分組分配一個(gè)標(biāo)簽,然后分組經(jīng)由總線發(fā)送給所有的輸出端口,每個(gè)輸出端口都會(huì)判斷標(biāo)簽中的端口和自己的是否匹配,如果匹配的話,那么這個(gè)輸出端口就會(huì)把標(biāo)簽拆掉,這個(gè)標(biāo)簽只用于交換機(jī)內(nèi)部跨越總線。如果同時(shí)有多個(gè)分組到達(dá)路由器的話,那么只有一個(gè)分組能夠被處理,其他分組需要再進(jìn)入交換結(jié)構(gòu)前等待。

經(jīng)過(guò)互聯(lián)網(wǎng)絡(luò)交換:克服單一、共享式總線帶寬限制的一種方法是使用一個(gè)更復(fù)雜的互聯(lián)網(wǎng)絡(luò)。如下圖所示

每條垂直的的總線在交叉點(diǎn)與每條水平的總線交叉,交叉點(diǎn)通過(guò)交換結(jié)構(gòu)控制器能夠在任何時(shí)候開啟和閉合。當(dāng)分組到達(dá)輸入端口 A 時(shí),如果需要轉(zhuǎn)發(fā)到端口 X,交換機(jī)控制器會(huì)閉合 A 到 X 交叉部分的交叉點(diǎn),然后端口 A 在總線上進(jìn)行分組轉(zhuǎn)發(fā)。這種網(wǎng)絡(luò)互聯(lián)式的交換結(jié)構(gòu)是非阻塞的(non-blocking)的,也就是說(shuō) A -> X 的交叉點(diǎn)閉合不會(huì)影響 B -> Y 的鏈路。如果來(lái)自兩個(gè)不同輸入端口的兩個(gè)分組其目的地為相同的輸出端口的話,這種情況下只能有一個(gè)分組被交換,另外一個(gè)分組必須進(jìn)行等待。

輸出端口處理

如下圖所示,輸出端口處理取出已經(jīng)存放在輸出端口內(nèi)存中的分組并將其發(fā)送到輸出鏈路上。包括選擇和去除排隊(duì)的分組進(jìn)行傳輸,執(zhí)行所需的鏈路層和物理層的功能。

在輸入端口中有等待進(jìn)入交換的排隊(duì)隊(duì)列,而在輸出端口中有等待轉(zhuǎn)發(fā)的排隊(duì)隊(duì)列,排隊(duì)的位置和程度取決于流量負(fù)載、交換結(jié)構(gòu)的相對(duì)頻率和線路速率。

隨著隊(duì)列的不斷增加,會(huì)導(dǎo)致路由器的緩存空間被耗盡,進(jìn)而使沒(méi)有內(nèi)存可以存儲(chǔ)溢出的隊(duì)列,致使分組出現(xiàn)丟包(packet loss),這就是我們說(shuō)的在網(wǎng)絡(luò)中丟包或者被路由器丟棄。

何時(shí)出現(xiàn)排隊(duì)

下面我們通過(guò)輸入端口的排隊(duì)隊(duì)列和輸出端口的排隊(duì)隊(duì)列來(lái)介紹一下可能出現(xiàn)的排隊(duì)情況。

輸入隊(duì)列

如果交換結(jié)構(gòu)的處理速度沒(méi)有輸入隊(duì)列到達(dá)的速度快,在這種情況下,輸入端口將會(huì)出現(xiàn)排隊(duì)情況,到達(dá)交換結(jié)構(gòu)前的分組會(huì)加入輸入端口隊(duì)列中,以等待通過(guò)交換結(jié)構(gòu)傳送到輸出端口。

為了描述清楚輸入隊(duì)列,我們假設(shè)以下情況:

使用網(wǎng)絡(luò)互聯(lián)的交換方式;假定所有鏈路的速度相同;在鏈路中一個(gè)分組由輸入端口交換到輸出端口所花的時(shí)間相同,從任意一個(gè)輸入端口傳送到給定的輸出端口;分組按照 FCFS 的方式,只要輸出端口不同,就可以進(jìn)行并行傳送。但是如果位于任意兩個(gè)輸入端口中的分組是發(fā)往同一個(gè)目的地的,那么其中的一個(gè)分組將被阻塞,而且必須在輸入隊(duì)列中等待,因?yàn)榻粨Q結(jié)構(gòu)一次只能傳輸一個(gè)到指定端口。

如下圖所示

在 A 隊(duì)列中,輸入隊(duì)列中的兩個(gè)分組會(huì)發(fā)送至同一個(gè)目的地 X,假設(shè)在交換結(jié)構(gòu)正要發(fā)送 A 中的分組,在這個(gè)時(shí)候,C 隊(duì)列中也有一個(gè)分組發(fā)送至 X,在這種情況下,C 中發(fā)送至 X 的分組將會(huì)等待,不僅如此,C 隊(duì)列中發(fā)送至 Y 輸出端口的分組也會(huì)等待,即使 Y 中沒(méi)有出現(xiàn)競(jìng)爭(zhēng)的情況。這種現(xiàn)象叫做線路前部阻塞(Head-Of-The-Line, HOL)。

輸出隊(duì)列

我們下面討論輸出隊(duì)列中出現(xiàn)等待的情況。假設(shè)交換速率要比輸入/輸出的傳輸速率快很多,而且有 N 個(gè)輸入分組的目的地是轉(zhuǎn)發(fā)至相同的輸出端口。在這種情況下,在向輸出鏈路發(fā)送分組的過(guò)程中,將會(huì)有 N 個(gè)新分組到達(dá)傳輸端口。因?yàn)檩敵龆丝谠谝粋€(gè)單位時(shí)間內(nèi)只能傳輸一個(gè)分組,那么這 N 個(gè)分組將會(huì)等待。然而在等待 N 個(gè)分組被處理的過(guò)程中,同時(shí)又有 N 個(gè)分組到達(dá),所以 ,分組隊(duì)列能夠在輸出端口形成。這種情況下最終會(huì)因?yàn)榉纸M數(shù)量變的足夠大,從而耗盡輸出端口的可用內(nèi)存。

如果沒(méi)有足夠的內(nèi)存來(lái)緩存分組的話,就必須考慮其他的方式,主要有兩種:一種是丟失分組,采用棄尾(drop-tail)的方法;一種是刪除一個(gè)或多個(gè)已經(jīng)排隊(duì)的分組,從而來(lái)為新的分組騰出空間。

網(wǎng)絡(luò)層的策略對(duì) TCP 擁塞控制影響很大的就是路由器的分組丟棄策略。在最簡(jiǎn)單的情況下,路由器的隊(duì)列通常都是按照 FCFS 的規(guī)則處理到來(lái)的分組。由于隊(duì)列長(zhǎng)度總是有限的,因此當(dāng)隊(duì)列已經(jīng)滿了的時(shí)候,以后再到達(dá)的所有分組(如果能夠繼續(xù)排隊(duì),這些分組都將排在隊(duì)列的尾部)將都被丟棄。這就叫做尾部丟棄策略。

通常情況下,在緩沖填滿之前將其丟棄是更好的策略。

如上圖所示,A B C 每個(gè)輸入端口都到達(dá)了一個(gè)分組,而且這個(gè)分組都是發(fā)往 X 的,同一時(shí)間只能處理一個(gè)分組,然后這時(shí),又有兩個(gè)分組分別由 A B 發(fā)往 X,所以此時(shí)有 4 個(gè)分組在 X 中進(jìn)行等待。

等上一個(gè)分組被轉(zhuǎn)發(fā)完成后,輸出端口就會(huì)選擇在剩下的分組中根據(jù)分組調(diào)度(packet scheduleer)選擇一個(gè)分組來(lái)進(jìn)行傳輸,我們下面就會(huì)聊到分組傳輸。

分組調(diào)度

現(xiàn)在我們來(lái)討論一下分組調(diào)度次序的問(wèn)題,即排隊(duì)的分組如何經(jīng)輸出鏈路傳輸?shù)膯?wèn)題。我們生活中有無(wú)數(shù)排隊(duì)的例子,但是我們生活中一般的排隊(duì)算法都是先來(lái)先服務(wù)(FCFS),也是先進(jìn)先出(FIFO)。

先進(jìn)先出

先進(jìn)先出就映射為數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列,只不過(guò)它現(xiàn)在是鏈路調(diào)度規(guī)則的排隊(duì)模型。

FIFO 調(diào)度規(guī)則按照分組到達(dá)輸出鏈路隊(duì)列的相同次序來(lái)選擇分組,先到達(dá)隊(duì)列的分組將先會(huì)被轉(zhuǎn)發(fā)。在這種抽象模型中,如果隊(duì)列已滿,那么棄尾的分組將是隊(duì)列末尾的后面一個(gè)。

優(yōu)先級(jí)排隊(duì)

優(yōu)先級(jí)排隊(duì)是先進(jìn)先出排隊(duì)的改良版本,到達(dá)輸出鏈路的分組被分類放入輸出隊(duì)列中的優(yōu)先權(quán)類,如下圖所示

通常情況下,每個(gè)優(yōu)先級(jí)不同的分組有自己的優(yōu)先級(jí)類,每個(gè)優(yōu)先級(jí)類有自己的隊(duì)列,分組傳輸會(huì)首先從優(yōu)先級(jí)高的隊(duì)列中進(jìn)行,在同一類優(yōu)先級(jí)的分組之間的選擇通常是以 FIFO 的方式完成。

循環(huán)加權(quán)公平排隊(duì)

在循環(huán)加權(quán)公平規(guī)則(round robin queuing discipline)下,分組像使用優(yōu)先級(jí)那樣被分類。然而,在類之間卻不存在嚴(yán)格的服務(wù)優(yōu)先權(quán)。循環(huán)調(diào)度器在這些類之間循環(huán)輪流提供服務(wù)。如下圖所示

在循環(huán)加權(quán)公平排隊(duì)中,類 1 的分組被傳輸,接著是類 2 的分組,最后是類 3 的分組,這算是一個(gè)循環(huán),然后接下來(lái)又重新開始,又從 1 -> 2 -> 3 這個(gè)順序進(jìn)行輪詢。每個(gè)隊(duì)列也是一個(gè)先入先出的隊(duì)列。

這是一種所謂的保持工作排隊(duì)(work-conserving queuing)的規(guī)則,就是說(shuō)如果輪詢的過(guò)程中發(fā)現(xiàn)有空隊(duì)列,輸出端口不會(huì)等待分組,而是繼續(xù)輪詢下面的隊(duì)列。

IP 協(xié)議

路由器對(duì)分組進(jìn)行轉(zhuǎn)發(fā)后,就會(huì)把數(shù)據(jù)包傳到網(wǎng)絡(luò)上,數(shù)據(jù)包最終是要傳遞到客戶端或者服務(wù)器上的,那么數(shù)據(jù)包怎么知道要發(fā)往哪里呢?起到關(guān)鍵作用的就是 IP 協(xié)議。

IP 主要分為三個(gè)部分,分別是IP 尋址、路由和分包組包。下面我們主要圍繞這三點(diǎn)進(jìn)行闡述。

IP 地址

既然一個(gè)數(shù)據(jù)包要在網(wǎng)絡(luò)上傳輸,那么肯定需要知道這個(gè)數(shù)據(jù)包到底發(fā)往哪里,也就是說(shuō)需要一個(gè)目標(biāo)地址信息,IP 地址就是連接網(wǎng)絡(luò)中的所有主機(jī)進(jìn)行通信的目標(biāo)地址,因此,在網(wǎng)絡(luò)上的每個(gè)主機(jī)都需要有自己的 IP 地址。

在 IP 數(shù)據(jù)報(bào)發(fā)送的鏈路中,有可能鏈路非常長(zhǎng),比如說(shuō)由中國(guó)發(fā)往美國(guó)的一個(gè)數(shù)據(jù)報(bào),由于網(wǎng)絡(luò)抖動(dòng)等一些意外因素可能會(huì)導(dǎo)致數(shù)據(jù)報(bào)丟失,這時(shí)我們?cè)谶@條鏈路中會(huì)放入一些中轉(zhuǎn)站,一方面能夠確保數(shù)據(jù)報(bào)是否丟失,另一方面能夠控制數(shù)據(jù)報(bào)的轉(zhuǎn)發(fā),這個(gè)中轉(zhuǎn)站就是我們前面聊過(guò)的路由器,這個(gè)轉(zhuǎn)發(fā)過(guò)程就是路由控制。

路由控制(Routing)是指將分組數(shù)據(jù)發(fā)送到最終目標(biāo)地址的功能,即使網(wǎng)絡(luò)復(fù)雜多變,也能夠通過(guò)路由控制到達(dá)目標(biāo)地址。因此,一個(gè)數(shù)據(jù)報(bào)能否到達(dá)目標(biāo)主機(jī),關(guān)鍵就在于路由器的控制。

這里有一個(gè)名詞,就是跳,因?yàn)樵谝粭l鏈路中可能會(huì)布滿很多路由器,路由器和路由器之間的數(shù)據(jù)報(bào)傳送就是跳,比如你和隔壁老王通信,中間就可能會(huì)經(jīng)過(guò)路由器 A-> 路由器 B -> 路由器 C 。

那么一跳的范圍有多大呢?

一跳是指從源 MAC 地址到目標(biāo) MAC 地址之間傳輸幀的區(qū)間,這里引出一個(gè)新的名詞,MAC 地址是啥?

MAC 地址指的就是計(jì)算機(jī)的物理地址(Physical Address),它是用來(lái)確認(rèn)網(wǎng)絡(luò)設(shè)備位置的地址。在 OSI 網(wǎng)絡(luò)模型中,網(wǎng)絡(luò)層負(fù)責(zé) IP 地址的定位,而數(shù)據(jù)鏈路層負(fù)責(zé) MAC 地址的定位。MAC 地址用于在網(wǎng)絡(luò)中唯一標(biāo)示一個(gè)網(wǎng)卡,一臺(tái)設(shè)備若有一或多個(gè)網(wǎng)卡,則每個(gè)網(wǎng)卡都需要并會(huì)有一個(gè)唯一的 MAC 地址,也就是說(shuō) MAC 地址和網(wǎng)卡是緊密聯(lián)系在一起的。

路由器的每一跳都需要詢問(wèn)當(dāng)前中轉(zhuǎn)的路由器,下一跳應(yīng)該跳到哪里,從而跳轉(zhuǎn)到目標(biāo)地址。而不是數(shù)據(jù)報(bào)剛開始發(fā)送后,網(wǎng)絡(luò)中所有的通路都會(huì)顯示出來(lái),這種多次跳轉(zhuǎn)也叫做多跳路由。

IP 地址定義

現(xiàn)如今有兩個(gè)版本的 IP 地址,IPv4 和 IPv6,我們首先探討一下現(xiàn)如今還在廣泛使用的 IPv4 地址,后面再考慮 IPv6 。

IPv4 由 32 位正整數(shù)來(lái)表示,在計(jì)算機(jī)內(nèi)部會(huì)轉(zhuǎn)化為二進(jìn)制來(lái)處理,但是二進(jìn)制不符合人類閱讀的習(xí)慣,所以我們根據(jù)易讀性的原則把 32 位的 IP 地址以 8 位為一組,分成四組,每組之間以.進(jìn)行分割,再將每組轉(zhuǎn)換為十進(jìn)制數(shù)。如下圖所示

那么上面這個(gè) 32 位的 IP 地址就會(huì)被轉(zhuǎn)換為十進(jìn)制的 156.197.1.1。

除此之外,從圖中我們還可以得到如下信息

每個(gè)這樣 8 位位一組的數(shù)字,自然是非負(fù)數(shù),其取值范圍是 [0,255]。

IP 地址的總個(gè)數(shù)有 2^32 次冪個(gè),這個(gè)數(shù)值算下來(lái)是4294967296,大概能允許 43 億臺(tái)設(shè)備連接到網(wǎng)絡(luò)。實(shí)際上真的如此嗎?

實(shí)際上 IP 不會(huì)以主機(jī)的個(gè)數(shù)來(lái)配置的,而是根據(jù)設(shè)備上的網(wǎng)卡(NIC)進(jìn)行配置,每一塊網(wǎng)卡都會(huì)設(shè)置一個(gè)或者多個(gè) IP 地址,而且通常一臺(tái)路由器會(huì)有至少兩塊網(wǎng)卡,所以可以設(shè)置兩個(gè)以上的 IP 地址,所以主機(jī)的數(shù)量遠(yuǎn)遠(yuǎn)達(dá)不到 43 億。

IP 地址構(gòu)造和分類

IP 地址由網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)兩部分組成,網(wǎng)絡(luò)標(biāo)識(shí)代表著網(wǎng)絡(luò)地址,主機(jī)標(biāo)識(shí)代表著主機(jī)地址。網(wǎng)絡(luò)標(biāo)識(shí)在數(shù)據(jù)鏈路的每個(gè)段配置不同的值。網(wǎng)絡(luò)標(biāo)識(shí)必須保證相互連接的每個(gè)段的地址都不重復(fù)。而相同段內(nèi)相連的主機(jī)必須有相同的網(wǎng)絡(luò)地址。IP 地址的主機(jī)標(biāo)識(shí)則不允許在同一網(wǎng)段內(nèi)重復(fù)出現(xiàn)。

舉個(gè)例子來(lái)說(shuō):比如說(shuō)我在石家莊(好像不用比如昂),我所在的小區(qū)的某一棟樓就相當(dāng)于是網(wǎng)絡(luò)標(biāo)識(shí),某一棟樓的第幾戶就相當(dāng)于是我的主機(jī)標(biāo)識(shí),當(dāng)然如果你有整棟樓的話,那就當(dāng)我沒(méi)說(shuō)。你可以通過(guò)xx省xx市xx區(qū)xx路xx小區(qū)xx棟來(lái)定位我的網(wǎng)絡(luò)標(biāo)識(shí),這一棟的第幾戶就相當(dāng)于是我的網(wǎng)絡(luò)標(biāo)識(shí)。

IP 地址分為四類,分別是A類、B類、C類、D類、E類,它會(huì)根據(jù) IP 地址中的第 1 位到第 4 位的比特對(duì)網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)進(jìn)行分類。

A 類:(1.0.0.0 - 126.0.0.0)(默認(rèn)子網(wǎng)掩碼:255.0.0.0 或 0xFF000000)第一個(gè)字節(jié)為網(wǎng)絡(luò)號(hào),后三個(gè)字節(jié)為主機(jī)號(hào)。該類 IP 地址的最前面為 0 ,所以地址的網(wǎng)絡(luò)號(hào)取值于 1~126 之間。一般用于大型網(wǎng)絡(luò)。

B 類:(128.0.0.0 - 191.255.0.0)(默認(rèn)子網(wǎng)掩碼:255.255.0.0 或 0xFFFF0000)前兩個(gè)字節(jié)為網(wǎng)絡(luò)號(hào),后兩個(gè)字節(jié)為主機(jī)號(hào)。該類 IP 地址的最前面為 10 ,所以地址的網(wǎng)絡(luò)號(hào)取值于 128~191 之間。一般用于中等規(guī)模網(wǎng)絡(luò)。

C 類:(192.0.0.0 - 223.255.255.0)(子網(wǎng)掩碼:255.255.255.0 或 0xFFFFFF00)前三個(gè)字節(jié)為網(wǎng)絡(luò)號(hào),最后一個(gè)字節(jié)為主機(jī)號(hào)。該類 IP 地址的最前面為 110 ,所以地址的網(wǎng)絡(luò)號(hào)取值于 192~223 之間。一般用于小型網(wǎng)絡(luò)。

D 類:是多播地址。該類 IP 地址的最前面為 1110 ,所以地址的網(wǎng)絡(luò)號(hào)取值于 224~239 之間。一般用于多路廣播用戶。

E 類:是保留地址。該類 IP 地址的最前面為 1111 ,所以地址的網(wǎng)絡(luò)號(hào)取值于 240~255 之間。

為了方便理解,我畫了一張 IP 地址分類圖,如下所示

根據(jù)不同的 IP 范圍,有下面不同的地總空間分類

子網(wǎng)掩碼

子網(wǎng)掩碼(subnet mask)又叫做網(wǎng)絡(luò)掩碼,它是一種用來(lái)指明一個(gè) IP 地址的哪些位標(biāo)識(shí)的是主機(jī)所在的網(wǎng)絡(luò)。子網(wǎng)掩碼是一個(gè) 32位 地址,用于屏蔽 IP 地址的一部分以區(qū)別網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)。

一個(gè) IP 地址只要確定了其分類,也就確定了它的網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí),由此,各個(gè)分類所表示的網(wǎng)絡(luò)標(biāo)識(shí)范圍如下

用1表示 IP 網(wǎng)絡(luò)地址的比特范圍,0表示 IP 主機(jī)地址的范圍。將他們用十進(jìn)制表示,那么這三類的表示如下

保留地址

在IPv4 的幾類地址中,有幾個(gè)保留的地址空間不能在互聯(lián)網(wǎng)上使用。這些地址用于特殊目的,不能在局域網(wǎng)外部路由。

IP 協(xié)議版本

目前,全球 Internet 中共存有兩個(gè)IP版本:IP 版本 4(IPv4)和IP 版本6(IPv6)。 IP 地址由二進(jìn)制值組成,可驅(qū)動(dòng) Internet 上所有數(shù)據(jù)的路由。 IPv4 地址的長(zhǎng)度為 32 位,而 IPv6 地址的長(zhǎng)度為 128 位。

Internet IP 資源由Internet 分配號(hào)碼機(jī)構(gòu)(IANA)分配給區(qū)域 Internet 注冊(cè)表(RIR),例如 APNIC,該機(jī)構(gòu)負(fù)責(zé)根 DNS ,IP 尋址和其他 Internet 協(xié)議資源。

下面我們就一起認(rèn)識(shí)一下 IP 協(xié)議中非常重要的兩個(gè)版本 IPv4 和 IPv6。

IPv4

IPv4 的全稱是Internet Protocol version 4,是 Internet 協(xié)議的第四版。IPv4 是一種無(wú)連接的協(xié)議,這個(gè)協(xié)議會(huì)盡最大努力交付數(shù)據(jù)包,也就是說(shuō)它不能保證任何數(shù)據(jù)包能到達(dá)目的地,也不能保證所有的數(shù)據(jù)包都會(huì)按照正確的順序到達(dá)目標(biāo)主機(jī),這些都是由上層比如傳輸控制協(xié)議控制的。也就是說(shuō),單從 IP 看來(lái),這是一個(gè)不可靠的協(xié)議。

前面我們講過(guò)網(wǎng)絡(luò)層分組被稱為數(shù)據(jù)報(bào),所以我們接下來(lái)的敘述也會(huì)圍繞著數(shù)據(jù)報(bào)展開。

IPv4 的數(shù)據(jù)報(bào)格式如下

IPv4 數(shù)據(jù)報(bào)中的關(guān)鍵字及其解釋

版本字段(Version)占用 4 bit,通信雙方使用的版本必須一致,對(duì)于 IPv4 版本來(lái)說(shuō),字段值是 4。首部長(zhǎng)度(Internet Header Length)占用 4 bit,首部長(zhǎng)度說(shuō)明首部有多少 32 位(4 字節(jié))。由于 IPv4 首部可能包含不確定的選項(xiàng),因此這個(gè)字段被用來(lái)確定數(shù)據(jù)的偏移量。大多數(shù) IP 不包含這個(gè)選項(xiàng),所以一般首部長(zhǎng)度設(shè)置為 5, 數(shù)據(jù)報(bào)為 20 字節(jié) 。服務(wù)類型(Differential Services Codepoint,DSCP)占用 6 bit,以便使用不同的 IP 數(shù)據(jù)報(bào),比如一些低時(shí)延、高吞吐量和可靠性的數(shù)據(jù)報(bào)。服務(wù)類型如下表所示

擁塞通告(Explicit Congestion Notification,ECN)占用 2 bit,它允許在不丟棄報(bào)文的同時(shí)通知對(duì)方網(wǎng)絡(luò)擁塞的發(fā)生。ECN 是一種可選的功能,僅當(dāng)兩端都支持并希望使用,且底層網(wǎng)絡(luò)支持時(shí)才被使用。 最開始 DSCP 和 ECN 統(tǒng)稱為 TOS,也就是區(qū)分服務(wù),但是后來(lái)被細(xì)化為了 DSCP 和 ECN。

數(shù)據(jù)報(bào)長(zhǎng)度(Total Length)占用 16 bit,這 16 位是包括在數(shù)據(jù)在內(nèi)的總長(zhǎng)度,理論上數(shù)據(jù)報(bào)的總長(zhǎng)度為 2 的 16 次冪 - 1,最大長(zhǎng)度是 65535 字節(jié),但是實(shí)際上數(shù)據(jù)報(bào)很少有超過(guò) 1500 字節(jié)的。IP 規(guī)定所有主機(jī)都必須支持最小 576 字節(jié)的報(bào)文,但大多數(shù)現(xiàn)代主機(jī)支持更大的報(bào)文。當(dāng)下層的數(shù)據(jù)鏈路協(xié)議的最大傳輸單元(MTU)字段的值小于 IP 報(bào)文長(zhǎng)度時(shí),報(bào)文就必須被分片。

標(biāo)識(shí)符(Identification)占用 16 bit,這個(gè)字段用來(lái)標(biāo)識(shí)所有的分片,因?yàn)榉制灰欢〞?huì)按序到達(dá),所以到達(dá)目標(biāo)主機(jī)的所有分片會(huì)進(jìn)行重組,每產(chǎn)生一個(gè)數(shù)據(jù)報(bào),計(jì)數(shù)器加1,并賦值給此字段。

標(biāo)志(Flags)占用 3 bit,標(biāo)志用于控制和識(shí)別分片,這 3 位分別是

0 位:保留,必須為0;1 位:禁止分片(Don’t Fragment,DF),當(dāng) DF = 0 時(shí)才允許分片;2 位:更多分片(More Fragment,MF),MF = 1 代表后面還有分片,MF = 0 代表已經(jīng)是最后一個(gè)分片。

如果 DF 標(biāo)志被設(shè)置為 1 ,但是路由要求必須進(jìn)行分片,那么這條數(shù)據(jù)報(bào)回丟棄

分片偏移(Fragment Offset)占用 13 位,它指明了每個(gè)分片相對(duì)于原始報(bào)文開頭的偏移量,以 8 字節(jié)作單位。

存活時(shí)間(Time To Live,TTL)占用 8 位,存活時(shí)間避免報(bào)文在互聯(lián)網(wǎng)中迷失,比如陷入路由環(huán)路。存活時(shí)間以秒為單位,但小于一秒的時(shí)間均向上取整到一秒。在現(xiàn)實(shí)中,這實(shí)際上成了一個(gè)跳數(shù)計(jì)數(shù)器:報(bào)文經(jīng)過(guò)的每個(gè)路由器都將此字段減 1,當(dāng)此字段等于 0 時(shí),報(bào)文不再向下一跳傳送并被丟棄,這個(gè)字段最大值是 255。

協(xié)議(Protocol)占用 8 位,這個(gè)字段定義了報(bào)文數(shù)據(jù)區(qū)使用的協(xié)議。協(xié)議內(nèi)容可以在 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml 官網(wǎng)上獲取。

首部校驗(yàn)和(Header Checksum)占用 16 位,首部校驗(yàn)和會(huì)對(duì)字段進(jìn)行糾錯(cuò)檢查,在每一跳中,路由器都要重新計(jì)算出的首部檢驗(yàn)和并與此字段進(jìn)行比對(duì),如果不一致,此報(bào)文將會(huì)被丟棄。

源地址(Source address)占用 32 位,它是 IPv4 地址的構(gòu)成條件,源地址指的是數(shù)據(jù)報(bào)的發(fā)送方

目的地址(Destination address)占用 32 位,它是 IPv4 地址的構(gòu)成條件,目標(biāo)地址指的是數(shù)據(jù)報(bào)的接收方

選項(xiàng)(Options)是附加字段,選項(xiàng)字段占用 1 - 40 個(gè)字節(jié)不等,一般會(huì)跟在目的地址之后。如果首部長(zhǎng)度 > 5,就應(yīng)該考慮選項(xiàng)字段。

數(shù)據(jù)不是首部的一部分,因此并不被包含在首部檢驗(yàn)和中。

在 IP 發(fā)送的過(guò)程中,每個(gè)數(shù)據(jù)報(bào)的大小是不同的,每個(gè)鏈路層協(xié)議能承載的網(wǎng)絡(luò)層分組也不一樣,有的協(xié)議能夠承載大數(shù)據(jù)報(bào),有的卻只能承載很小的數(shù)據(jù)報(bào),不同的鏈路層能夠承載的數(shù)據(jù)報(bào)大小如下。

IPv4 分片

一個(gè)鏈路層幀能承載的最大數(shù)據(jù)量叫做最大傳輸單元(Maximum Transmission Unit, MTU),每個(gè) IP 數(shù)據(jù)報(bào)封裝在鏈路層幀中從一臺(tái)路由器傳到下一臺(tái)路由器。因?yàn)槊總€(gè)鏈路層所支持的最大 MTU 不一樣,當(dāng)數(shù)據(jù)報(bào)的大小超過(guò) MTU 后,會(huì)在鏈路層進(jìn)行分片,每個(gè)數(shù)據(jù)報(bào)會(huì)在鏈路層單獨(dú)封裝,每個(gè)較小的片都被稱為片(fragement)。

每個(gè)片在到達(dá)目的地后會(huì)進(jìn)行重組,準(zhǔn)確的來(lái)說(shuō)是在運(yùn)輸層之前會(huì)進(jìn)行重組,TCP 和 UDP 都會(huì)希望發(fā)送完整的、未分片的報(bào)文,出于性能的原因,分片重組不會(huì)在路由器中進(jìn)行,而是會(huì)在目標(biāo)主機(jī)中進(jìn)行重組。

當(dāng)目標(biāo)主機(jī)收到從發(fā)送端發(fā)送過(guò)來(lái)的數(shù)據(jù)報(bào)后,它需要確定這些數(shù)據(jù)報(bào)中的分片是否是由源數(shù)據(jù)報(bào)分片傳遞過(guò)來(lái)的,如果是的話,還需要確定何時(shí)收到了分片中的最后一片,并且這些片會(huì)如何拼接一起成為數(shù)據(jù)報(bào)。

針對(duì)這些潛在的問(wèn)題,IPv4 設(shè)計(jì)者將標(biāo)識(shí)、標(biāo)志和片偏移放在 IP 數(shù)據(jù)報(bào)首部中。當(dāng)生成一個(gè)數(shù)據(jù)報(bào)時(shí),發(fā)送主機(jī)會(huì)為該數(shù)據(jù)報(bào)設(shè)置源和目的地址的同時(shí)貼上標(biāo)識(shí)號(hào)。發(fā)送主機(jī)通常將它發(fā)送的每個(gè)數(shù)據(jù)報(bào)的標(biāo)識(shí) + 1。當(dāng)某路由器需要對(duì)一個(gè)數(shù)據(jù)報(bào)分片時(shí),形成的每個(gè)數(shù)據(jù)報(bào)具有初始數(shù)據(jù)報(bào)的源地址、目標(biāo)地址和標(biāo)識(shí)號(hào)。當(dāng)目的地從同一發(fā)送主機(jī)收到一系列數(shù)據(jù)報(bào)時(shí),它能夠檢查數(shù)據(jù)報(bào)的標(biāo)識(shí)號(hào)以確定哪些數(shù)據(jù)是由源數(shù)據(jù)報(bào)發(fā)送過(guò)來(lái)的。由于 IP 是一種不可靠的服務(wù),分片可能會(huì)在網(wǎng)路中丟失,鑒于這種情況,通常會(huì)把分片的最后一個(gè)比特設(shè)置為 0 ,其他分片設(shè)置為 1,同時(shí)使用偏移字段指定分片應(yīng)該在數(shù)據(jù)報(bào)的哪個(gè)位置。

IPv4 尋址

IPv4 支持三種不同類型的尋址模式,分別是

單播尋址模式:在這種模式下,數(shù)據(jù)只發(fā)送到一個(gè)目的地的主機(jī)。

廣播尋址模式:在此模式下,數(shù)據(jù)包將被尋址到網(wǎng)段中的所有主機(jī)。這里客戶端發(fā)送一個(gè)數(shù)據(jù)包,由所有服務(wù)器接收:

組播尋址模式:此模式是前兩種模式的混合,即發(fā)送的數(shù)據(jù)包既不指向單個(gè)主機(jī)也不指定段上的所有主機(jī)

IPv6

隨著端系統(tǒng)接入的越來(lái)越多,IPv4 已經(jīng)無(wú)法滿足分配了,所以,IPv6 應(yīng)運(yùn)而生,IPv6 就是為了解決 IPv4 的地址耗盡問(wèn)題而被標(biāo)準(zhǔn)化的網(wǎng)際協(xié)議。IPv4 的地址長(zhǎng)度為 4 個(gè) 8 字節(jié),即 32 比特, 而 IPv6 的地址長(zhǎng)度是原來(lái)的四倍,也就是 128 比特,一般寫成 8 個(gè) 16 位字節(jié)。

從 IPv4 切換到 IPv6 及其耗時(shí),需要將網(wǎng)絡(luò)中所有的主機(jī)和路由器的 IP 地址進(jìn)行設(shè)置,在互聯(lián)網(wǎng)不斷普及的今天,替換所有的 IP 是一個(gè)工作量及其龐大的任務(wù)。我們后面會(huì)說(shuō)。

我們先來(lái)看一下 IPv6 的地址是怎樣的

版本與 IPv4 一樣,版本號(hào)由 4 bit 構(gòu)成,IPv6 版本號(hào)的值為 6。流量類型(Traffic Class)占用 8 bit,它就相當(dāng)于 IPv4 中的服務(wù)類型(Type Of Service)。流標(biāo)簽(Flow Label)占用 20 bit,這 20 比特用于標(biāo)識(shí)一條數(shù)據(jù)報(bào)的流,能夠?qū)σ粭l流中的某些數(shù)據(jù)報(bào)給出優(yōu)先權(quán),或者它能夠用來(lái)對(duì)來(lái)自某些應(yīng)用的數(shù)據(jù)報(bào)給出更高的優(yōu)先權(quán),只有流標(biāo)簽、源地址和目標(biāo)地址一致時(shí),才會(huì)被認(rèn)為是一個(gè)流。有效載荷長(zhǎng)度(Payload Length)占用 16 bit,這 16 比特值作為一個(gè)無(wú)符號(hào)整數(shù),它給出了在 IPv6 數(shù)據(jù)報(bào)中跟在鼎昌 40 字節(jié)數(shù)據(jù)報(bào)首部后面的字節(jié)數(shù)量。下一個(gè)首部(Next Header)占用 8 bit,它用于標(biāo)識(shí)數(shù)據(jù)報(bào)中的內(nèi)容需要交付給哪個(gè)協(xié)議,是 TCP 協(xié)議還是 UDP 協(xié)議。跳限制(Hop Limit)占用 8 bit,這個(gè)字段與 IPv4 的 TTL 意思相同。數(shù)據(jù)每經(jīng)過(guò)一次路由就會(huì)減 1,減到 0 則會(huì)丟棄數(shù)據(jù)。源地址(Source Address)占用 128 bit (8 個(gè) 16 位 ),表示發(fā)送端的 IP 地址。目標(biāo)地址(Destination Address)占用 128 bit (8 個(gè) 16 位 ),表示接收端 IP 地址。

可以看到,相較于 IPv4 ,IPv6 取消了下面幾個(gè)字段

標(biāo)識(shí)符、標(biāo)志和比特偏移:IPv6 不允許在中間路由器上進(jìn)行分片和重新組裝。這種操作只能在端系統(tǒng)上進(jìn)行,IPv6 將這個(gè)功能放在端系統(tǒng)中,加快了網(wǎng)絡(luò)中的轉(zhuǎn)發(fā)速度。首部校驗(yàn)和:因?yàn)樵谶\(yùn)輸層和數(shù)據(jù)鏈路執(zhí)行了報(bào)文段完整性校驗(yàn)工作,IP 設(shè)計(jì)者大概覺(jué)得在網(wǎng)絡(luò)層中有首部校驗(yàn)和比較多余,所以去掉了。IP 更多專注的是快速處理分組數(shù)據(jù)選項(xiàng)字段:選項(xiàng)字段不再是標(biāo)準(zhǔn) IP 首部的一部分了,但是它并沒(méi)有消失,而是可能出現(xiàn)在 IPv6 的擴(kuò)展首部,也就是下一個(gè)首部中。

IPv6 擴(kuò)展首部

IPv6 首部長(zhǎng)度固定,無(wú)法將選項(xiàng)字段加入其中,取而代之的是 IPv6 使用了擴(kuò)展首部

擴(kuò)展首部通常介于 IPv6 首部與 TCP/UDP 首部之間,在 IPv4 中可選長(zhǎng)度固定為 40 字節(jié),在 IPv6 中沒(méi)有這樣的限制。IPv6 的擴(kuò)展首部可以是任意長(zhǎng)度。擴(kuò)展首部中還可以包含擴(kuò)展首部協(xié)議和下一個(gè)擴(kuò)展字段。

IPv6 首部中沒(méi)有標(biāo)識(shí)和標(biāo)志字段,對(duì) IP 進(jìn)行分片時(shí),需要使用到擴(kuò)展首部。

具體的擴(kuò)展首部表如下所示

下面我們來(lái)看一下 IPv6 都有哪些特點(diǎn)

IPv6 特點(diǎn)

IPv6 的特點(diǎn)在 IPv4 中得以實(shí)現(xiàn),但是即便實(shí)現(xiàn)了 IPv4 的操作系統(tǒng),也未必實(shí)現(xiàn)了 IPv4 的所有功能。而 IPv6 卻將這些功能大眾化了,也就表明這些功能在 IPv6 已經(jīng)進(jìn)行了實(shí)現(xiàn),這些功能主要有

地址空間變得更大:這是 IPv6 最主要的一個(gè)特點(diǎn),即支持更大的地址空間。

精簡(jiǎn)報(bào)文結(jié)構(gòu): IPv6 要比 IPv4 精簡(jiǎn)很多,IPv4 的報(bào)文長(zhǎng)度不固定,而且有一個(gè)不斷變化的選項(xiàng)字段;IPv6 報(bào)文段固定,并且將選項(xiàng)字段,分片的字段移到了 IPv6 擴(kuò)展頭中,這就極大的精簡(jiǎn)了 IPv6 的報(bào)文結(jié)構(gòu)。

實(shí)現(xiàn)了自動(dòng)配置:IPv6 支持其主機(jī)設(shè)備的狀態(tài)和無(wú)狀態(tài)自動(dòng)配置模式。這樣,沒(méi)有DHCP 服務(wù)器不會(huì)停止跨段通信。

層次化的網(wǎng)絡(luò)結(jié)構(gòu): IPv6 不再像 IPv4 一樣按照 A、B、C等分類來(lái)劃分地址,而是通過(guò) IANA -> RIR -> ISP 這樣的順序來(lái)分配的。IANA 是國(guó)際互聯(lián)網(wǎng)號(hào)碼分配機(jī)構(gòu),RIR 是區(qū)域互聯(lián)網(wǎng)注冊(cè)管理機(jī)構(gòu),ISP 是一些運(yùn)營(yíng)商(例如電信、移動(dòng)、聯(lián)通)。

IPSec:IPv6 的擴(kuò)展報(bào)頭中有一個(gè)認(rèn)證報(bào)頭、封裝安全凈載報(bào)頭,這兩個(gè)報(bào)頭是 IPsec 定義的。通過(guò)這兩個(gè)報(bào)頭網(wǎng)絡(luò)層自己就可以實(shí)現(xiàn)端到端的安全,而無(wú)需像 IPv4 協(xié)議一樣需要其他協(xié)議的幫助。

支持任播:IPv6 引入了一種新的尋址方式,稱為任播尋址。

IPv6 地址

我們知道,IPv6 地址長(zhǎng)度為 128 位,他所能表示的范圍是 2 ^ 128 次冪,這個(gè)數(shù)字非常龐大,幾乎涵蓋了你能想到的所有主機(jī)和路由器,那么 IPv6 該如何表示呢?

一般我們將 128 比特的 IP 地址以每 16 比特為一組,并用:號(hào)進(jìn)行分隔,如果出現(xiàn)連續(xù)的 0 時(shí)還可以將 0 省略,并用::兩個(gè)冒號(hào)隔開,記住,一個(gè) IP 地址只允許出現(xiàn)一次兩個(gè)連續(xù)的冒號(hào)。

下面是一些 IPv6 地址的示例

二進(jìn)制數(shù)表示

用十六進(jìn)制數(shù)表示

出現(xiàn)兩個(gè)冒號(hào)的情況

如上圖所示,A120 和 4CD 中間的 0 被 :: 所取代了。

如何從 IPv4 遷移到 IPv6

我們上面聊了聊 IPv4 和 IPv6 的報(bào)文格式、報(bào)文含義是什么、以及 IPv4 和 IPv6 的特征分別是什么,看完上面的內(nèi)容,你已經(jīng)知道了 IPv4 現(xiàn)在馬上就變的不夠用了,而且隨著 IPv6 的不斷發(fā)展和引用,雖然新型的 IPv6 可以做到向后兼容,即 IPv6 可以收發(fā) IPv4 的數(shù)據(jù)報(bào),但是已經(jīng)部署的具有 IPv4 能力的系統(tǒng)卻不能夠處理 IPv6 數(shù)據(jù)報(bào)。所以 IPv4 噬需遷移到 IPv6,遷移并不意味著將 IPv4 替換為 IPv6。這僅意味著同時(shí)啟用 IPv6 和 IPv4。

那么現(xiàn)在就有一個(gè)問(wèn)題了,IPv4 如何遷移到 IPv6 呢?這就是我們接下來(lái)討論的重點(diǎn)。

標(biāo)志

最簡(jiǎn)單的方式就是設(shè)置一個(gè)標(biāo)志日,指定某個(gè)時(shí)間點(diǎn)和日期,此時(shí)全球的因特網(wǎng)機(jī)器都會(huì)在這時(shí)關(guān)機(jī)從 IPv4 遷移到 IPv6 。上一次重大的技術(shù)遷移是在 35 年前,但是很顯然,不用我過(guò)多解釋,這種情況肯定是不行的。影響不可估量不說(shuō),如何保證全球人類都能知道如何設(shè)置自己的 IPv6 地址?一個(gè)設(shè)計(jì)數(shù)十億臺(tái)機(jī)器的標(biāo)志日現(xiàn)在是想都不敢想的。

隧道技術(shù)

現(xiàn)在已經(jīng)在實(shí)踐中使用的從 IPv4 遷移到 IPv6 的方法是隧道技術(shù)(tunneling)。

什么是隧道技術(shù)呢?

隧道技術(shù)是一種使用互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)設(shè)施在網(wǎng)絡(luò)之間的傳輸數(shù)據(jù)的方式,使用隧道傳遞的數(shù)據(jù)可以是不同協(xié)議的數(shù)據(jù)幀或包。使用隧道技術(shù)所遵從的協(xié)議叫做隧道協(xié)議(tunneling protocol)。隧道協(xié)議會(huì)將這些協(xié)議的數(shù)據(jù)幀或包封裝在新的包頭中發(fā)送。新的包頭提供了路由信息,從而使封裝的負(fù)載數(shù)據(jù)能夠通過(guò)互聯(lián)網(wǎng)絡(luò)進(jìn)行傳遞。

使用隧道技術(shù)一般都會(huì)建一個(gè)隧道,建隧道的依據(jù)如下:

比如兩個(gè) IPv6 節(jié)點(diǎn)(下方 B、E)要使用 IPv6 數(shù)據(jù)報(bào)進(jìn)行交互,但是它們是經(jīng)由兩個(gè) IPv4 的路由器進(jìn)行互聯(lián)的。那么我們就需要將 IPv6 節(jié)點(diǎn)和 IPv4 路由器組成一個(gè)隧道,如下圖所示

借助于隧道,在隧道發(fā)送端的 IPv6 節(jié)點(diǎn)可將整個(gè) IPv6 數(shù)據(jù)報(bào)放到一個(gè) IPv4 數(shù)據(jù)報(bào)的數(shù)據(jù)(有效載荷)字段中,于是,IPv4 數(shù)據(jù)報(bào)的地址被設(shè)置為指向隧道接收端的 IPv6 的節(jié)點(diǎn),比如上面的 E 節(jié)點(diǎn)。然后再發(fā)送給隧道中的第一個(gè)節(jié)點(diǎn) C,如下所示

隧道中間的 IPv4 提供路由,路由器不知道這個(gè) IPv4 內(nèi)部包含一個(gè)指向 IPv6 的地址。隧道接收端的 IPv6 節(jié)點(diǎn)收到 IPv4 數(shù)據(jù)報(bào),會(huì)確定這個(gè) IPv4 數(shù)據(jù)報(bào)含有一個(gè) IPv6 數(shù)據(jù)報(bào),通過(guò)觀察數(shù)據(jù)報(bào)長(zhǎng)度和數(shù)據(jù)得知。然后取出 IPv6 數(shù)據(jù)報(bào),再為 IPv6 提供路由,就好像兩個(gè)節(jié)點(diǎn)直接相連傳輸數(shù)據(jù)報(bào)一樣。