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