MPLS基础
模式
标签分配模式(label allocation)本地为一条路由前缀绑定一个label标签的条件。
独立控制模式(independent control)本地RIB学习到的路由(除BGP)就会分配。
有序控制模式(odered cpmtrol)路由通告者通告给我label我才会为其分配label。
标签分发模式(label distribution)将label mapping message通告给邻居的条件。
下游自主模式(downstream unsolicited)下游自动将label通告给LDP邻居。
下游按需模式(downstream on demand)邻居向本地请求,本地才会通告label。
下游指数据流的下游,路由的更新方向永远是和数据包的方向相反。
标签保留模式(label retention)本地是否保留邻居的label。
自由保留模式(lileral retention)保留邻居的所有label。
保守保留模式(conservative retention)只保留RIB中下一跳邻居通告的label。
标签空间(label space)本地通告标签是接口有意义还是全局有意义。
基于平台(per-platform)全局意义,不同接口通告出去的同一FEC的label相同。
基于接口(per-interface)局部意义,从不同接口通告出去的同一FEC的label不同。
标签格式
一个MPLS标签由32bit(label20bit+EXP3bit+BoS1bit+TTP8bit=32比特)组成。
Label:范围0-1048575。0-15这16个标签被保留为特殊的用途,不能随便定义。
一个分组可以有多级标签(标签栈),在网络中的每一跳,只有最外层的标签起作用。用于LSR数据平面的标签是通过控制平面分配的,在中间节点中内层标签无关紧要。
EXP:保留给实验用,但一般用来做QOS标识,通常是TOS或COS映射来的。
S-bit:栈底位。标签栈最后的标签置1,其他置0。标签栈中标签的数量是没有限制的。
TTL:和IP头部的TTL功能完全相同为了防环,每经过一跳TTL减1。其实TTL位是直接对IP-TTL的拷贝(默认)。no mpls ip propagate-ttl该命令可以关闭MPLS-TTL对IP-TTL的拷贝,该命令会导致LDP将TTL为255的标签插入进分组。no mpls ip propagate-ttl forwarded意思是对穿越流量关闭TTL繁衍。no mpls ip propagate-ttl local对于本地发起的流量关闭繁衍,建议只关闭穿越流量的TTL繁衍。通过traceroute的原理可以推出这个结论。
标签封装
Label的封装:标签栈位于二层帧头和三层IP包头之间。所以必须在帧头之后附上新的信息,来表明二层帧头后面为label。
标签交换设备
标签交换路由器:支持MPLS的路由器,并可以在数据链路上接收和传送带label的报文
入站LSR:接受没有打上标签的报文,在报文前插入标签(标签栈)后转发报文。
出站LSR:接受到打上标签的报文,移除标签(标签栈)然后转发报文出去。
这两种都是边缘LSR:
LIB:标签信息库。Show mpls ip binding
LFIB:标签转发数据库。Show mpls forwarding-table
CEF:入栈是IP报文查CEF,入栈是label报文查LFIB!
LDP为除BGP外所有的RIB中的路由条目分发标签,并保存在LIB中,LIB中也包含从其他路由器收到的所有标签。
LFIB中存储的是LIB中的正在被使用的标签。RIB中的下一跳是谁,LFIB中就会使用谁的标签。如果RIB中出现负载均衡,那么标签也会负载均衡。
内部LSR:收到带有标签的报文后,根据标签交换将报文转发出去。
CEF是唯一一种使用LIB和LFIB表的交换机制,所以在运行MPLS的所有路由器上必须启用CEF。也因为只有CEF才是拓扑驱动的协议。标签的绑定是当控制消息到达时候被创建起来的。
六种标签动作
控制平面:控制平面进行LSR之间的路由信息和标签信息的交换。MPLS是一个控制平面驱动的协议。控制平面协议组件包括:BGP、MP-BGP、IGP、RSVP-TE、LDP、TDP等。本图主要描述控制平面LDP的功能和作用。
数据平面:数据的转发过程。包括标签的六种动作等。控制平面和数据平面相对独立。
LSP标签交换路径:报文在穿越MPLS网络的路径。LSP决定了MPLS在数据平面是面向连接的
LSP是单向的,并且是可以嵌套的。
标签动作:(impose、swap、POP、untag、aggregate、recursive)
Impose:数据包从IP网进入MPLS网络,压入一个或者多个标签。
Swap:标签的置换,将标签置换为另一个或多个标签。只能为一对一或一对多置换。
POP:标签的跳出,一次跳出一个标签。一般由邻居的隐式空标签告知;OptionB重分布直连(eBGP直连建立VPNv4邻接关系),自动生成的/32的BGP对等体直连路由是个例外。
No Label/Untag:一次性跳出所有的标签,untag是因为没有收到下游的标签并且路由还没有到达终点。做完untag就是纯IP数据包了。一般没有收到下游LDP是该状态。OptionB重分布直连是个例外。
No Label/Aggregate:删除栈顶标签,弹出标签后再做一次纯VRF的IP三层查找,被删除的标签为栈底标签,如果不是就丢弃分组。当数据包到达终点时一般都是aggregate,由MP-BGP生成。
Recursive:出现在optionB中,BGP下一跳递归到多个LDP标签(ASBR之间建立Lo接口的MP-EBGP关系,LO接口使用/32静态路由保证可达,静态路由指下一跳地址不能为接口,否则标签为untag)。IGP路由负载平衡,有多条到达对端ASBR路径,LDP才会负载平衡。新版本的IOS不会再显示递归动作,只显示VPNv4的BGP标签。
FEC转发等价类:一组沿着相同路径转发而且都按照相同规则执行的数据流。所有属于同一个FEC的报文都拥有相同的标签。用于相同的BGP下一跳地址的报文都属于同一FEC。可通俗认为就是一个IP前缀!
特殊标签
保留的标签(0-15)这些标签被保留下来用于特殊的作用。
隐式空(3):该行为使得上游路由器执行pop动作。在一条LSP的终点使用隐式空标签的行为成为PHP(倒数第二跳弹出)主要是为了避免多次查表;在倒数第二跳就不再打标签,直接发给最后一个路由器,省得它再去查两次表;最后一个路由器会发一个值为3(保留)的标签给自已的邻居.这个倒数第二跳是一个绝对的概念;实际上PHP就是路由器对自已的直连路由,会向自已的邻居发送一个POP标签。隐式空还用在标签栈中多个标签的报文中,这样向出站LSR传递的标签报文的标签数量就会少一个,这样出站LSR就不会执行两个标签的查找了。隐式空永远不会出现在MPLS报文的标签栈中。
显式空(0):隐式空跳出了顶层标签,但是标签可能有用于QOS的EXP位。显示空用来解决这个问题,这样出站LSR向倒数第二跳通告显式空标签,出站LSR就会收到带有0标签的包。LSR不能通过在LFIB中查找标签0来转发这样的报文,因为这个值可以分配给很多FEC,LSR只是去除0标签,进行另外的查找,但是这样就可以获取EXP信息。mpls ldp explicit-null
路由器告警标签(1):这个标签可以出现在标签栈除栈底以外的任何地方。当这标签位于栈顶该报文不会被通过硬件传输,会通过软件进行处理。一但这个报文被转发标签1就被删除了,然后LSR就会在LFIB中对标签栈中的下一个标签进行转发,于是标签1又会被添加进分组中。
OAM报警标签(14):用于错误检测、定位和监控实施。但是CISCO不使用这种方法来进行来进行操作管理和维护。
MPLS对TTL的操作
MPLS对TTL的操作(label到label的TTL):
如果在带标签的报文上实施的标签操作是swap的话,入站标签的TTL值会减去1以后复制到交换到的标签中。
如果操作是移除,那么入站标签的TTL减去1以后再复制到新的顶部标签中去。如果TTL值比新的顶部标签TTL要大,就不进行复制了。
MPLS对TTL的操作(ip到label或label到ip):
入站LSR:IP中TTL减去1后复制到label中。出站LSR:label的TTL减1后复制到IP的TTL中。但如果所接收到的带标签报文中的TTL比该报文中IP的TTL大的话就不会复制。
标签分发协议LDP
LSR如果进行标签交换就必须运行某种标签分发协议和标签捆绑交换。然后通过查找LFIB进行操作,LFIB是用过LIB中结合RIB最优路由下一跳得来的,LIB就是通过LDP、RSVP-TE、BGP接收到的和本地绑定的。然而RSVP-TE只在MPLS-TE中分发标签,BGP只为BGP的条目分发标签,那么就只剩下LDP才能为所有内部路由条目分发标签了。
如果要让LDP之间可靠的交换标签捆绑就必须建立他们之间的会话关系,和BGP一样他们之间的可靠性交给TCP似乎实现更理想一些。
LDP的四个基本功能(1.用hello进行LSR发现 2.session的建立和维护 3.标签映射的通告 4.使用notification进行协议管理)
Hello信息:两个LSR共享一个或多个链路时候发现对方。SA:出接口地址 DA:224.0.0.2。如果为目标hello就是单播!
LDP的基本配置:1.必须开启CEF ip cef 2.mpls label protocol ldp/tdp 指定标签分发协议(新版本默认为LDP) 3.mpls ldp router-id loopback0 [force] 指定LSR-ID,如果指明了force会立刻生效,这样会断掉以前的session。
LDP-ID=LSR-ID(4Byte)+label SpaceID(2byte)。LSR-ID的选举:1.IP地址最大的loopback接口地址 2.次选物理接口IP地址最大的。3.手工指定的最优先!
在接口启用LDP,进行发送和接收hello:mpls ip 在路由进程启用LDP,mpls ldp autoconfig所有启用OSPF路由协议的接口启用LDP,mpls ldp autoconfig area 0 所有启用路由协议并在area 0内的接口启用LDP。
启用目标hello两种方法:(主动方和被动方)目标hello单播发送 SA:自己的LSR-ID,目的地址是命令指定的地址。
主动方和主动方:router-A:Mpls ldp neighbor 2.2.2.2 targeted ldp(主动)
router-B:mpls ldp neighbor 1.1.1.1 targeted ldp(主动)
路由的可达性是最基本得前提,在此不再赘述。hello包中的目标hello-bit=1,目标请求hello-bit=1!
主动方和被动方:router-A:mpls ldp neighbor 2.2.2.2 targeted ldp(主动)
router-B:Mpls ldp discovery targeted-hello accept from 1
Access-list 1 permit 1.1.1.1 0.0.0.0 (被动)
被动方不会主动发起hello。他被动等待对方发起,然后才发送hello包。主动方的目标hello-bit=1,目标请求hello-bit=1;被动方的目标hello-bit=1,目标请求hello-bit=0。
修改session计时器:mpls ldp holdtime<15-2147483> keepalive始终为1/3!
修改hello间隔和holdtime:范围都是<1-65535>
mpls ldp discovery hello holdtime (直连)
mpls ldp discovery hello interval (直连)
mpls ldp discovery hello targeted-hello holdtime (目标)
mpls ldp discovery hello targeted-hello interval (目标)
U-bit(未知TLV-bit):一旦接收到一个未知的TLV,如果U=0那么一个notification必须发送到源而且整个消息都要被忽略。如果U=1那么这个未知TLV被忽略但是LDP会继续处理其余部分,好像这个未知TLV不存在。
F-bit(转发未知TLV-bit):这个bit只应用于当U-bit被置1时和LDPmessage包含未知TLV并且需要被转发的环境。如果F=0当message包含未知TLV不会被转发,如果F=1这个包含未知TLV的message会被转发。
查看邻居命令:show mpls ldp neighbor detail|Show mpls ldp discovery detail
查看LDP计时器:show mpls ldp parameters
LDP会话的建立和维护:TCP连接(源端口:大于1024随机 目的端口:646)
总是传输地址大的向传输地址小的发起SYN连接。地址大的为client,小的为server
如果这个TCP建立成功,那么LSR就开始交换LDP初始化消息和协商LDP的参数。如果LDP邻居都认可了对话参数,那么他们就会保留这个会话否则重新尝试建立会话连接
Mpls idp backoff initial-backoff(15S) maximum-backoff(120) 括号内为默认值
这可以减缓LSR之间尝试LDP会话的时间。如果会话建立失败,那么下一次在尝试的间隔时间将会成指出倍增长,直到达到maximum-backoff就认为无法建立会话。
LDP消息类型值
初始化包和keepalive包参数
LDP协议对所有直连接口的ip-address分配的都是3标签(隐式空)包括对于接口的辅助地址也如此分配。这个标签导致PHP路由器的POP动作。对于没有收到标签分配的路由条目,LDP会执行untag动作。
地址消息建立了标签空间和下一跳之间的联系。LSR查找路由表的next-hop
只有出现在下一跳路由器发送的地址绑定关系中该标签地址映射才会被使用。
标签撤回消息(label withdraw)和标签释放消息(label release)格式与address相同。当LSR收到一个标签映射就会一直维护该标签映射直到LDP会话断开或者这个标签被收回。当某前缀本地标签发生变化,LSR会发送一个标签撤回,接收方会立刻停止使用该标签并响应一个标签释放。标签释放消息确认了标签撤回消息中指明的标签绑定。
老版本并不会通告标签撤回,而是直接通告新的标签,通告新的标签就隐式的说明了旧标签的收回。如果要保留老版本的这种行为必须使用命令
Mpls ldp neighbor x.x.x.x implicit-withdraw
地址撤回消息(address withdraw)当一个地址变的不可达就会产生一个地址撤回消息。地址撤回消息只包含address-listTLV。
Notification:这个消息用来向LDPpeer通告重大事件。这些事可能是致命错误或是简单查询信息。如果是致命错误需要立刻终止LDP的session,并丢掉所有和这个会话绑定的有关信息。查询信息用来发送一个LDP会话的相关信息。通知信息分为(错误通告、报告通知)
触发notification的事件:错误的PDU或message、未知或不正确的TLV、会话保持存活时间到期、会话的非合法断开、初始化消息事件、内部错误、检测出环路、混杂事件、其他消息的事件结果。