揭開(kāi)MPLS的神秘面紗,這些你都知道嗎?
在正式學(xué)習(xí)MPLS之前,我們先復(fù)習(xí)一下在NA、NP中反復(fù)學(xué)習(xí)的IP轉(zhuǎn)發(fā)原理。
在上圖中,關(guān)于PC-A和PC-B之間互相訪問(wèn)的過(guò)程中:
- 所有三層網(wǎng)絡(luò)設(shè)備形成源和目的的路由條目
- PC-A發(fā)出報(bào)文,source-IP為A,destination-IP為B
- R1收到報(bào)文后,根據(jù)目的IP檢查自己的路由表,查詢得到出接口,將數(shù)據(jù)包從出接口發(fā)出
- R2、R3同樣如此,一直講數(shù)據(jù)包傳遞到PC-B
- PC-B做出回包,沿反方向傳回?cái)?shù)據(jù)
其中省略了二層mac地址的ARP查詢和重寫數(shù)據(jù)幀的內(nèi)容。
簡(jiǎn)而言之:IP數(shù)據(jù)報(bào)文在傳遞的過(guò)程中,根據(jù)目的IP地址,查詢路由表,得到出接口將數(shù)據(jù)發(fā)出,源目的IP地址保持不變,mac地址逐跳改寫。
上面這個(gè)是我們耳熟能詳?shù)腎P轉(zhuǎn)發(fā)原理。
其中我們?yōu)榱朔奖憷斫?,隱藏了其在轉(zhuǎn)發(fā)過(guò)程中真實(shí)的一幕,即路由器收到IP報(bào)文時(shí),查詢的其實(shí)并不是路由表(RIB),而是轉(zhuǎn)發(fā)表(LIB)。
我們需要復(fù)習(xí)一下在NP交換部分所講過(guò)的交換工作原理。
最早期,交換機(jī)在交換數(shù)據(jù)幀時(shí)采用的交換方式我們稱之為進(jìn)程交換,所有的報(bào)文在交換時(shí)都需要經(jīng)過(guò)CPU查詢處理,導(dǎo)致交換效率一直無(wú)法提升。隨后,新一代交換方式出現(xiàn),即采用數(shù)據(jù)流的交換方式,我們將源目的IP、源目的mac、源目的端口及入接口都相同的流量稱為同一個(gè)數(shù)據(jù)流,交換機(jī)在處理這些數(shù)據(jù)時(shí),只需要對(duì)第一個(gè)報(bào)文使用CPU進(jìn)行查詢,后續(xù)的所有報(bào)文全都按照第一個(gè)報(bào)文的交換方式進(jìn)行處理,大大提高了交換效率。
而cisco根據(jù)數(shù)據(jù)流交換方式推出了自己獨(dú)有的交換方式,在進(jìn)程交換中,存在一個(gè)問(wèn)題,即只有有流量觸發(fā)后才會(huì)產(chǎn)生出對(duì)應(yīng)的交換緩存,如果是處理大量不同數(shù)據(jù)流時(shí),其實(shí)交換效率和進(jìn)程交換一樣慢;為了解決這個(gè)問(wèn)題,cisco將其優(yōu)化改進(jìn),利用交換機(jī)的閑時(shí)資源,提前計(jì)算出可能會(huì)收到的數(shù)據(jù)流的轉(zhuǎn)發(fā)信息,將其載入緩存,當(dāng)收到數(shù)據(jù)流時(shí),直接使用預(yù)先緩存的轉(zhuǎn)發(fā)信息處理報(bào)文,實(shí)現(xiàn)了正真的基于硬件的交換方式,cisco把這種方式成為思科特快轉(zhuǎn)發(fā)(CEF)。
正是由于CEF的高效,cisco在新的路由產(chǎn)品中也移植了這個(gè)功能,所以現(xiàn)在大家所能接觸到的思科設(shè)備都具備CEF功能。
而我們所謂的轉(zhuǎn)發(fā)表其實(shí)就是CEF表,CEF表示根據(jù)路由表產(chǎn)生的,其不像路由表有大量的遞歸內(nèi)容,CEF表中顯示的就是一個(gè)數(shù)據(jù)包如果匹配中其下一步應(yīng)該從哪個(gè)接口發(fā)出,簡(jiǎn)單高效。
比如下面的這個(gè)路由表(RIB):
路由就會(huì)出現(xiàn)需要遞歸查詢的情況。
而我們?nèi)タ匆幌翪EF表(FIB):
路由器在閑時(shí)會(huì)根據(jù)路由表的信息,提前計(jì)算好轉(zhuǎn)發(fā)信息,收到去往4.4.4.4的數(shù)據(jù)包直接從出接口F0/0發(fā)出。
- 這張表我們就叫做FIB:轉(zhuǎn)發(fā)信息庫(kù)。
- 而FIB是根據(jù)路由表產(chǎn)生的,路由表我們稱為RIB:路由信息庫(kù)
- 設(shè)備在收到IP報(bào)文時(shí),其查詢的其實(shí)是FIB并不是RIB,如果將CEF功能關(guān)閉,這是才會(huì)查詢RIB即路由表
以上是我們?cè)贜A、NP中所學(xué)的IP轉(zhuǎn)發(fā)原理的內(nèi)容,做一些補(bǔ)充。
下面,我們開(kāi)始揭開(kāi)MPLS的神秘面紗,來(lái)看一看內(nèi)里乾坤。
MPLS(Multiprotocol Label Switch)最初是用來(lái)提高路由器的轉(zhuǎn)發(fā)速度而提出的一個(gè)協(xié)議,但隨著技術(shù)發(fā)展,設(shè)備轉(zhuǎn)發(fā)性能越來(lái)越強(qiáng),其加快轉(zhuǎn)發(fā)速度的優(yōu)勢(shì)逐漸弱化,而多層MPLS報(bào)頭嵌套的設(shè)計(jì)成為了其最出彩的地方。
目前用得比較多的場(chǎng)景主要是解決BGP路由黑洞問(wèn)題和MPLS VPN數(shù)據(jù)轉(zhuǎn)發(fā)。
首先,我們需要對(duì)MPLS有個(gè)大概的認(rèn)識(shí),MPLS在傳遞報(bào)文時(shí)會(huì)在二層幀頭和三層報(bào)頭中間插入MPLS報(bào)頭,所以很多人叫它2.5層。
他的報(bào)文結(jié)構(gòu)比IP報(bào)頭簡(jiǎn)單得多,也小地多,只有4個(gè)字節(jié)(32bits)。
結(jié)構(gòu)如下:
- 前20位位標(biāo)簽位,用于表示當(dāng)前的標(biāo)簽
- EXP協(xié)議中未作定義,一般用作COS
- S為棧底位,用于表示該MPLS報(bào)頭是否為最后一個(gè)MPLS報(bào)頭
TTL相信不用解釋了
如此簡(jiǎn)單的接口我相信你看過(guò)一次就能記住,同樣,設(shè)備在處理MPLS報(bào)文時(shí)也會(huì)比IP報(bào)文處理效率更高。
在MPLS中有一些專業(yè)術(shù)語(yǔ)必須要了解。
- FEC:Forwarding Equivalence Class,F(xiàn)EC(轉(zhuǎn)發(fā)等價(jià)類),是在轉(zhuǎn)發(fā)過(guò)程中以等價(jià)的方式處理的一組數(shù)據(jù)分組。可以通過(guò)地址、隧道、COS等來(lái)標(biāo)識(shí)創(chuàng)建FEC,目前看到的MPLS中只是一條路由對(duì)應(yīng)一個(gè)FEC。通常在一臺(tái)設(shè)備上,對(duì)一個(gè)FEC分配相同的標(biāo)簽。
- 標(biāo)簽(Label):是一個(gè)比較短的,定長(zhǎng)的,通常只具有局部意義的標(biāo)識(shí)(類似mac地址),這些標(biāo)簽通常位于數(shù)據(jù)鏈路層的數(shù)據(jù)鏈路層封裝頭和三層數(shù)據(jù)包之間,標(biāo)簽通過(guò)綁定過(guò)程同F(xiàn)EC相映射,即一個(gè)FEC對(duì)應(yīng)一個(gè)標(biāo)簽。
- LSP:標(biāo)簽交換通道。一個(gè)FEC的數(shù)據(jù)流,在不同的節(jié)點(diǎn)被賦予確定的標(biāo)簽,數(shù)據(jù)轉(zhuǎn)發(fā)按照這些標(biāo)簽進(jìn)行。數(shù)據(jù)流所走的路徑就是LSP。
- LSR:Label Switching Router,LSR是MPLS的網(wǎng)絡(luò)的核心交換機(jī),它提供標(biāo)簽交換和標(biāo)簽分發(fā)功能。
- LER:Label Switching Edge Router,在MPLS的網(wǎng)絡(luò)邊緣,進(jìn)入到MPLS網(wǎng)絡(luò)的流量由LER分為不同的FEC,并為這些FEC請(qǐng)求相應(yīng)的標(biāo)簽。它提供流量分類和標(biāo)簽的映射、標(biāo)簽的移除功能。
了解了上面這些專業(yè)術(shù)語(yǔ),那么我們研究一下數(shù)據(jù)是如何通過(guò)MPLS進(jìn)行傳遞的,和IP之間有什么區(qū)別:
在上圖中,我們需要解決幾個(gè)問(wèn)題:
- 標(biāo)簽是怎么產(chǎn)生的?
- IP報(bào)文是怎么變成MPLS報(bào)文的?
- 報(bào)文是如何從源傳遞到目的的?
(1)標(biāo)簽是怎么產(chǎn)生的?
- 為每一條路由產(chǎn)生一個(gè)唯一標(biāo)簽(local標(biāo)簽,也叫 in標(biāo)簽)
- 將這些標(biāo)簽傳遞給MPLS的鄰居(remote標(biāo)簽,也叫out標(biāo)簽)
(2)IP報(bào)文是怎么變成MPLS報(bào)文的?
在LER上,壓入標(biāo)簽(根據(jù)IP報(bào)文的目的IP地址所對(duì)應(yīng)的路由的標(biāo)簽)
(3)報(bào)文是如何從源傳遞到目的的?
- A發(fā)出IP報(bào)文,R1收到后查詢FIB,得知需要壓入標(biāo)簽
- R1將報(bào)文轉(zhuǎn)發(fā)給R2,R2收到MPLS報(bào)文,查詢LFIB表中in標(biāo)簽,將原有的標(biāo)簽替換成現(xiàn)在這個(gè)in標(biāo)簽對(duì)應(yīng)的out標(biāo)簽值
- 到達(dá)R3后,查詢in標(biāo)簽,發(fā)現(xiàn)對(duì)應(yīng)out標(biāo)簽為pop,則彈出最頂層標(biāo)簽,還原成IP報(bào)文,轉(zhuǎn)發(fā)給R4
- R4收到IP報(bào)文后,查詢FIB表,將報(bào)文轉(zhuǎn)發(fā)給B
其中涉及到幾個(gè)動(dòng)作:
- push壓入:為報(bào)文添加MPLS報(bào)頭
- swap替換:根據(jù)in標(biāo)簽查詢的結(jié)果,將標(biāo)簽替換成out標(biāo)簽的值
- pop 彈出:將最頂層的MPLS報(bào)頭移除
- untag 彈出:將所有MPLS報(bào)頭都移除
- PHP機(jī)制:倒數(shù)第二跳彈出,減少最后一條設(shè)備的查表次數(shù)
如果沒(méi)有倒數(shù)第二跳彈出機(jī)制,在最后一條設(shè)備上才彈出標(biāo)簽,則在最后一條設(shè)備上首先需要查詢LFIB表,得知需要彈出標(biāo)簽,彈出標(biāo)簽后變成IP報(bào)文,需要再次查詢FIB表,共需要查詢2次,而在倒數(shù)第二跳設(shè)備上彈出,變成IP報(bào)文后,最后一條設(shè)備就只需查詢FIB表即可,只查一次。
這些就是MPLS的原理部分,下次我們?cè)倮^續(xù)研究MPLS的協(xié)議。