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