MPLS(多協議卷標交換)
一、傳統IP路由轉發的特點及缺點
- 使用動態路由協議傳遞路由條目
- 傳統IP路由只能基於數據報中的目的IP轉發數據報
- 每台路由器都要去查找路由表然后逐跳轉發
二、MPLS基本工作原理
MPLS:用標簽轉發,而不是進行IP路由表的查找
MPLS邊界路由器:連接了MPLS域和一個純IP網絡
只有邊界路由器才會進行路由表查找(針對純IP包)
LSP:卷標轉發路徑
LSR:標簽轉發路由器(MPLS域中的路由器)
MPLS數據報轉發過程的基礎理論:
邊界路由器為純IP包查路由表,並給數據報壓上一個標簽(IP數據報前面加上一個標簽5發送出去)。第二台的下游路由器不會再去查路由表,只看卷標(因為是卷標包),只需要做標簽的替換5——3(標簽3是下游路由器給它的,下游路由器只認識標簽3)。第三台路由器彈出標簽,變成純IP包,並做路由表查找,最后轉發給身后的IP網絡。
三、MPLS的優勢
1.轉發速度——不是主要因素
2.VPN服務:
MPLS把IP的路由和轉發給分離了:在入口的地方就可以決定數據報將要走的整條路徑(傳統的IP路由轉發不行,因為每一跳都要去查找),它可以為不同入口的IP數據報壓不同的標簽出去——MPLS VPN
兩個不同的VPN客戶使用相同的私網地址段,MPLS VPN可以區分這兩個不同客戶的數據報走向。根據收到的接口不同,壓不同的標簽轉發出去(傳統IP只能匹配這一條路由條目,故只能按照一種方式做錯誤的轉發)
傳統IP路由轉發:根據數據報要去往的目的IP地址,匹配中同一條路由條目,只能做一種轉發方式
MPLS:根據標簽轉發,提供了另外一種轉發方式
3.MPLS-TE(流量工程)
傳統的IP轉發,例如運行的是ospf,只會選擇走cost值小(帶寬大)的路徑,當這條鏈路帶寬超載時會發生丟包,但是流量仍然不會走下面
MPLS卻可以在入口處強行指定路徑以實現非等價負載均衡
傳統IP網絡並不是只能基於目的地址轉發——使用PBR(策略路由)
但PBR不適合在互聯網上大規模應用,因為每台路由器上都要去做控制,而不是在入口處控制。使用MPLS可以只在入口處就完成控制。
四、MPLS包頭封裝位置和包頭格式
4.1 MPLS包頭封裝位置
MPLS包頭放在二層的幀頭和三層的IP頭之間的位置,所以MPLS也叫做2.5層的協議
MPLS標簽放在MPLS包頭中
二層的幀頭中的“類型字段”會指明上層是IP協議(0X0800)還是MPLS協議,路由器查看二層的幀頭就知道應該使用哪張表來查表轉發——FIB、LFIB
所以中間的MPLS路由器不會去看IP包頭轉發,只看MPLS包頭轉發
4.2 MPLS包頭格式
1.標簽:20位(100多萬個),為每一條路由分配一個標簽,足夠用了
2.EXP:做QOS用的,3位
QOS區分服務模型:分類、標記(着色)——字段(值)
三層的IP包中的字段:TOS(早期)——DSCP(后來)
二層:802.1q的trunk中的cos字段
端到端的QOS:
二層交換機的trunk(二層幀中的字段-COS5)復制到IP路由器(TOS5),進MPLS域時復制到路由器MPLS包頭中(EXP5)
3.S:占比位,1位,多層標簽嵌套(實際上是有多個MPLS的包頭),標識我是不是最內層的標簽
0:外層標簽
1:內層標簽
MPLS VPN:2層標簽
CSC:3層標簽
4.TTL(生存時間): 8位(最大值為255,看從哪個操作系統發出來的初始值不一樣),每經過一個路由器減1,防環。把IP包頭里的TTL值復制到MPLS包頭的TTL字段里
五、MPLS架構及實現細節
5.1 控制層面
如何生成轉發層面所需要使用的表
傳統IP路由是通過動態路由協議的學習最后生成路由表
1.各種動態路由協議
任何IGP、BGP協議——目的是傳遞路由
2.分發和傳遞標簽的協議
(1)專門的卷標分發協議:LDP、TDP
TDP:cisco的卷標交換技術,tag switching所使用的標簽分發協議。它是LDP的前身
LDP:被IETF共有化后演變了成現在的MPLS所使用的標簽分發協議
(2)其他可以傳遞卷標的協議:
1.MPBGP(多協議BGP):把標簽放在BGP路由后面一起傳遞
2.ipv4-BGP:不同的AS之間傳遞卷標,用LDP傳遞卷標不好
3.RSVP(資源預留協議):出現在QOS的集成服務模型里的,用於數據網絡,去請求保留帶寬,然后可以沿着路徑分卷標——用於MPLS-TE
QOS的兩種模型:
1.區分服務模型:用的最多
對數據報在入口處進行分類(根據重要性),然后打標記(着色,在字段中設置一個值),繼續傳遞,其他路由器只看標記根據QOS的隊列機制讓重要的數據報每次都是優先轉發。
但是每台路由器都要去實施。
2.集成服務模型:類似於傳統的電話網絡,中間是二層的電話交換機——用於語音網絡
打電話時交換機會發送信令去請求下一台交換機的帶寬(需要的帶寬),整條鏈路先預留帶寬,保證語音的質量。預留不出來則通話不能建立,保證了服務質量。
但是是針對每一個流,也不能在互聯網上大規模實施
3.通過無序分發標簽,形成每台路由器的LIB表(標簽信息庫):
LIB中只會存儲LDP/TDP分的標簽
路由條目 自己本地分配的標簽(local) 所有別人給我的標簽(remote)
5.1.1 LDP和TDP的聯系
可以全局或接口下修改使用的卷標分發協議:默認是LDP,兩端必須一致
int s0/0
mpls label protocal tdp
其實兩者可以互相兼容——MPLS分發標簽使用LDP或TDP都可以
5.1.2 mpls ip命令在接口上運行之后,LDP的工作過程
1.選舉LDP router-id(同ospf,選舉好后即是一個穩定狀態)
2.使用LDP router-id的地址建立直連路由器之間的LDP鄰居關系(要注意路由的可達性)
3.通過路由協議學習到路由條目后,每台路由器針對這條路由條目本地分配一個標簽(local)
4.通過LDP協議無序分發卷標(LDP/TDP的卷標分發是無序的,分發給所有LDP/TDP鄰居而不區分上下游),從而形成LIB表(local remote)
5.1.3 LDP鄰居的建立過程
1.LDP使用UDP源目埠號都為646發送hello包(並通過UDP協議維持LDP的鄰居關系)
LDP的hello消息目的IP地址發往224.0.0.2
sh ip int s0/0 //查看mpls接口加組信息(224.0.0.2)
2.協商相關參數,如LDP router-id的大小
3.使用TCP 源埠隨機,目的埠為646建立LDP鄰居關系(LDP ID大的主動去發送TCP連接小的)
目的IP為對方的LDP ID
sh mpls ldp nei //查看LDP鄰居關系
access-list 100 permit udp any eq 646 host 224.0.0.2 eq 646
access-list 100 permit ospf any any //建立ospf鄰居,放行LDP ID的路由條目
access-list 100 permit tcp any host 1.1.1.1 eq 646 // LDP ID大者向小的一方發起TCP連接
access-list 100 deny ip any any
TDP依靠TCP 711埠建立鄰居關系,用UDP發送hello包(維持TDP的鄰居關系)
5.1.4 相關命令
LDP ID:類似於OSPF的router ID,選舉規則也一樣;使用mpls ldp router-id interface force可改變LDP ID
在LDP鄰居發現時,鄰居之間的LDP ID必須IGP可達,否則在sh mpls ldp discovery的最后一行會出現no route,即鄰居發現沒有建立成功
全局下的MPLS命令:
mpls ldp命令(新命令)等同於tag-switching tdp(老命令)——因為LDP等同於TDP
控制層面小結:
- 每台路由器通過一種動態路由協議學習到路由條目
- 每台路由器先本地為這條路由條目分配一個標簽
- 無序分發標簽,形成每台路由器的LIB表
5.2 數據層面
如何去查那張表
傳統IP路由是拿目的地址去查路由表(FIB表)
1.FIB表(轉發信息庫,CEF表——相當於路由表)
FIB表是對路由表的復制,做了一些優化,解決了遞歸查找問題
為什么要使用FIB表:因為只有FIB表才能關聯標簽,路由表是無法關聯標簽的
必須打開CEF才會有FIB
邊界路由器要查CEF表:三層的表,IP是三層的包
路由條目 出接口 下一跳路由器給的標簽(out)
2.LFIB表(卷標轉發信息庫)
由LIB生成
中間的路由器只根據LFIB表做標簽的替換:針對的是標簽包
路由條目 出接口 本地分配的標簽(in) 下一跳路由器給的標簽(out)
LFIB中out是untagged的情況:——彈出所有標簽
如果下一跳沒有給我標簽(沒有運行MPLS的純IP網絡,我只能給它轉發一個純IP包的情況),則out是untag
LFIB中out是pop的情況:——只彈出一層外層標簽
每台路由器對於本地直連的路由條目本地分配的是一個“隱式空”的空標簽(local值為3),倒數第二跳路由器收到這個分發的空標簽,它的LFIB表中out為POP。然后轉發純IP包給末端路由器,末端路由器一般情況下只需要查IP路由表(FIB表)轉發,所以末端路由器對於直連路由LFIB表中是沒有這條路由條目的
數據層面小結:
是什么包就查什么表
5.3 MPLS架構小結
路由的傳遞是從下游往上游傳
標簽的分發是無序的,但只有關聯下一跳給的標簽才有意義
數據報的轉發是從上游往下游走
5.4 數據報轉發時的幾種可能性
收到的是IP包,只查FIB:
1.壓out的標簽出去(MPLS邊界路由器)
2.不壓標簽,正常的IP包出去(末端路由器的直連路由)
收到的是標簽包:只查LFIB:
1.更換一個標簽出去(中間的路由器)
2.彈出標簽,變成純IP包出去(倒數第二跳路由器)
六、基礎實驗
R3:ping 1.1.1.1
6.1 MPLS基本配置及驗證命令
1.應首先保證MPLS域中的所有路由器CEF開啟(默認開啟)
2.運行一種路由協議,宣告物理及環回界面
因為LDP也會建立鄰居關系(默認使用環回口建立鄰居,因此必須要環回口路由可達)
sh mpls ldp discovery
3.指定卷標分配的范圍——針對所有可以分卷標的協議的卷標分配范圍
運行MPLS,同時就默認啟動了LDP對每條路由條目本地分配一個標簽(local)
LDP分配標簽從16開始,本地有效。應該強制每台路由器對路由分配不同的標簽范圍(在啟用MPLS之前就做,因為啟用了MPLS就啟用了LDP,已經開始分配標簽了)
全局配置模式下:
mpls label range 16 100
4.MPLS域中的所有接口下啟用MPLS——默認就啟用了LDP並建立LDP的鄰居關系
int s0/0
mpls ip
sh mpls int //查看所有啟用了LDP的接口
sh mpls ldp nei //LDP的鄰居:LDP的TCP連接發起方——根據源埠號(隨機)和目的埠號(646)判斷
R3:trace 1.1.1.1 //壓標簽達到目的地址
查看控制層面的表(LIB表):
sh mpls ldp bindings //LIB表:路由條目、卷標local、卷標remote
對於直連路由,本地分空標簽
對於非直連路由,本地正常分標簽
查看數據層面的表:
show ip cef detail //FIB表:路由條目、出接口、下游路由器給我的標簽(out)
show mpls forwarding-table //LFIB表:路由條目、出接口、本地分配的標簽(in)、下游路由器給我的標簽(out)
6.2 擴展內容
1.關閉CEF:no ip cef
(1)如果邊界路由器關閉CEF:
FIB空了——必須打開CEF才會有FIB
(2)如果中間路由器關閉CEF:
LIB中本地不分標簽了
FIB表空了
LFIB表也空了
此時則完全按照路由表查找轉發,脫離了LSP,此環境沒有任何影響,可以通,但是MPLS-VPN網絡中就不通了
路由器要基於FIB表本地分配標簽和形成LFIB表,所以必須在MPLS域中所有路由器上都打開CEF:ip cef
2.如果將R1環回口改為24位:
需要在R1上重啟mpls ip命令
R1通過ospf通告給R2的仍是32位路由
R2的LFIB中out全變成untag了,對於MPLS VPN就不正常了
問題原因:
1.R1上本地會為24位的這條直連路由分空標簽,也會把這個空標簽傳遞給R2,但R2上並沒有24位的這條路由,因此這條路由不會顯示進LFIB表中
2.R2收到的路由是32位的,但是卻收不到關於這條32位路由下一跳給它的標簽,因為R1上是直連的是24位的路由
3.R2上只有32位的路由加入到LFIB表中,因為沒有收到標簽,所以out是untag
解決方法:
使分標簽的路由和傳遞的路由屏蔽一致
1.將所有路由器環回口屏蔽都設置為32位——推薦
2.環回口網絡類型改為點到點,這樣宣告給鄰居的也是24位掩碼
3.如果MPLS域中存在路由匯總——eigrp
匯總路由在R2上產生:1.1.1.1/32-1.1.0.0/16,R2會為1.1.0.0/16這條路由本地分一個空標簽,R3壓着空標簽轉發到R2(R3到R2的包是純IP包)
而R2本身有明細路由,R1本地分配的空標簽分發過來,R2又壓着空標簽轉發到R1(等於還是一個純IP包轉發給R1)。因為R2上同時有匯總路由和明細路由,所以這種情況下不會有問題——eigrp、ospf
如果R1和R2之間還有一台路由器,則會重新壓一次標簽過去
關鍵是看底層使用的是哪種動態路由協議,做匯總時本地會不會自動生成那條匯總路由
eigrp和ospf手動匯總后本地都會自動產生一條指向空接口的匯總路由,所以MPLS-VPN沒有問題
rip本地不會自動產生匯總路由,所以MPLS-VPN有問題
另:ospf的匯總只能在ABR或ASBR上做
eigrip匯總:——pop
R2:連R3的界面
int s0/1
ip sum eigrp 100 1.1.0.0 255.255.0.0
rip匯總:接口下(同eigrp,DV型)——untag,MPLS-VPN有問題
int s0/1
ip sum rip 1.1.0.0 255.255.0.0
所以MPLS域中的底層路由協議最好不要使用rip
七、幀模式(IP)和信元模式(ATM)的區別
7.1 標簽的發配
幀模式:只要自己有路由就本地分配標簽
信元模式:下游給我標簽以后,我本地再開始自己分配標簽
7.2 標簽的分發
幀模式:分發是主動、無序的,不管對方要不要
信元模式:按需分發(上游向下游請求)
7.3 標簽的保留
幀模式:LDP鄰居傳遞給我的標簽一直保存在我的LIB中,不管是不是下一跳或下一跳是否已經down掉(對方起來后,不需要重新分發標簽進行三層的收斂,速度快)
7.4 LFIB表中是否關聯數據報的入向接口
幀模式:不關聯數據報的入向界面
優點:表小,卷標交換速度快
缺點:不安全
信元模式:關聯數據報的入向界面
八、MPLS的現實好處(BGP傳遞路由)
8.1 MPLS中的trace相關命令
no mpls ip propagate-ttl //TTL值在MPLS入口處變成255,並且不遞減
此時traceroute不生效
8.2 通過BGP傳遞路由
R1和R3通過IBGP傳一條32位的環回口路由
純IP網絡中,不能通(中間路由器沒有運行IBGP,沒有這條路由),但MPLS中可以通
R1:sh mpls ldp bindings
本地不會為33.33.33.33這條路由分標簽(學到的是B表項),MPLS只會為IGP的路由分標簽,不會為BGP路由分標簽。但轉發數據報時會壓這條BGP路由的下一跳路由的標簽(通過3.3.3.3學來的)——sh ip cef detail
sh ip bgp //去往33.33.33.33下一跳是3.3.3.3
R2沒有運行BGP,也沒有11和33的路由
好處:運營商中間的所有P路由器都不用承載BGP的路由(客戶的路由),只需要維護一個標簽即可實現客戶路由的端到端通信
8.3 擴展內容
R1重啟mpls ip后,LFIB中的out都是untag(沒有收到鄰居的標簽),LDP鄰居建立不起來了
因為LDP也有RID,通過RID建立鄰居,並且RID選舉好后是非搶占的,除非重啟mpls ip才重新選舉(選舉RID的方式同ospf)
R1上重新選舉RID為11.11.11.11,因為R2上沒有11.11.11.11的路由,所以R1的11.11.11.11和R2的2.2.2.2不能建立LDP鄰居
解決方法:
1.全局配置模式下:強制指定LDP的RID為1.1
mpls ldp router-id lo0 //只能跟界面,還是要等到mpls下一次重啟
mpls ldp router-id lo0 force //讓其立刻生效
2.RID不變,讓LDP通過直連接口建立鄰居,而不是使用RID建立鄰居(如果不能修改LDP的RID的話,使用這種方法比較好)
int s0/0 接口下的命令
mpls ldp discovery transport-add interface //本路由器通過本地這個物理接口地址和對方建立LDP鄰居
九、控制標簽的分發
控制路由的傳遞——發布列表
控制數據報的傳遞——ACL
控制標簽的分發:
讓R2針對環回口路由2.2.2.2本地分配的標簽只傳遞給R1,而不給R3(R3上看到2.2.2.2變成untag)
全局配置模式下:
老命令:tag-switching advertise-tag for ACL1(匹配路由) to ACL2(允許向誰發送)
新命令:mpls ldp advertise-labels for ACL1(匹配路由) to ACL2(允許向誰發送)
mpls ldp advertise-labels for 1 to 2
ac 1 per host 2.2.2.2 //匹配32位的路由
ac 2 per host 1.1.1.1 //只給1.1.1.1的LDP鄰居分發標簽(只能匹配對方LDP的RID,匹配對方的直連界面IP是不行的)
結果:R1的LFIB中out是POP,R3的LFIB中out是untag
no mpls ldp advertise-labels
mpls ldp advertise-labels for 11