LDP(Label Distribute Protocol):标签分发协议。
LDP邻居建立分为两个阶段:发现邻居阶段,会话建立阶段。
LDP报文除了Hello报文基于UDP之外,其它报文都是在TCP之上,端口号为646。
发现邻居阶段:使用UDP报文
运行了LDP协议的设备会在邻居发现阶段发往224.0.0.2这个组播地址,用以寻找全网运行了LDP协议的设备,进而达到邻居发现的目的。
LSR ID:一把情况下,也就是Transport Address,用于建立LDP邻居使用的ID。
发现邻居阶段的目标:确认TCP连接阶段的主动发起方。传输地址大的一方为主动发起方,使用传输地址建立TCP连接。默认情况下,Transport Address 为LSR的Router ID。
会话建立阶段:使用TCP报文
进行参数协商,最终发送Keep Alive报文进入通信保持阶段。
LDP协议标签映射信息
分配模式
**独立控制模式:**只要本地通过IGP学习到路由前缀,就会为这条路由前缀分配标签(本地也会为直连路由分配POP标签)
IN标签:(相对于自身来说,这是)我给别人的(在自己这里)
OUT标签:(相对于别人来说,这是)别人给我的(也在自己这里)
只要收到路由,立即进行标签的分配,不管有没有收到别人发来的out标签。
**有序控制模式:**本地通过IGP协议学习到路由前缀,但是必须在该路由前缀的下一跳路由器将该前缀所对应的标签映射消息通告给本地,本地才会为该前缀分配标签。
就是必须一步一步来,没有收到下一跳路由器发送的标签,是不准先向下进行标签的分配。
分发模式
下游主动模式:Downstream Unsolicited
本地会主动将生成的标签映射消息通告给所有的LDP邻居。
下游按需模式:Downstream On Unsolicited
只有邻居向本地请求某条前缀的标签映射消息时,本地才会通告标签映射消息给邻居。
保留模式:本地是否会在数据库中保留从邻居接收到的所有标签映射消息
自由模式:
所有的LDP邻居通告给我的标签映射消息,我都会放在我的数据库中。(不管是最优的标签路径,或者不是都会保存在数据库中)
保守模式:
本地仅保存最优路由下一跳邻居所通告的该路由前缀的标签映射消息。
标签空间
基于平台:
每个标签在本设备中所对应的路由条目是唯一的。
基于接口:
相比于基于平台,一个路由条目在一个设备的不同接口中,对应的标签时不一样的。
MPLS数据转发过程
首先在MPLS域的入路由器(Ingress)先打上标签,然后中间设备再进行标签交换进行转发,到了出MPLS域的设备(Egress),其首先会检查标签信息表,发现下一跳是出接口,然后弹出MPLS标签,再进行IP路由表的查看,再进行转发,相比于中间设备,出接口设备的负载显得稍微有些大,所以有没有办法进行优化呢?
Penultimate Hop Popping
PHP(Penultimate Hop Popping 倒数第二跳弹出):过程如下:
RTC收到RTB发送的带1026的标签的报文,查找LFIB,发现分配的出标签是隐式空标签3,于是执行弹出标签的动作,并将IP数据包转发给下游路由器RTD。
RTD收到RTC发送的IP报文,直接查找自身的FIB,根据FIB表中的出接口进行IP数据的封装并转发。