入站LSR:接收没有标签的数据包,打上标签并发出
出站LSR:接收带有标签的数据包,移除标签,并发出,出站和入站LSR都是边缘
LSR,所以它们同时连接了 IP网络和MPLS网络。
链路中LSR:接收到带标签的数据包,对其进行操作,然后按正确的接口交换出去,
所以链路中的LSR只进行标签转发。
LSR操作过程
LSR可以执行三种操作:提取,添加和交换
提取,即从标签栈的顶部移除一个或多个标签,移除全部标签是出站LSR必须做
的。
添加,向报文添加标签,如果没有标签,就加新的,入站LSR必须做的。 交换,收到一个有标签的报文,用新的标签交换到顶部,再发出,是链路中的LSR
做的。
注:在MPLS VPN中,入站和出站LSR就是提供商边缘PE,链路中LSR就是P,
术语PE和P在没有运行MPLS VPN时,也可使用。
标签交换路径LSP
LSP指的就是一个源到最终目的需要经过的路径,而在路径中,是要被修改
多次标签,比如一个源到目的要分别被改为20,50,35,68,那么也可以简单认为这两个点之间的LSP是20-50-35-68。LSP是LSR在MPLS网络中转发标签数据后产生的,是标签报文穿越MPLS网络的路径。LSP不需要记住,只需要知道是什么。LSP中第一台LSR就是入站LSR,最后一台就是出 站LSR,之间的就是链路中LSR。
转发等价类(FEC)
FEC可以认为是同一条路由,或者说是到达目标主机的路径是相同的,或者说是相同转发路径的数据流。同一个FEC,所有标签都相同,并不是拥有相同标签的 报文都是同一个FEC,可能EXP值不同。报文属于哪个FEC,由入站LSR决定。FEC和LSP一样只需要知道是什么,不用记住。
注:一条FEC可以包含多个流,但不是一个流一个FEC,比如一台主机在看新浪的
网页,这是一个流,又在看新浪的视频,这又是一个流,这两个流在新浪发给远程主机时,走的路径应该是相同的,所以一个FEC有多个流,但是每个流并没有属于单独的FEC。
MPLS标签交换过程
虽然一条路由可以打了多标签,但是中间的LSR只根据最顶部的标签便可以做出转发。但是,每台LSR的转发表里都会为一条路由显示两个标签,一个是本地标 签,一个是远程标签,要显示两个标签,是因为一台LSR收到数据包之后,就查看它的顶部标签,如果这个标签是某一条相应的本地标签,那么就从相应的接口发出去,同时在发出去的时候,就将数据包的顶部标签改为与这个本地标签对应的远程标签,这是每台LSR在传输时都必须改的,因为改了相应的远程标签,对下一台LSR做出正确转发是有帮助的。所以LSR自己对于某一条路由,别人要给数据打上什么标签,它才能够正确转发,它是要明确告诉邻居的,最后结果就是每一台LSR都会将这个能指导自己做过正确转发的标签发给邻居,邻居就认定这个发来的标签是远程标签,那么邻居在发出去数据包之前,都会改成这个远程标签,最后就能按正确路径转发了。
上图中,比如R4要看到数据包中有标签24,就能够正确往R6(目的地)的方向发,那么这个标签24对于R4来说就是本地标签,那么别人LSR把数据包发给R4之前,就得为它打上标签24才发出来,所以R4就把这个标签24告诉给它的邻居R3,邻居LSR收到标签之后,就认为是远程标签,所以R3认为远程标签是24,而自己要拿到一个数据后,是什么标签自己就会改成24发给R4呢,自己也会产生一个本地标签,可以看到,R3产生的本地标签是23,数据包中只要顶部标签是23,就能够让R3把标签改成24后发给R4,所以R3也把这个标签23发给了邻居R2,邻居R2也同样为路由产生一个本地标签,是22, 也就是说R2收到数据包标签为22的,就改成23,然后传给下一跳R3,最后R2也把对自己有利的标签22发给了R1,那么R1就知道发给R2之前,要把标签改成22,要不然R2就会转发出错的。
而因为R1是入站LSR,所以从外面发给它的数据包都是IP包,是不会有标签的,所以它是第一个向数据包加标签的LSR,可以看出只要它一开始往数据包里加上标签22后发给R2,最后就能一跳一跳地被发到R6,因为中间LSR的标签大家都是协商好的。在数据包到达R4时,R4就会将标签全部移除后发给 R6,因为是进入IP网络,没有必要再打标签发出去。要说明的是,该为一个路由条目产生什么样的本地标签,是LSR自己计算的,没有规则可言,从前面的传输过程可以看出,在MPLS网络中,LSR每次收到数据包,都要将标签改成对下一跳有利的标签才转发出去,这个对下一跳有利的标签就是自己看到的远程标签,也称为出口标签,这个标签就是邻居告诉自己的,因为看到什么标签才能正确转发,邻居是知道的,所以告诉给其它邻居之后,才能保证最终路径的正确。
打标签
所有LSR,根据路由表,将数据包打上标签,发出去,打的这个标签不能乱打,是有意义的,因为下一跳路由器要根据这个标签做出自己的决策,收到的路由器将 顶部标签(上一跳路由器加的标签)去除,再加入出站标签,然后再下一跳路由器重复之前的动作,所以每一台路由器都需要对路由条目的标签达成共识,要不然这 台路由器为数据包打上标签,给下一跳路由器,却不是按设想的接口发出去的,就不能到达目标网络。因此,每一台LSR必须明确哪个出站标签来交换哪个入站标 签,标签对于邻接LSR来说是本地有效,没有全局意义,这和帧中继的PVC是一个道理。所以,基于这些,需要有一种标签分发协议来为所有的LSR分发一个正确的标签,只有这样,LSR才能根据标签将数据包正确地发到目标网络。
标签分发方式
标签分发有两种方式:
1.在已存在的IP路由协议中分发标签。 2.使用一种独立的协议来分发标签。 1.在现有的路由协议中分发
距离矢量路由协议,比如EIGRP很好做,直接绑在前缀上,因为这样的路由协议可以随意修改路由条目的内容。
链路状态路由协议,比如OSPF和ISIS就比较难,因为是发链路状态,而链路状态必须毫无更改地发给邻居,更改链路状态数据包是违背原理。
所以也就没有IGP做标签分发的工作,但是BGP却可以同时发前缀和标签(注:BGP发标签是有条件限制的)。 2.标签分发协议
最终建议使用独立的分发协议,不影响路由协议,但需要在LSR上额外运行协议。
以下是可以分发标签的协议 标记分发协议(TDP) 标签分发协议(LDP) 资源预留协议(RSVP)
TDP是思科专有的标记分发协议,已经被LDP所取代。
LDP是IETF开发,功能广泛,所以只涉及LDP,因为TDP已不用了。 RSVP只用在MPLS TE中。
标签分发协议LDP
对于IP路由表中每一条IGP前缀,每台LSR都会进行本地捆绑,也就是为路由条目加上一个标签,这个标签称为本地标签,到时收到一个数据包后,看到顶部 标签如果是自己所拥有的本地标签,那么就根据这个标签从相应接口转发出去,所以邻居把数据包发给自己时,必须在数据包上写好自己对自己有利的标签,那么要 怎样才能让邻居写上一个能让自己看了就正确转发的标签呢,这就得自己把这个标签告诉邻居,自己把本地标签发给邻居后,这个标签对于邻居来说就称为远程标 签,每当邻居要发送数据包给自己的时候,就先把数据包的顶部标签改成远程标签,也就是改成之前发给邻居的标签,邻居改好标签后,把数据包发给我们,我们就能够做出正确转发了,那么邻居也会像我们一样,把自己的本地标签再发给它们的邻居,因为他要把数据正确发给我们,也是由它的邻居在数据包上写好标签告诉它 的。所以在邻居和邻居之后,是要大家协商好每条路由该写上什么标签后发给邻居。LSR把自己生成的本地标签,和邻居发过来的远程标签,不管是用的着的还是用不着的,统统都保存在一张标签表里,这个表称为LIB表(标签信息库)。LDP就是用来发送标签的协议。
已经介绍过,MPLS的标签,就像帧中继的PVC号码一样,只是每台设备唯一的,但是MPLS的标签,在设备上保持唯一还分两种,基于设备唯一和基于接口唯一。
如果基于设备,就是一条路由在一台设备上只有一个唯一的标签。
如果基于接口,就是一条路由在一台设备上,是每个接口都有一个唯一的标签。也就是说标签只要能保证在每个接口上是唯一的即可,在整台设备上可以重复多次。
但LSR可能有多个远程标签,因为可能有多个邻居LSR。
路由协议EIGRP会将所有邻居发给自己的路由条目存放在拓朴表里,再从拓朴表里选中最优最好的放到路由表也供自己使用,当路由表中的条目失效后,再从拓 朴表中拿出次优的使用。而MPLS标签交换的LSR也像EIGRP那样,会把所有邻居发来的标签都存放在LIB表里(就像EIGRP的拓朴表),然后会从路由条目的多个标签中选择一个最优的使用,这个选择方法可以通过IGP路由表,选到的下一跳是谁,那就用谁发来的标签,被选中的正在使用的标签,全部都是存放在LFIB(标签转发信息库)表里的,就像EIGRP的路由表。
注:IOS中,LDP不会为BGP的IPv4前缀捆绑标签。
标签的选择都是根据IGP最优路径。