拆了台cisco 2811
MPLS introducing Part.2
这些天一直在忙着准备面试,没能抽空出来更新一下,还好,笔试通过了,下星期一还有一次面试,希望可以通过吧!今天原以为出去的,结果还没出门就下起了大雨,趁有空就写一下MPLS introducing的第二部分吧。
MPLS是怎样工作的?
MPLS在转发数据包时使用了FEC(Forwarding Equivalence Class,转发等价类)这一概念,转发等价类是一组或者一系列沿相同路径转发的,且都按照相同的规则进行交换的数据流,属于同一个FEC的所有报文都使用相同的标签,需要注意,并不是所有拥有相同标签的报文都属于同一个FEC。所有运行MPLS的路由器(LSR、LER)为每一个FEC分配标签,并且使用标签分发协议(如LDP ,Label Distribution Protocol)把标签跟FEC的捆绑关系发送给邻居。最终, 某个FEC会在该MPLS区域内形成一条LSP(Label Switched path)。
一个Packet可能起源于MPLS区域的外部,从MPLS区域的边缘路由器进入,也有可能是起源于内部,这里假设Packet起源于外部。当入口路由器收到一个Packet时,它将会根据FIB表和LFIB表决定下一跳、为这个Packet打上一个或者多个的标签(当然可能因为PHP或者其他原因也有可能不打标签,以后再探讨)。打上标签的Packet被发送到下一条路由器(下游)。当下游路由器收到该Packet,它会检查Packet中的顶层标签,然后根据LFIB(Label Forward Information Base)确定对标签实施哪种操作(可能是交换、弹出或者添加标签等)和决定Packet的下一跳。
在经过LSP中的所有LSR之后,数据包最终到达LSP的末端,这时根据PHP机制,一般来说到达MPLS网络边缘的Packet应该不带标签以IP报文的形式发给出口路由器,然后出口路由器对Packet进行常规的IP查找和交换。但根据MPLS应用的不同,Packet到达最后一跳路由器时还可能包含标签(如显式空),这时就不得不为数据包进行两次查找了(题外话)。
下面是一个例子:
1. R1通过IGP通告了前缀10.10.10.0/24,这里假设R1是去往该子网的唯一路径;
2. 一个目的地为10.10.10.1的IP Packet进入R4(LER);
3. R4会查找FIB和LFIB(cisco IOS中只需对CEF进行查找即可),确定下一跳为R3,然后为Packet压入一个由R3为10.10.10.0这一FEC分配的标签L4;
4. R3从R4收到这一Packet查看二层报头,发现这是一个带标签的报文,于是查看LFIB表,将L4的标签交换为由R3分配的标签L3,进而发给R2;
5. 同样地,R2收到Packet并确认其为带标签报文,查找LFIB表,对标签进行操作,这里是典型的例子,R2作为LSP的倒数第二跳,R1为FEC分配了隐式空标签3并传给R2,但R2并不会把这个标签值为3的标签压入报文,而是采取弹出一层标签的行为。而在这个例子中只有一层报文,所以标签被弹出后,就露出了原来的IP报文,这个Packet最终被R2以IP报文的形式发给了R1,这样当R1接收到Packet之后只需进行IP查找就可以确定Packet的去向,这也就是MPLS中的PHP机制。
6. R1从R2收到IP Packet,查看IP头,并转发报文,Packet顺利穿越MPLS网络并到达目的地!
由此可以体现出的好处就是,MPLS区域内的路由器可以设计成由此至终都使用标签作为转发依据,因此区域内的LSR根本不用理会标签以后的内容是什么,这有利于运营商使用MPLS去运载不同的流量。而且标签交换在大多数环境下比IP查找要快,开销要少。
将于近期更新part3,有关MPLS标签的操作。如果对本文有任何疑问或建议,请留言指出,谢谢!
To be continue……
MPLS introducing Part1
MPLS是Multi-protocol Label Switching(多协议标签交换)的缩写,MPLS是一种能够携带任何三层协议(数据)的包转发技术,这也名称中“多协议”一词的由来。当装有层三(或以上数据)的数据包需要穿越部署了MPLS的网络时,处于MPLS网络边缘的路由器会在该数据包的L3头和L2头之间打上标记(label),使这些三层的数据包可以顺利穿越一个部署了MPLS的网络到目的地。
MPLS Label的结构及其作用:
MPLS label是一个固定长度4Byte,被入口路由器添加在L2和L3报头之间,主要用于识别数据包目的地的标识符。这个标识符被那些MPLS网络内部(非边缘)路由器所使用,这些内部路由器只需要根据数据包中这个处于L2.5(2.5层)的标识符就可以知道它的目的地,而不用进行任何的三层路由表查找,这也意味着可以带来一定性能上的提升!
在入口路由器处,一个或多个标签被压(pushed)进了包里面,我们通常称第一个标签为顶层标签或者传输(transport)标签,根据不同MPLS应用(如MPLS VPN),这个顶层标签后可能还有其他标签。
上图是一个完整的标签结构,一共32位,可见除了标签(Label)之外,还有一些其他的字段。这里简单介绍一下这四个字段:
- Label:“真正”的标签,20bits的标签值;
- EXP:Experimental bits 实验位,3bits,主要用于区分流量,也是在MPLS网络中实施QoS的依据;
- S Bit:Botton栈底位,1bit,用于标识当前标签是否为标签栈中的最后一个标签(栈底),值为“1”时表示当前标签为栈底,值为“0”时当前标签后面还有后续标签;
- TTL:Time to live生存时间,8bits,跟IP报头中的TTL一样,主要用于防环,MPLS label与label,label与IP之间的TTL行为有详细定义,具体可参考相关文档;
MPLS的一些术语:
- DownStream router:下游路由器,该路由器是某目的网络前缀的通告者,举个例,从下游路由器(A)收到网络前缀(N)的路由器的路由器(B)将以A作为该目的网络N的下一跳路由器,而这个前缀的接受者B向网络N发送数据时,数据流必须发送到A,因此我们称之为下游路由器,由此也可以看出,“下游”这一概念是相对于去往某特定网络前缀的数据流和路由器而言的。一路由器作为某网络前缀的下游路由器,但同时它也可能是另一网络前缀的上游路由器。
- UpStream router:上游路由器,正如上面所说的,上游路由器是某网络前缀的被通告者(接收者),通俗一点,“下游”和“上游”的意思就是某网络前缀的“通告方”和“被通告方”。
我们可以通过路由信息的方向和数据流的方向对上游和下游进行区分,路由信息是从下游路由器传给上游路由器的,而针对某特定前缀的数据流是从上游路由器流向下游路由器的。关于这两个概念很多都容易搞混了,所以我就花一些周章说明一下。
- Label Edge Router(LER):边缘路由器,处于MPLS网络的边缘,一般地,他们根据IP报头作出转发决定;
- Label Switch Router(LSR):标签交换路由器,处于MPLS网络的内部的路由器根据标签作出转发决策。
本文参考:What is MPLS,在结合自己的见解后在内容上稍作扩张和修改,如有错漏之处敬请提出
未完,待续。


