MPLS Fundamental
History of WAN Protocol
- 1970年代之前
- 第一個 WAN 用於將辦公室與終端連線到大型機和小型計算機系統。
- 它是從辦公室到資料中心的點對點連線。
- 隨著使用者採用個人計算機和客戶端伺服器應用程式,點對點架構繼續為行業服務。
- 當時使用的X.25 協議和 T1/E1 電路速率為1.5Mbps。
- 1980 年代末和 1990 年代初
- 幀中繼(X.25 的簡化版本)作為一種更靈活的方式出現,可將辦公室和分支機構位置連線到資料中心,通過 T1/T3 電路執行,提供高達 45Mbps 的速度。
- 企業迅速採用幀中繼,隨後是非同步傳輸模式 (ATM)。
- ATM 的功能類似於幀中繼,但 ATM 旨在為在同一網路上執行的語音、視訊和資料提供更好的體驗。 並且提供了高達 622Mbps的速率。
- 2000年代初
- MPLS 最初由服務提供商部署,這些服務提供商在從傳統的基於電路的網路架構過渡時也採用了 MPLS。
- 資料包被分配標籤並根據標籤頭做出轉發決策(在早期,這樣的轉發資料方式是更快的)。
- 2000 年代中後期
- 網際網路作為企業 WAN 連線的一種選擇迅速出現。
- 網際網路頻寬既便宜又充足。
- 許多企業使用蜂窩服務作為 ISP 的備用連線。
- 2010年代
- SD-WAN(軟體定義廣域網)。
Multiprotocol Label Switching(MPLS)
-
MPLS 是一種資料包轉發方法,它根據標籤而不是資料包的第三層目的地做出轉發決策。
- 對於今天的路由器,MPLS 並不比傳統的 IP 路由快多少。
-
MPLS 旨在支援(傳輸)許多不同的第三層協議。
- 例如單播路由、多播路由、VPN、流量工程 (TE)、QoS 和 MPLS 上的任何傳輸 (AToM)
-
MPLS名詞介紹
- LSR = 標籤交換路由器(Label Switching Router)
- LIB = 標籤資訊庫(Label Information Base)
- LFIB = 標籤轉發資訊庫(Label Forwarding Information Base)
- LDP = 標籤交換協議(Label Distribution Protocol)
- LSP = 標籤交換路徑(Label Switched Path)
- CE = 客戶邊界(Customer Edge)
- PE = 運營商邊界(Provider Edge)
- P = 運營商路由器(Provider Router)
- LER = 標籤交換路由器(Label Edge Router)
MPLS is not VPN
- MPLS是一個基於標籤的最短路徑路由流量的技術。
- VPN則是一個概念——基於公有網路的專有網路連線。
這篇文章將著重討論MPLS Layer 3 VPN——即基於MPLS + VRF的VPN( IPv4-over-MPLS )。以及其他MPLS相關技術。
LSR Control Plane & Data Plane
標籤交換路由器分為控制層面和資料層面。
在傳統IP路由中,路由器通過路由協議生成路由表(控制層面),再由路由表生成轉發表用於硬體轉發資料(例如Cisco的CEF技術)。
在執行MPLS的路由器上,LDP用於和其他執行MPLS的路由器交換標籤並生成LIB(控制層面),LIB會生成基於標籤進行轉發的表項——LFIB(資料層面)。
LSRs in MPLS Domain
在下面這張圖中,R1與R5是邊界LSR(資料流量為從左向右)。邊界LSR需要同時為IP與MPLS路由。
-
在MPLS域的邊緣,為進入MPLS的資料包新增標籤(稱為ingress LSR)。
-
在MPLS域的邊緣,為離開MPLS的資料包彈出標籤(稱為egress LSR)。
R2、R3和R4均為中間LSR(Intermediate LSR)。
- 位於MPLS域內,主要使用標籤資訊轉發資料包。
LSP
Label-Switched Path(LSP)標籤交換路徑是標記資料包通過MPLS域的累計標記路徑。
這是一條單向路徑。因此源與目的地的來回路徑可能是不一致的。
沿著該路徑,每個路由器都會檢查標籤來做出轉發決定,移除或新增標籤(如果需要),然後轉發資料包。
下面這張圖簡單的解釋了MPLS是如何完成資料的轉發的。
- 在192.168.0.0/24向10.0.0.0/24方向轉發資料時,邊界LSR首先為10.0.0.0/24分配了標籤87,並將帶有標籤87的資料包轉發至R2(此時開始使用標籤進行轉發)。
- 在轉發資料至R2時,中間LSR將進站標籤為87的標籤替換為11,並繼續轉發至R3(此時使用的表均為LFIB)。
- 像如此轉發資料至R5,R5發現出站標籤為空,則將標籤彈出,進入FIB進行IP路由。
Label
要深入理解MPLS的轉發機制,繞不開的是MPLS中的標籤(Label)如何被利用於轉發,如何產生,以及如何交換這三個問題。
為了能夠讓MPLS工作,每一個資料包都需要插入標籤(準確說,實際插入的是一個Label Stack)。標籤被插入在二層幀頭和三層包頭之間(準確說,應該是插入在二層幀頭之後,因為MPLS能夠承載多種協議)。
標籤大小為4個位元組幷包含不同欄位:
- Label
- 前 20 位用於定義標籤編號。
- EXP(TC)
- 接下來的 3 位(EXP)用於QoS和ECN(顯式擁塞通知)。
- S
- 1 位(S)欄位用於定義標籤是否是堆疊中的最後一個標籤。
- 普通的MPLS只有一層標籤,但MPLS VPN則有兩層標籤,MPLS TE則有三層標籤。
- TTL
- 最後 8 位(TTL)類似於IP TTL。
Label Stack
在MPLS中,一個資料包不止可以攜帶一個標籤,而且可以攜帶一疊標籤,如下圖。
可見多個MPLS shim組成了一個MPLS label stack。
具體label stack的排序如下圖。可見,在棧底的shim的S欄位為 1,所以可見的是該標籤為棧底標籤。
Cisco定義Label stack中的label數量沒有上限。
Assign Label to Network
啟用了MPLS的路由器會為所有他們已知的網路分配標籤(不包括BGP路由)。系統會為路由隨機分配一個編號,這個編號僅具有本地意義。
例如在下圖中,假設下面5個路由器執行OSPF獲得了10.0.0.0/24這個網段,它們各自都給該網段分配了一個編號。
LDP
LDP(Label distribution protocol)標籤分發協議。
如下圖,假設R4需要將10.0.0.0/24網段的資料轉發給R5。
- 那麼R4必須要知道R5針對於10.0.0.0/24所分配的標籤(因為R5只有自己認識收到資料包的標籤才能進行下一步轉發)。
- 且在轉發資料包的過程中需要將R5分配給10.0.0.0/24網段的標籤放入其中。
- 因此R4與R5之間需要使用LDP來交換互相的標籤。
- 那麼一旦在介面上啟用了MPLS,LDP Hello資料包就會從介面發出,傳送到多播地址224.0.0.2,使用UDP 646埠。
- Hello包中攜帶了LDP ID,LDP ID類似於Router ID,它唯一標識了鄰居和Label Space。而Label Space分為兩種。
- Per platform(平臺式),在所有介面上,對於相同網路釋出的標籤也是相同的。
- Per interface(介面式),在不同的介面上,對於相同網路釋出的標籤是不同的。
- Hello包中攜帶了LDP ID,LDP ID類似於Router ID,它唯一標識了鄰居和Label Space。而Label Space分為兩種。
- 當路由器通過組播地址發現對方後,會使用TCP 646埠建立TCP連結,形成LDP TCP會話,以便交換標籤資訊。
- 在兩臺路由器建立LDP TCP會話時,必須有一方為活動路由器。
- 活動路由器負責建立TCP會話,LDP ID較大的路由器會被選擇為活動路由器。
在上文中,我們可以得知,上面的R1至R5使用LDP交換了對於10.0.0.0/24這一網段的標籤資訊,那麼此時會引申出一個問題——在一臺路由器上收到了一個網路的多個標籤,路由器會怎麼處理呢?
下面我們來探究這個問題,在下圖中,標識了各個路由器的LIB(標籤資訊庫)。
- 各個路由器通過LDP都收到了各自鄰居針對10.0.0.0/24的標籤資訊,並記錄在了LIB中,然而LIB並不是直接用於轉發資料的。需要通過LIB+RIB得出資料真正的轉發路徑。
路由器是如何通過LIB+RIB確定出真正的轉發路徑呢?具體步驟如下。
- 首先MPLS網路中需要執行路由協議來傳遞路由資訊,從而形成RIB(路由資訊庫)。
- 其次執行MPLS後,LDP開始工作,當形成LIB後,通過RIB確定正確的轉發路徑,並載入LFIB中。使用R4和R5舉例。
- 當形成LFIB時,R4通過查詢RIB得知,去往10.0.0.0/24網段需要將路由轉發給R5。
- 此時R5也通過LDP將自身對於10.0.0.0/24網段的標籤傳遞到R4上。
- R4將自身針對該網段和下一跳路由器針對該網段的標籤相結合寫入LFIB中。
- 那麼前往10.0.0.0/24的資料就能夠通過LFIB進行轉發。
- 至此,當R4收到標籤為65的資料包時,將會彈出標籤65,壓入標籤23,並將其轉發給R5。
- MPLS域中的所有路由器重複上述的過程,就能夠確立出一條正確的轉發路徑。
- 至此,除了Edge LSR需要進行IP路由,中間LSR可以全部通過MPLS進行資料轉發。
- Edge LSR的FIB略有不同,因為執行了MPLS,FIB中並沒有路由的下一跳資訊,而是打上標籤或移除標籤。
Egress LSR Double Lookup
例如R5收到10.0.0.0/24的資料包時需要做兩次查詢,首先查詢LFIB表,其次查詢FIB表。
首先是因為它收到了一個帶有Label的資料幀,它需要查詢LFIB表,但由於沒有Label Out,它必須彈出標籤並繼續查詢FIB表來轉發資料。
這樣的效率並不高。
Penultimate Hop Popping(PHP)
Penultimate Hop Popping 倒數第二跳(又稱次末跳彈出)是一種優化機制,如下圖所示。
當啟用PHP後,R5並不會將之前一樣向R4宣告自己的標籤,而是宣告了彈出(POP)這個動作。那麼R4就會在轉發的過程中,將剩餘的標籤彈出,並轉發給R5。
那麼當R5收到不附帶標籤的資料包後,就會直接查詢FIB進行轉發,免去了查詢LFIB的動作,提高了效率。
實際上呢,R5告訴R4自己是10.0.0.0/24網路的LSP的末端,並且R4應該彈出標籤,並且將無標籤的資料包轉發給R5。