支持MPLS的路由器 — LSR MPLS 转发路径 — LSP (LSP是单向的)
MPLS转发依据: 标签,打在二层和三层之间,标签的叠加意味着LSP链路可以叠加。记住:本地标签自己不用,是给别人看的
转发机制:类型于ARP寻址,把自己的标签(成为本地标签)通告给LSP上游路由器,并且寻求/获取下游路由器的标签(即远程标签)来作为转发标签
整条LSP上的LSR动作: 打上标签--换标签--换标签--...--去标签
分发标签的依据:FEC,转发等价类,说明什么样的数据会打上同样的标签,比如去往相同网络前缀的数据打上同一个标签。一般而言都是将IGP前缀与标签进行捆绑,每一台MPLS路由器都执行这样的动作。
如何分发标签:1)借助BGP协议为MPLS/×××分发标签 2)专门的分发标签的协议:LDP (IETF) TDP(Cisco私有)
MPLS应用: 1)××× 简化对等体模型 2)AToM 集成IP和ATM,在ATM中转发IP流量 3)流量工程TE
流量工程:IGP只选最佳路径,TE能使其即使不是最佳路径也走这条道,从而充分的利用链路,MPLS TE使用RSVP分发标签,可以实现FRR(快速重路由)
MPLS Vs IGP
IGP路由器 自己搜集链路信息 -- 发现建立邻居 -- 相互通告 -- 生成路由表RIB -- 网络收敛,开始转发数据包
MPLS路由器 自己将RIB中的IGP前缀与标签进行捆绑 -- LDP邻居相互通告 -- 从LIB中筛出LFIB -- 依据LFIB转发数据包
LSR的心里话:我跟你说,我为自己路由表中的10.0.0.0/8这条路由(网络前缀)打上标签33,如果你需要我帮你发送去往10.0.0.0/8的数据包,就把它打上标签33然后发给我!
记住:FEC是一类报文的总称,一般我们会涉及的两个FEC实例有两个:
1)目的地址为相同的IGP前缀的报文,比如凡是通过IGP路由去往10.1.1.0/24的数据包是一个FEC
2)目的地址为相同的BGP前缀,且BGP下一跳相同的报文
标签的分发是两个动作:先绑定再发出去,在IP网络中,绑定一般是每个IGP前缀分一个标签,然后将标签和前缀的“对应结果”通告给邻居LSR,记住是对应结果,而不仅仅是标签,这样邻居才知道如果你是某一目的地的下一跳,应该把粘上哪个标签发给你。
OSPF接收LSA形成LSDB,从LSDB中计算出最佳路由放入路由表RIB,选择的标准是Metric
LDP路由器接收Label信息形成LIB,从LIB中选出最佳路径(对应的Label)放入LFIB,选择的标准是符合IGP条目中的下一跳。
LFIB中有两列重要的信息:本地标签和出口标签,本地标签是本地产生,通告给LSR上游的标签(实际上大多采用主动分发模式,所有邻居都会收到,但是只有上游LSR理你),通过本地标签明确邻居发给自己是想去哪里;出口标签是下游LSR通告进来的标签,给数据包打的标签从这里面选。
标签的使用范围:IOS中只有LC-ATM是标签在接口范围内使用,其余的都是整台LSR共用标签。
基于路由器的标签范围,路由器各接口使用的标签值不得重复;而基于接口的标签范围则允许出现重复,因为各接口相互独立,但是数据包的转发就不能只依据标签值,而是接口和标签值,原因如下:
比如一台路由器的两个接口A和B都向上游LSR通告标签30,对应的却是不同的IGP前缀,这样上游LSR会很迷惑,因为标签对应的目的网络不唯一,但是用接口+标签就可以区分开来了。
标签分发模式 (IOS中只有LC-ATM用DOD,其余都是UD)
记住:在标签还没有分发之前,LSP就已经确定了,因为分发的依据是RIB,所以LSP就是IGP最优路径,只不过标签分发完成后LSP才真正形成。
<下游被动 DOD -- 你要我才给你>
比如我的RIB中写道:178.1.1.0/24 via 12.1.1.1 , serial 1/0 。我知道不管怎样,有去往178.1.1.0/24的数据包我就要发给下一跳12.1.1.1,从我的S1/0发出去。那么我就得问问下游的12.1.1.1 : 要把去往178.1.1.0/24的数据包发给你,我得打多少号标签? 下游收到这样的查询之后才会把标签分发出去
<下游主动 UD -- 你不要我也给你>
不要也给,意味着不区分上下游,是LSR邻居我就发,所以每一台LSR都会收到一些标签信息。LSR收到这些标签信息以后要根据RIB判断出哪一个标签是IGP路由的最佳下一眺发给自己的,然后选出来放进LFIB中。
标签的保留(IOS中只有LC-ATM用CLR,其余都是LLR)
LLR 自由模式 收到的标签信息我都留着,一旦路由发生变化我马上就能知道换什么标签转发,自由模式对网络变化的适应力强,但是占用资源
CLR 保守模式 我只留着最优的标签信息,路由变动我再去请求,保守模式节省资源但是收敛延迟大
创建标签过程
独立于LSP 有对应的路由条目就打上标签,这样LSP建立速度快,但是可能到这一跳LSP还没建好就有数据包传过来(MPLS是PHB行为),这种情况下只能按IGP进行路由,如果IGP还没有(比如还没有收敛)就只能丢弃数据包了。
非独立于LSP 打标签要求相对严格,路由条目必须标记为连接状态(像RIP那样Possibly Down的就不行),且收到IGP下一跳的标签信息,我才会对这个数据包打标签。也就是说我觉得自己能转发,下游邻居也跟我打招呼了说转发没问题,我才能安心的用标签。
PS:接收到带有未知标签的数据包,IOS的处理方式是丢弃
在IOS部署MPLS一定要启用CEF,因为CEF交换是唯一一种可以用于标记报文的IP转发模式。
CEF也只能为IP报文添加标签,在入站LSR开始
CEF对MPLS的支持,另一方面表现在可以递归查找路由表,这对BGP很重要,指向同一个BGP下一跳的报文会带有相同的一层标签,顶部再打一层标签用于IGP路径对应的LSP
LDP协议 LDP是IETF定义的标签分发协议,其组成部件和路由协议无出其右
以Hello建立维护邻接关系,以LDP ID表明路由器身份,以组播地址224.0.0.2通告信息,用UDP 646端口传送发现消息(即Hello),用TCP 646端口建立LDP会话,保证后续消息可靠传输,LDP会话不一定直连,比如通过 MPLS/××× 中的TE隧道建立。
LDP ID和RouterID基本一样,手动指定优先级最高,自动选举是最高环回和接口IP,有一点不用的是,手动指定的时侯如果加了关键字Force,即使已经选定了LDP ID也会立即更改,没加的话就是重启后生效。
LDP标签过滤 远程标签的接收是强制性的,因为这些标签通告出来的时候信息已经绑定好,不接收就没法选出最优的。就一台LSR而言,只能控制本地标签的通告,即通过过滤决定将哪些标签信息通告出去。
记住:所谓的LDP只能在入站过滤,就是只能控制本地标签的通告,因为数据包的入站口 = 标签分发的出站口
三层×××方案:(二层×××是通过FR,ATM中的虚链路来实现,为×××覆盖模型)
三层×××希望采用对等模型,ISP和客户交互链路选择信息,以最优的路径中继客户站点之间的数据,不需要客户的参与,同时可以融合多种物理介质和链路,成本上也具有很大优势。
对等模型最大的问题出在用户的隔离上,所有的用户路由会集中在ISP的同一个路由表中,要实现真正意义上的×××有些困难。
×××用户处于成本考虑很可能在使用私有地址,一旦有×××用户使用相同的地址段,P网路由器很容易出现混淆,因为都是在一张路由表中维护;如果要求每个×××用户都使用相同的地址段,必然导致路由表的庞大,一旦超出IGP的承载范围,就只能用BGP实现,同时路由器的性能也会因此受到更大的挑战。
一旦用复杂的过滤和路由策略来实现隔离,维护的开销很大,而且VRF几乎不可避免,可扩展性很有限,每添加一个用户,就要在承载网中的每一台路由器上添加新的VRF。如果隔离用专有路由器来实现,隔离是相对容易些,但是成本上可能就接受不了。
目前最好的三层×××方案就是MPLS/×××
1.P路由器不运行BGP,且只进行标签转发。
2.只在PE路由器上维护VRF路由表,VRF中只添加×××路由,且与接口关联,即只有从VRF接口进入PE的数据包才会通过VRF CEF表转发。
3.RD 只需在PE上设定,准确来说,RD用来标记一个VRF路由表,而不是一条×××,在×××路由通过M-BGP传递的过程,IPv4前缀和RD组合成的×××v4前缀可以保证唯一匹配,从而实现路由转发,这样就解决了<重叠的私有地址在P网中传输>的问题。
RD只对应一个VRF,但可能对应多条×××,像是总公司和两个子公司分别建立×××,形成Hub-and-Spoke拓扑,那么这3个场点设定的一个RD就对应了两条×××。
4.RT RT是BGP的扩展属性,用于在×××所连接的各场点实现路由控制,可以说是为BGP传递××× v4路由而服务的。
需要指明的是:
RT和RD格式相同,也只需在PE中部署,但是数值上并没有什么联系,RD在NLRI中标示,而RT在BGP的扩展属性中标识。
VRF的名字只有本地意义,RD才是区分的关键,一条×××两端的站点使用相同的RD,表明是一伙儿的。
RD是硬性的,有RD才能将整个路由表分隔开,才能形成VRF,才能使IP前缀在M-BGP网络中传输的时候以×××v4的形式保证唯一匹配,正常转发,有RD才能形成×××,至于形成几条,那要看具体拓扑。
RT是策略性的,×××已经通过RD架设好,RT要决定数据的走向。RT可以实现×××内通信和×××间的通信,决定PE是否接收或者发送属于这个VRF的路由。
那么×××间的通信是如何实现的? RT是在VRF进程下配置的,所以也只能控制该VRF的路由,export 1:100,就意味着凡从我这个VRF发出的数据包都会标记上1:100,import 1:200,就意味着凡是给我的数据包得标记有1:200我才会收,否则我就丢弃。
MPLS/××× 数据转发
MPLS/×××一般只用BGP的一个AS,PE间运行i-BGP,在PE上必须要做的一次重发布是将BGP路由导入CE(因为×××对端的路由是通过BGP传递的),而将CE的路由导入到P网当中是否需要重发布就要看PE和CE运行的路由协议了,如果是eBGP,则不必重发布,会自动通告,而如果是IGP,重发布就是必要的了。
PE从CE那里获得路由(这一步不受RT控制,都不涉及BGP),打上RD注入相应的VRF路由表,依据RT判断是否可以将该路由导出,若允许则在扩展属性中表明,即打上RTs发送出去。
在P网络中依据标签转发,P网络并不运行BGP,不过出于网络扩展的目的,可能会设置一个RR用来反射×××v4路由,或者设多个RR实现冗余,分担×××v4条目,通常情况下RR不负责实际流量的转发,只有在自己是路由下一跳的时候才会修改标签。
顶部IGP标签让P路由器转发给正确的PE,根据倒数第二跳移除的原则,到达PE时已经没有改IGP标签,意味着叠加的那一条LSP的结束,而×××标签对应的LSP直到发送给正确的CE才是终结。
到达对端PE以后,查看数据包中标记的RT,判定是否可以接受标有这样RT的路由,若允许则放入VRF路由表中,再通告给CE。
MPLS/××× 在P网中的转发需要双标签,即两条LSP叠加在一起。位于顶部的是IGP标签,通过LDP或者TE的RSVP分发,用于在所有P和PE路由器上一跳一跳转发,×××两端的PE分别是这条LSP的入站和出站LSR。位于底部的是×××标签,唯一对应着一个×××v4前缀,PE路由器通过MP-iBGP通告该标签,原理是一样的,距离可能远点。×××标签用于找到对应的VRF以及IP路由条目,然后转发给对应的CE。