CCIE SP—MPLS Basic 1
传统的IP转发的缺点
- 路由表比较大,占用存放空间
- 寻址比较慢,所以转发自然也慢
MPLS的标签转发的优点
- 只有边缘执行路由的查找
- 核心路由器只需查找标签就可以进行转发了。
上游和下游的概念
在MPLS中,上游和下游的概念非常重要,所以要分清:
- 上游:数据转发的起始方向;
- 下游:路由分发的起始方向,也是标签分发的起始方向;
MPLS的包格式

通常,MPLS包头有32Bit,其中有:
- 20Bit用作标签(Label)
- 3个Bit的EXP, 协议中没有明确,通常用作COS
- 1个Bit的S,用于标识是否是栈底,表明MPLS的标签可以嵌套,S=1时是底层标签
- 8个Bit的TTL,类似IP包头,用于防止环路
- 理论上标记栈可以无限嵌套,从而提供无限的业务支持能力。这是MPLS技术最大的魅力所在
TDP与LDP
- 不同之处主要在于TCP的端口,TDP是基于TCP 711,而LDP基于TCP 646
- 两者不能兼容
- TDP LABEL分配是16 – 100,000,LDP LABEL分配是10 – 100,000
MPLS的机制

- 数据包本身就是带LABEL,所以直接通过LFIB进行转发。
- 标签被弹出,并进行FIB查找并转发,在MPLS VPN中会有,针对Aggregate。
- 当一个IP报文进入后,查看是否压入标签,压入标签的前提是是否收到下游分配的标签。如果收到,压入标签并进行LFIB查找并转发。
- 如上所述,如果收不到下游分配的标签,就直接进行FIB查找并进行转发。
- 弹出所有标签,不用查找FIB,直接根据下一跳转发,这种情况一般是Untag或是PoP。
PoP、Untag和Aggregate的区别
- Aggregate:
- 直连路由,弹出Label时,因没有关联接口与下一跳,所以需要进行3层查找。
- PoP:
- 收到了下游发来的空标签,也就是label=3,这个空标签也是标签,所以他会弹出顶层标签,进行转发,因为MPLS是基于下一跳转发查找,所以没必要查找FIB表。
- Untag:
- 专指学到路由,弹出所有标签,随后根据下一跳转发。出现untag有以下3种原因:
- 下游不能分配标签,没有启用MPLS
- 下游分了标签但传不出来,是因为LDP Neighbor没有建立
- 分配标签错误,这种情况仅出现在IGP是OSPF的情况下,因为如果用环回口作为ldp的router-id,并且不是32位的,OSPF会自动以32位的环回地址发布,这样会导致标签就分配错误,下面是从试验中摘要的信息:
- 专指学到路由,弹出所有标签,随后根据下一跳转发。出现untag有以下3种原因:
R2#show mpls ldp bind
...lib entry: 11.11.11.0/24, rev 11 <这个表项是通过LDP分发得到的>
..........remote binding: lsr: 11.11.11.11:0, label: imp-null
...lib entry: 11.11.11.11/32, rev 6 <这个表项是根据CEF分配的>
..........local binding: label: 100
..........remote binding: lsr: 33.33.33.33:0, label: 201
R2#sh mpls for
Local Outgoing Prefix Bytes Label Outgoing Next Hop
Label Label or VC or Tunnel Id Switched interface
100 No Label 11.11.11.11/32 0 Se1/0 point2point
101 Pop Label 33.33.33.33/32 0 Se1/1 point2point
上面的拓扑是R1 <—>R2<—>R3
R1通过OSPF发布一个24位的环回路由11.11.11.11,在R2上收到一个来自R1分发的24位路由bind,标签为imp-null,如上所示。
但由于R2收到的路由为32位(OSPF环回口特性),所以它又产生了一个32位的路由bind,并且从R3上收到标签201,R2和R3都是对32位的路由分发标签,而R1只对24位的路由分发了标签,显然对于R2、R3来说,收不到R1针对32位路由的标签,因此是No label(Untag)。以下是R1的信息:
R1#sh ip cef
Prefix Next Hop Interface
0.0.0.0/32 receive
11.11.11.0/24 attached Loopback0 <LDP只对attached打imp-null标签>
11.11.11.0/32 receive
11.11.11.11/32 receive
11.11.11.255/32 receive
R1#sh mpls ldp bin
...lib entry: 11.11.11.0/24, rev 12
..........local binding: label: imp-null
...lib entry: 11.11.11.11/32, rev 13(no route)
..........remote binding: lsr: 22.22.22.22:0, label: 100 <可以看到收到了R2发来的标签100,但它在CEF不是直连,所以没有给它分配imp-null标签>
Q&A
- 当一个数据包进入PE后,是查路由表(FIB)还是查标签表(LFIB)?
- 具体查哪个表,主要取决于包的本身 – 类型长度值:
- Type:0x8847(单播)承载的是MPLS,查找LFIB
- Type:0x8848(组播)承载的是MPLS,查找LFIB
- Type:0x0800 IP报文,查找FIB
2015-2-17 更新
事实上,更准确的说,一个数据包到底如何转发,主要看CEF的信息,很简单的例子:R1—–PE—P—PE—–R2
PE间只起MPLS(无VPN),R1 正常IPv4,R1发过来的数据包type是0x0800,那在PE上会怎么转发呢?会根据CEF打上标签发给P,直接走标签,而不是IPv4
- 在初始路由器上,是查找FIB还是LFIB呢?
- 这要取决于CEF表,用“show ip cef <ip address> detail”命令,可以从输出中看到对于此路由是否压入标签,分配标签是根据CEF表中的前缀来分配的。因此如果满足以下2个条件,那么就会打上标签并查找LFIB,如果不是,就查找FIB
- 设备上启动CEF,为每条路由产生CEF前缀
- 启动tag ip
- 这要取决于CEF表,用“show ip cef <ip address> detail”命令,可以从输出中看到对于此路由是否压入标签,分配标签是根据CEF表中的前缀来分配的。因此如果满足以下2个条件,那么就会打上标签并查找LFIB,如果不是,就查找FIB
文章对俺帮助很大!
Aggregate:直连路由,弹出Label时,因没有关联接口与下一跳,所以需要进行3层查找。
个人觉得PE-CE这段,从PE上sh mpls for de看到的aggregate 转发是有outgoing接口的(与untag的对比)
个人觉得agg是不用三层查找的,而untag是三层查找的。。。。
刚才做了一下试验,果然说反了,>_<
帮我删了吧,555555