MPLS介紹
Multi-Protocol Label Switching (多協議標籤交換)
Multi-Protocol:支持多三層協議,如IP、IPv6、IPX等
Label Switching:在所承載的報文前加上標籤棧、基於標籤做轉發
MPLS是一種新的轉發機制,數據在MPLS網絡中是根據標籤進行轉發
一般而言MPLS的標籤對應的是目的地址(路由前綴)
MPLS依賴IP路由及CEF交換
MPLS術語:
RIB:路由表
FIB:CEF數據轉發表
LIB:標籤數據庫
LFIB:標籤轉發數據庫,它的信息來源,由LIB和FIB共同維護而來的
LSP:標籤交換通道,數據流走的路徑就是LSP
FEC:相當於IP網絡中的網絡前綴,一個路由條目對應一個FEC。每一個FEC生成一個對應的標籤,屬於一個FEC的流量具有相同的轉發方式、轉發路徑和轉發待遇,但是並不是所有擁有相同標籤的報文都屬於一個FEC,因爲這些報文的EXP值可能不相同,執行方式可能不同,因此它們可能屬於不同的FEC
決定報文屬於哪一個FEC的路由器是入棧LSR因爲是它對報文進行分類和壓入標籤
MPLS 路由器名稱
label switch router(LSR)標籤交換路由器,一臺支持MPLS的路由器。能夠理解MPLS標籤並且能夠在數據鏈路層面對MPLS標籤數據包進行交換。有三種類型LSR:
ingress LSR:處於MPLS路由域的邊界,主要針對數據來的方向
Egress LSR:處於MPLS路由域的邊界,主要針對數據出棧方向來說的
intermediate LSR:在MPLS中間的,沒有直接連接IP網絡
MPLS數據包格式:
Label(標籤):標籤有兩種,保留標籤和可用標籤
保留標籤:範圍:0~15 常見保留標籤:0和3 標籤爲0表示它是一個顯示空 標籤爲3表示它是一個隱含空(imp-null)
可用標籤:範圍:16~2^20次方減1 標籤空間還是很大的,標籤具有本地意義,所以說標籤是可以重疊的。
BoS(棧底):MPLS網絡允許對一個數據包壓入多個標籤 比如:MPLS-***網絡環境,就有兩個標籤,分別是:外層標籤(LDP協議分配)和內層標籤(MP-BGP分配)
TTL:MPLS域內的TTL值一般是在MPLS域邊界由ingress LSR路由器直接Copy(拷貝)IP報文裏的TTL字段
EXP(實驗位):用於QoS流量工程,其實QOS流量工程中,就有使用到保留標籤0。
部署MPLS網絡的好處:
採用MPLS,可避免IP路由的逐跳轉發情況,減少對數據包的深入分析,藉助標籤建立二層的快速轉發路徑,使得數據沿着一條預先建立的路徑快速轉發
數據包在進入MPLS網絡的入口,路由器將進行一次三層查找,而在此之後的LSR只進行簡單的標籤交換動作,不需要在進一步分析三層的信息
MPLS可以部署MPLS-***,傳遞不同***客戶端的路由信息。
LDP協議概述:
LDP協議叫標籤分發協議,對IP路由表中的每一條IGP的IP前綴來說,每一臺運行LDP協議的LSR都會進行本地捆綁,也就是說,爲IPv4前綴分配標籤,然後LSR再將該分配的標籤分發給所有的LSR鄰居。從鄰居接收到的標籤轉換爲遠程標籤remote label,之後將遠程標籤和本地標籤存儲於標籤信息庫LIB
在所有捆綁某一特定前綴remote label中,LSR只使用其中一個標籤來確定該前綴的出棧標籤。FIB表來決定該前綴的下一跳是什麼。LSR用這樣的信息來創建它自己的標籤轉發數據庫LFIB
LDP不會爲BGP路由前綴捆綁標籤
LDP鄰居建立:兩個階段,鄰居發現階段和鄰居會話階段
鄰居發現階段:
在接口上激活LDP以後,開始發送LDP的hello包,hello包的源地址是發送該hello包的接口IP,發向224.0.0.2,目的端口號是UDP的646端口,兩邊都是一樣的。互相發送完hello包形成LDP鄰居關係。hello包裏包含了三個地址: 第一個是自己的接口IP地址,第二個是傳輸IP地址,第三個是自己的LDP Route-ID
傳輸IP地址默認等同於LDP Route-ID 傳輸IP地址可以進行手工修改,不管改成什麼一定要保證兩端的傳輸IP地址三層是可達的
2.傳輸地址大的一方,發起TCP三次握手。發起TCP的源就是它的傳輸IP,端口是TCP的隨機端口,目的地址是對端的傳輸IP,目的端口是TCP的646。
LDP會話建立過程:
LDP Hello包頭部報文:真實抓包hello包在上邊:鄰居發現階段第一個圖就是LDP 的hello包報文
l LDP鄰居建立首先發送hello包(基於UDP源和目的端口都是646)
l LDP Router-ID爲6個子節(4字節IP+2字節的LABEL Space ID) 我有在上圖的hello包裏標識出來,粉色字體就是Space-ID
l 兩個路由器建立LDP鄰居,要保證雙方到對方的LDP Router-ID三層可達
l Transport addr除非手工指定,否則等於LDP Router-ID
l LDP router-ID 的選舉和OSPF router-ID一樣
什麼是基於平臺的Space-ID?
比如以上的拓撲圖爲例,R6路由器有一個6.6.6.6/32的路由前綴傳遞給了R2路由器。 R2會爲6.6.6.6/32路由前綴分配一個標籤假設是200。 基於平臺就是,R2會把這個標籤爲200的6.6.6.6/32信息 傳遞給它所有的LDP鄰居,也就是說,R1,R3,R4,R5,R6他們收到R2的關於6.6.6.6/32所捆綁的標籤都是200。這就是基於平臺的標籤,當然也有基於接口的,就是R2爲6.6.6.6/32路由前綴,捆綁標籤,每個接口,它都會捆綁一個關於該前綴路由不一樣的標籤傳遞給它的LDP鄰居。
上邊就是MPLS和LDP的介紹,下邊介紹:LDP標籤的處理方式、PHP次末跳彈出機制、MPLS控制層面和數據層面傳遞、MPLS網絡收斂、MPLS防環、MPLS配置等
LDP標籤的處理方式:insert(imposer or push)壓入、Swap(置換)、PoP(彈出)、untagged(移除)、Aggregate(聚合)
insert(imposer or push)壓入:對數據包壓入標籤,壓入的動作常見於在MPLS域邊界由ingress LSR路由器所完成壓入標籤,可以同時壓入多個標籤。
Swap(置換):對收到的標籤數據包,要將它轉發出去之前,需要把出棧標籤替換成鄰居的標籤,完成置換動作,常見於處於MPLS域中間的LSR路由器所操作。
PoP(彈出):將標籤數據包最頂層標籤彈出,常見於某條路由前綴的倒數第二跳路由器(如果大家不理解這句話也沒關係,下邊會提及到PHP次末跳彈出機制,大家就會懂PoP是怎麼回事)
untagged(移除):將整個標籤棧移除,不管上邊有多少層標籤。 untagged(移除)動作其實是一個很詭異的動作,它存在有時候是很合理的,有時候是很不合理的,還需大家自己慢慢體會
Aggregate(聚合):這個動作也是移除所有標籤,但是它常見於做了彙總路由器身上。
Aggregate的誘因:
第一:在做了彙總的環境下,做彙總的路由器會把彙總的路由的動作設置爲Aggregate動作,因爲我既然能做彙總,那麼我就認爲這條路由就是本地始發的路由
第二:在MPLS-***環境下,PE路由器在和CE路由器直連的網段動作也是Aggregate,因爲它是VRF的直連原因
Untagged的誘因:
第一:下游路由器在傳遞一個IP數據包時,沒有給該IP數據包捆綁任何的標籤值,上游路由器關於該IP數據包就會是Untagged動作
第二:我到下游路由器的傳輸IP地址不可達,或者就是下游路由器根本沒運行LDP協議,也是造成Untagged動作原因,我們可以試驗下,看圖。
R3路由器其實已經發現了R4路由器,因爲我修改了R4的LDP Router-ID,所以R4的傳輸IP地址也跟着改變。R3就是ping不通R4的傳輸IP地址,顯示 no route
關注藍色圈起來的4.4.4.4/32的路由前綴,Outgoing(出棧動作)是Untagged
總結:
與pop不同,pop是有特定的標籤值對應的,而untagged及aggregate是沒有特定的標籤的
Untagged動作,是彈出所有標籤棧,並且跟據LFIB表提示的出接口和下一跳做轉發。
而Aggregate動作則是彈出標籤棧,同時再做進一步的IP查找,可以看到上圖,Aggregate它在LFIB表中沒有直接指示,出接口和下一跳信息
PHP:PHP叫次末跳彈出機制,也可以叫倒數第二跳彈出。簡單來講就是,所有路由器在爲本地直連路由前綴捆綁標籤的時候,都會捆綁一個保留標籤值,值爲3 就是隱含空(imp-null)
下圖R3路由器就是4.4.4.4/32路由前綴的倒數第二跳。 所有路由器收到一個標籤值爲3的保留標籤,那麼路由器關於該前綴的Outgoing(出棧)動作就是PoP
MPLS控制層面和數據層面傳遞:
MPLS環境:IP地址規劃已經標識了,例如:R1的f0/0接口IP地址:192.168.12.1/24 R1的換回口:1.1.1.1/32 剩下路由器依此類推
爲了實驗,我把每臺路由器的標籤空間做了限制,例如:R1路由器標籤範圍:100~199 R2路由器標籤範圍:200~299 剩下路由器依此類推
控制層面:所有路由器運行IGP動態路由協議,假設運行OSPF動態路由協議。運行OSPF協議好處很多,比如第一:保證全網路由可達,第二:保證LDP傳輸IP地址可達
以R4爲觀察點,R4路由器有一個4.4.4.4/32路由前綴,R4會爲它進行本地捆綁標籤,由於是直連,它爲該前綴捆綁的標籤值爲3,然後傳遞給上游鄰居R3
R3從鄰居收到的標籤叫remote label(遠程標籤)裝在進LIB表中。R3也會爲該前綴分配標籤,假設是300,它會把這個捆綁了300的標籤4.4.4.4/32路由前綴通過LDP協議傳遞給上游鄰居R2和R5,同時也會傳遞給R4。 這個時候不會有環路,還記得上邊LDP協議概述的一句話嗎?是這麼講的:在所有捆綁某一特定前綴remote label中,LSR只使用其中一個標籤來確定該前綴的出棧標籤。FIB表來決定該前綴的下一跳是什麼。(如果暫時不理解這句話,沒關係,下邊講到數據層面就會理解)
剩下的路由器(R2、R5、R1)都會做和R3相同的動作,爲該前綴捆綁標籤,然後通過LDP協議把捆綁的本地標籤傳遞給鄰居。
控制層面很簡單,就是IGP路由的學習傳遞,LDP標籤的捆綁和傳遞。
數據層面:
以R1爲觀察點,假設R1下邊有臺PC要去往4.4.4.4/32地址,R1收到了一個普通的IP報文,首先會去查找它的FIB表(CEF數據轉發表) imposed: {203} 要壓入一個203的標籤,所以R1在轉發出去之前壓入一個203標籤
2.數據包到了R2路由器,R2收到一個帶標籤的數據包,會直接查找它的LFIB表(標籤轉發數據庫) R2只會先看Local列表,因爲R2是從鄰居收到的標籤數據包,鄰居的標籤數據包不就是 R2自己Local(本地)捆綁的嗎? LDP協議本地捆綁的標籤是給鄰居使用的,不是給自己使用的。 R2發現Outgoing(出棧)動作要壓入一個303的標籤,303標籤很明顯是R3給的,那R2明明還有R5路由器,它爲什麼一定要用R3路路由器的標籤而不用R5路由器的標籤呢? 還是那句話:在所有捆綁某一特定前綴remote label中,LSR只使用其中一個標籤來確定該前綴的出棧標籤。FIB表來決定該前綴的下一跳是什麼。
因爲R2的FIB表中關於4.4.4.4/32的路由下一跳是R3,所以它使用R3的標籤,而不用R5。不知道你們能不能理解,這也就是爲什麼R3先開始把4.4.4.4/32捆綁的標籤傳給R4,而不會產生 環路原因,因爲R4清楚的知道,4.4.4.4/32是我直連路由網段,我FIB表決定一個標籤數據包的Outgoing(出棧)動作。
3.數據包到了R3路由器後,R3收到了一個帶標籤的數據包,也是直接查找LFIB表(標籤轉發數據庫) R3同樣只會先看Local列表,發現303的標籤Outgoing(出棧)標籤是PoP彈出。 R3就會在轉發這個數據包時候將303標籤彈出,剩一個IP包傳給R4路由器
4.數據包到了R4路由器,R4由於收到的是一個普通的IP包,會直接查找自己的FIB表(CEF轉發表) 發現是connected(直連)然後轉發出去
上邊這就是整個控制層面和數據層面的全部過程,不知道大家有沒有疑惑,R1怎麼知道它收到的是IP包,R2有怎麼知道它收到的是標籤包,這個和它數據包的二層封裝有關係,下邊我們看下報文的二層封裝
首先我們查看R1的報文:二層的封裝有一個Type(類型)字段,這個字段用來標識上層也就是網絡層運行的是什麼協議。R1的Type(類型)字段是:0X0800 這是一個承載的是IPv4報文
我們去查看R2路由器的報文:R2的二層Type(類型)封裝的是MPLS label (0X8847)也就是上層承載的是單播MPLS
MPLS網絡收斂:
假設R2和R3之間鏈路故障,最先收斂的肯定是底層的IGP動態路由協議,只有IGP協議收斂完畢後,LDP才能進行收斂。原因其實很簡單,還是那句話:在所有捆綁某一特定前綴remote label中,LSR只使用其中一個標籤來確定該前綴的出棧標籤。FIB表來決定該前綴的下一跳是什麼。從這句可以看出來其實LFIB表(標籤轉發數據庫)是由FIB表(CEF轉發表)和LIB表(標籤信息庫)共同維護而來的,因爲LFIB表中的Outgoing(出棧)標籤是由FIB表決定
MPLS防環:
LDP的環路檢測機制依賴於IGP協議
如果出現環路(一般是IGP出了問題,如靜態路由的配置錯誤),標籤頭中的TTL將防止標籤包無止盡的被轉發
標籤頭中的TTL與IP頭中的TTL是一樣的,通常拷貝IP頭中的TTL值(當一個IP包進入MPLS網絡時)
MPLS配置:
R1(config)#ip cef 必做:一定要打開CEF交換,貌似CCIE TS考試,會幫你關掉····· 然後你驚喜發現標籤分發會有問題
R1(config)#mpls ldp router-id loopback 0 force 指定LDP的Route-ID (建議使用loopback 接口) 傳輸IP地址默認等於LDP的Route-ID
R1(config-if)#mpls ip 在接口激活MPLS和LDP協議
上邊是必須配置,下邊是選配!!!
R1(config)#mpls label range 100 199 修改可用標籤空間範圍:選則配置,做實驗看效果可以配置
R1(config)#mpls ldp neighbor 1.1.1.1 password cisco 配置認證(選配)無所謂······
R1(config)#mpls ldp neighbor 6.6.6.6 targeted 跨設備單播建立鄰居關係
R1(config)#mpls label protocol ldp | tdp 修改標籤分發協議 tdp是cisco私有的標籤分發協議 ldp和tdp不能互相兼容,也就是一個MPLS網絡只能運行一種協議
查看及驗證命令:
R1#show mpls ldp parameters 查看LDP的相關參數
R1#show mpls interfaces fastEthernet 0/0 查看MPLS接口及相關參數
R1#show mpls ldp discovery detail 查看是否發現鄰居
R1#show mpls ldp neighbor 1.1.1.1 detail 查看MPLS LDP鄰居
R1#show mpls ldp bindings 查看LIB表
R1#show mpls forwarding-table 查看LFIB表
R1#show ip cef 查看CEF表
整個MPLS就講到這裏,有其他問題歡迎留言!
寫這個也是一把辛酸淚啊,這是第三次才寫成功,前兩次手殘了,點到了關閉瀏覽器按鈕····
仝越~