MPLS報頭

Technorati 標籤: MPLS,MPLS header

該文檔主要是解釋下面內容:

■MPLS報頭結構和各個主要字段的作用.

■帶標籤的報文是如何進行轉發的

■保留MPLS標籤名稱,以及他們的作用。

■確定MPLS MTU在MPLS網絡中的重要性。

MPLS中,都是用標籤進行交換/PUSH/POP進行數據的轉發。

標籤有三種工作模式:交換/添加/移除

clip_image002

當一個路由器收到一個IP報文的時候,進行的查找是IP查找。在cisco IOS中,進行IP查找的報文進行的是CEF(cisco express forwarding)的查找。而路由器收到一個帶標籤報文的時候,查找是在該路由器的LFIB中進行的.(show mpls forwarding-table).

通過LFIB(標籤查找)的方式進行轉發的話,那麼該報文離開路由器時就應該是帶上標籤的.

下面就是查找CEF表的IP報文的轉發和查找LFIB表的MPLS報文轉發的操作。

clip_image004

下面有幾種情況分別會用到上面的圖,需要建立概念:

如果一臺入站LSR收到一個IP報文並且要將標記後進行轉發那麼就是圖中的IP-to-Local轉發實例。

■如果一個LSR收到一個帶標籤的報文,他需要將標籤去掉轉發出去,就是Label-to-IP轉發實例.

■收到報文攜帶有標籤,轉發出去需要壓入新的上游分發給自己的新標籤,Label-to-label.

■最後就是IP-to-IP,沒有標籤,直接走快轉錶轉發了。也就是傳統的IP轉發,逐跳進行。

下面來看看,目的指向6.1.1.2/24的IP報文進入LSR後,被打上標籤18(18是下游分配給本端的標籤),然後從接口G2/0轉發出去的實例:

clip_image006

從CEF表和LFIB表都可以看到,到目的6.1.1.2的報文,tag imposed 18,是下游分配給本端的標籤,所以18作爲G2/0的出標籤.

CEF交換是唯一一種可以用於標記的報文的IP轉發模式,其他的注入IP快速交換之類的IP轉發模式都是不能用來標記報文的,所以,CEF交換是唯一一種可以與MPLS相結合的IP轉發模式,所以在啓用MPLS功能的時候,首要任務是一定要是能IP CEF(當然現在的版本都是默認CEF打開的,不用手工打開,但需要了解CEF的作用。)

接下來看看LFIB,標籤轉發表。在MPLS中,這個表是相當重要的,就相當於IP中的路由表一樣,通過LFIB建立轉發等價類FEC,相同目的的數據流走一樣的標籤。

clip_image008

這裏有些概念需要澄清一下。

local: 是由LSR自己分配的,但是分配到哪裏?是從自己分配給上游的路由器。

Outgoing: 是由下游路由器分配給本端的標籤。

這裏一共有6個條目,一條條來說。

1, 16 Pop tag [T] 10.1.1.2/32 0 Tu0 point2point //這個是給MPLS TE流量工程tunnel接口相關的,這裏暫時不做解釋。有專題解釋關於MPLS TE的。

可以參考MPLS TE專題系列:http://361531.blog.51cto.com/351531/d-7

或者下載已經整理好的PDF文檔:http://down.51cto.com/data/250965

2, 17 Pop tag 4.1.1.0/24 0 Gi2/0 2.1.1.2

如果收到標籤是17的報文,移除所有的標籤,然後以IP轉發的形式進行傳輸,目的地是4.1.1.0網絡。由接口G2/0作爲出接口.

3, 18 Pop tag 3.1.1.0/24 0 Gi2/0 2.1.1.2

如果收到標籤是18的報文,移除所有的標籤,然後以IP轉發的形式進行傳輸,目的地是3.1.1.0網絡。由接口G2/0作爲出接口

4, 19 19 5.1.1.0/24 0 Gi2/0 2.1.1.2

如果收到標籤是19的報文,首先刪除19這個標籤,然後用19來進行替換(雖然這裏標籤都爲19,但是,一定要注意,第一個local=19是我發給上游路由器的標籤,而第二個19是下游路由器發給我的,標籤可以一樣,但是替換的過程路由器是不會省略的,所以標籤只是本地有效,並不衝突),然後以MPLS報文轉發的形式進行傳輸,目的地是5.1.1.0網絡。由接口G2/0作爲出接口

5, 20 18 6.1.1.0/24 0 Gi2/0 2.1.1.2

如果收到標籤是20的報文,首先刪除20這個標籤,然後用18來進行替換,以MPLS報文轉發的形式進行傳輸,目的地是6.1.1.0網絡。由接口G2/0作爲出接口

6, 21 Aggregate 1.1.1.0/24[V] 416

這個是分配給VRF的標籤.聚合屬性.

說了那麼多標籤,有一種情況是未知標籤,意思就是在本地LFIB數據庫中找不到相關的信息。

按常理來說,上游路由器發送到本端的MPLS 報文,標籤部分實際是本端路由器通告給上游路由器的,所以一定在本端本地LFIB表中能夠找到的,但是因爲一些錯誤或者網絡問題的故障,這些送過來的報文的標籤在本地庫裏面沒有找到。

這個時候,怎麼處理這些報文呢?

LSR可以採取兩種措施,移除以後盡力轉發報文,或者丟棄報文。

CISCO IOS中採取的措施是丟棄行爲。原因是,如果LSR移除標籤進行盡力轉發,他根本就不知道標籤後面攜帶的是什麼報文。是IPv4?IPv6?二層幀?還是其他報文?即使現在轉發出去,也不能保證下游路由器能順利轉發,而且還浪費了硬件資源。

所以,丟,是丟得相當正確的.

在現實生活中,大家都有這樣的經歷,如果一個事情從頭到尾都已經了完整的計劃和精密的部署,都不一定能成功。要保證一個事情99%是相當困難的,一個細微的環節出問題,就會導致失敗,所以說CISCO丟得好,至少不要去浪費自己或者其他設備的資源。對於運營商來說,每個設備都已經跑到了極限,他們只會更加高興。

我們已經知道了MPLS報文的格式:

clip_image010

0-20位是標籤位.一共可以組合出1048575個標籤出來。

0-15是保留標籤,數據流進行轉發的時候,不使用這些標籤。

0-顯式空NULL標籤.

3-隱式空標籤.

1-路由器報警標籤.

14-OAM報警標籤。

CISCO的IOS裏面用的是隱式空標籤.

clip_image012

implicit-Null.

在以前的時間裏,我一直沒有真正的理解顯示空和隱式空真正的含義。今天找了一個相關的開發老師把這個概念理清楚了。

下面是我總結出來的一些概念,不對的請達人些指教.

隱式空標籤:

該標籤的標籤號固定爲3,該標籤我理解就是一個概念上的東西,用show命令show mpls forwarding-table都看不到這個3,那麼爲什麼要用這個標籤呢?好處在哪裏?

這裏涉及到另外一個概念是PHP次末節點彈出機制.

clip_image014

這裏隨便借用了一個拓撲圖。假設R3是P設備,R4和R5是PE.

那麼當MPLS報文送到R3往R4和R5進行轉發的時候,在R3上面就會把標籤pop出去,剝離標籤以後,用隱式空標籤3安裝在報文前面,實際上已經就是純IP報文了,然後轉發給R4或者R5,那麼兩個PE設備負責的事情就是純粹的IP轉發了,減輕了PE設備的壓力。

否則的話,PE設備需要做的事情是收到了報文以後首先剝離標籤,然後查找路由表進行IP報文的轉發,這樣加大了設備工作流程。

凡是做過工程的朋友都知道,運營商的P設備一般都是很強悍的至少是CISCO7200級別的設備,或者是7600.GSR等等,但是對於PE來說,CISCO 3800/2800都可以來做。這也就是爲什麼PE的需求不是那麼要求高的原因了。不知道這樣說是否說明清楚了。

正是因爲有了PHP的設計思路,所以纔有了隱式空標籤的出現。

簡單說來,爲了減輕PE的壓力,在倒數第二跳直接將標籤彈出,以純IP的報文格式傳送給PE.讓PE直接走IP轉發.

顯式空標籤:

有了隱式空標籤以後,其實隱式空標籤也有缺陷的。我們都知道MPLS標籤報文的結構:

clip_image010[1]

其中,0-20位是標籤位,S位和TTL位先不管,還有8位的EXP位,這就是其中的QOS位。

相當於IP報頭中的IP precedence和DSCP一樣,是用來着色的。但是這裏試想一下,如果客戶需要做端到端的QOS,那麼一定會從頭到尾都需要有相關的着色位是有色的。PHP工作機制在倒數第二跳彈出以後,會把整個MPLS報文頭移除,而不是單純的移除標籤,那麼如果原來有的EXP假如是8,這個時候EXP也會隨MPLS報頭一起刪除,試問,在MPLS骨幹網中,下一跳PE如何來做QOS呢?

所以爲什麼之前說的隱式空標籤是一個概念。因爲MPLS報文頭被移除了。而現在需要用0這個顯示空標籤來進行替代,實際上是保留MPLS報文頭,標籤爲0,EXP/S/TTL全部都保留下來傳遞到下一跳,最後就是PE來做P的工作,收到報文,先經過QOS隊列,然後剝離標籤進行IP轉發。雖然這樣可以做端到端的QOS,但是弊端就是對PE設備的性能壓力比較大。

PS:對於IPv6來說,顯示空標籤不是0,而是2.

對於隱式空和顯示空標籤,我還有一個疑問,諮詢了研究院的老師以後,就更加清楚了,這裏也分享出來:

以前我在做工程的時候,我記得運營商的PE,從VRF收到客戶側的數據報文以後,會加上MPLS報文頭從骨幹網傳輸出去,當時我做實驗證明了一個理論就是,設備(cisco/MAIPU)會自動根據從VRF接收到的報文的IP precedence或者是DSCP複製出來,然後粘貼爲MPLS報文頭的EXP字段。也就是說,IP報文經過PE到骨幹網,PE設備會將IP的TOS那8個字節複製到MPLS header的EXP中去。那麼從PE出來的時候是否也會複製呢?

如果要複製,那也就是說不需要顯示空標籤。按照這個邏輯應該是標準爲只對進設備的報文進行復制,PHP倒數第二跳出去的報文不會從MPLS頭裏EXP再複製到IP的TOS去。也就是IP的服務類型service type裏面去。所以這裏纔有了顯示空標籤的應用.這個是和研發老師進行確認了的。

下面是在邁普的設備和CISCO設備上的配置方式。

我們都知道設備默認的是隱式空標籤。所以不需要配置。

在邁普的設備上面,要先顯示空標籤,需要在MPLS LDP下面進行配置:

clip_image016

這裏邁普的設備用顯示空標籤是全局的能力,也就是說,在mpls ldp下面配置了explicit-null以後,該設備作爲P在對於所有的PE都會用顯示空標籤,並不能針對哪些特殊的對象進行選擇性的操作。

cisco設備的操作方式是:

clip_image018

請參考圖中的mpls ldp explicit-null to bbb,bbb是一個ACL的名字。

這樣比較靈活。

當然也可以讓整個設備都做顯示空0出去:

mpls ldp explicit-null

還要提一下TTL,這個也是MPLS 報頭中的一個東西,在IPV4報頭中,TTL是如此的重要。TTL通常是255,每經過一跳(三層設備)就會減少1,知道最後爲0就會丟棄,發送ICMP type=11和0.在MPLS中,IP的TTL會減1,然後複製到MPLS TTL中,在用MPLS轉發的時候IP的TTL不會變化。最後當標籤被剝離的時候,會在MPLS TTL減1,然後再複製到IP的TTL中。

clip_image020

下面要看得是MPLS MTU,關於這個專題,這裏只是略微帶過。有一個詳細的解釋在:

http://361531.blog.51cto.com/351531/657564

總結一下:

MPLS的MTU一定會比IP的MTU要大,如果你想不分片傳輸報文的話,下面我自己整理了一個公式:

MPLS MTU=IP MTU+4*N (N代表標籤的個數)

再用一個以前做的實驗來闡述MPLS MTU的設置:

IP MTU=1500,MPLS MTU=1503, 源地址ping目的-f不分片-l 1500。結果掉包不通。

IP MTU=1500,MPLS MTU=1504, 源地址ping目的-f不分片-l 1500。結果通。

其實這裏就驗證了那個公式,MPLS MTU一定大於IP MTU.因爲還要加上4*N個標籤.

那麼這裏再想一下,如果IP MTU=1500, MPLS =1500.

那麼數據報文在什麼情況下就會分片?答案是:IP 長度在1496的時候就會分片。如果ping x.x.x.x -l 1500 -f

一定是掉包。大家可以做實驗進行驗證 :)

還要提到的一點是,命令爲:

clip_image022

在默認情況下,ip MTU=1500,MPLS MTU=1500.意味着在IP MTU=1496的時候,就會分片。

(IP MTU+4*N)>MPLS MTU的話,一定會掉包。

這就是今天的主題。關於MPLS 報文頭的一些相關內容.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章