Technorati 標籤: MPLS,LDP,標籤,labelide
01-MPLS標籤報文的格式.oop
實際上,之因此要叫MPLS 爲2.5層協議,是由於標籤是處於IP報文頭和二層報頭之間的.圖中是嵌套了三層標籤.性能
靠近二層頭的標籤叫頂部,考近IP報文頭的標籤叫底部.設計
若是有多個標籤,數據報文在被轉發的時候是利用頂部標籤進行轉發.當頂部移除之後,再利用下一層標籤進行轉發.3d
而每一個標籤的格式爲:blog
每一個標籤爲32 bit(4個字節). 分爲4個字段,每一個字段都有分工.ip
LABEL: 頭20個bit,是標籤範圍.cisco定義的標籤的是<16-1048575>.ci
0-15是保留爲系統用.資源
EXP: 3 bit. 用於IP precedence字段值的攜帶,用於QOS. 範圍0-7.路由
S: 1 bit, 爲了標示該標籤是否爲最後一個標籤再IP頭中.
前面已經說明,最靠近二層幀頭的,那麼最早被轉發。最靠近IP包頭的,最後被轉發使用.
S bit就是提供了這樣一個功能.
S=1, 棧底. S=0,非棧底.從下面的抓包也能看到,S=0的話,靠近二層幀頭,S=1,靠近3層IP報文頭.
TTL: 8 bit, 範圍0-255,這個定義和IP裏面的time to live是同樣的。
和IP不一樣的是,MPLS的TTL,
有可能初始化的時候就是255.
也有多是從IP包頭中直接複製過來的.
下面是一個MPLS報文的抓包.能夠看到這裏嵌套了2層標籤.
02-LDP協議的做用
LDP-label distribute protocol.
標籤分發協議,前身是TDP.cisco私有.
----------一直都在說, LDP標籤分發,必須基於IGP(ospf,RIP,EIGRP),由於標籤分發表,其實就是IGP路由表的一個映射.因此必須現有IGP,纔會有標籤轉發表.
路由表與標籤之間存在的映射關係-----FEC.
LDP要工做,必需要有底層的IGP.
CISCO的行爲是,IGP路由表裏面每一條路由,都會有一個對應的標籤存在於標籤轉發表.
03-MPLS 標籤報文轉發過程的相關動做
下面的圖,R1--R2--R3--R4爲MPLS域,左邊和右邊都爲IP域.
在IP域中數據包是沒有攜帶標籤的。而在MPLS域中數據包是攜帶了標籤的.
接下來講明一下一個數據包從左到右的過程:IP:A-->R1-->R2-->R3-->R4-->IP:B
須要說明的是,本地收到的標籤,始終是上游或者下游路由器分配過來的。
這樣說吧,若是本地路由器有一個路由明細達到1.1.1.0/24. 那麼從對端就會逐跳向我本端分配相關的標籤.因此,標籤永遠是別人發給個人。我把本地的直連路由映射成本地標籤,再分發給個人上下游路由器。那麼,一個雙向的標籤FEC就創建好了。
04-數據平面和控制平面.
這是理解MPLS轉發的重要基礎.
Control plane:控制平面.
簡單來講,就是凡是處理協議,路由表,標籤交換表,這些內部表項和協議的時候都是用的控制平面.
Data plane:數據平面.
而數據平面,意思是說,IP轉發,標籤轉發報文的時候,會用數據平面。
對於數據平面的理解以下:
這裏,有幾種狀況組合:
1, 收到IP,轉發出之後依然是IP.是純IP報文轉發,那麼用的是FIB表項.(CISCO的CEF表)
2, 收到MPLS 報文,轉發出去依然是MPLS 報文,走的是LFIB.標籤轉發表.
3, 有可能收到IP報文,可是須要路由器壓標籤轉發. 那麼依然走FIB(CEF)表---因此爲何CEF標是會攜帶標籤的.
4, 收到MPLS 報文, 轉出是IP報文,這種狀況用於次莫節點彈出,input走LFIB表,output會使用FIB(CEF)表.
關於cisco的流程:
以前我一直都不知道爲何CEF表會有標籤.通過和老師確認,設計的確實頗有道理.
若是接收到一個IP報文,轉出去的時候是MPLS標籤報文。這個時候首先路由器收到之後會查CEF表,cisco會將LFIB中須要壓入標籤的條目,將標籤複製到CEF表中,這樣收到IP報文,只須要查一次CEF表就知道應該壓入哪一個標籤進行轉發,而不是說首先查CEF表,知道了須要壓標籤,可是CEF表中又沒有標籤,從而進一步查詢LFIB表,查兩次表項和查一次表項,對於節約路由器的性能資源的意義是徹底不同的。
連老師總結版:
LIB------show mpls ldp binding 查看LIB表項.
FIB------show ip cef detail 查看FIB.注意,必定要加上detail,不然不能看到label的分發狀況.
LFIB-----show mpls forwarding table.
在故障排查的時候.外層標籤交換,查的必定是mpls forwarding table(LFIB表)
好比.R1-----R2----R3----R4.
R1將mpls 報文轉給R2,R2要查的就是LFIB.若是LFIB(mpls forwarding table)沒有標籤,這個時候,根據兩個層面的映射原理,你須要查看LIB表(show mpls ldp binding),在那裏面會有緣由爲何R2的mpls forwarding table沒有分發標籤.
例如,你們都知道,LDP的tranport ID是會用loopback來作的.若是IGP是OSPF.無論你環回口配置爲32位掩碼,仍是24位掩碼,ospf都會將其通告爲32位掩碼出去(除非修改ip ospf network point-to-point)纔會通告真實掩碼.
這個時候,本地是24位掩碼,通告到對端是32位。上游路由器爲本端的32位分發標籤.明顯是錯的.由於24位掩碼的沒有獲得標籤,而32位的獲得了。轉發的時候,mpls forwarding table必定有問題.由於LFIB是基於LIB創建的,因此最後必定得查LIB才能找初真實的緣由.
將3個路由器的環回口掩碼都修改成24位的.
而後在R2上面,看到3.3.3.3的標籤是:
這個時候,R2上面,3.3.3.3的outgoing不是pop label.是no-label.
而後再show LIB表,根本就沒有標籤,正常的狀況下,對端R3應該分配一個implit-label過來.問題就已經出來了.
這就是傳的32位路由,分的是32位路由。沒有對24位路由分配標籤.
緣由在於,R3上面,對本身的3.3.3.3分了implit-null,24位的標籤. 到R2就變成32位的標籤了。已經錯位了.
方案:
1, 建議環回都是用loopback /32的掩碼.
2, 要不在loop interface下面加上ip ospf network point-to-point.