一、LDP邻居发现和会话建立
1.1 LDP基本概念
- MPLS需要使用标签分发协议完成标签的分配控制和保持
- 目前有很多种标签分发协议,LDP(Label Distribution Protocol)为其中之一
- LDP为FEC分配标签:LDP邻居之间发送Label/FEC映射信息
1.1.1 LDP消息类型
LDP消息承载在UDP或TCP之上,端口号为646
Discovery message: 宣告和维护网络中一个LSR的存在。
- Session message: 建立、维护和终止LDP Peers之间的LDP Session。
- Advertisement message: 生成、改变和删除FEC的标签映射。
- Notification message: 宣告告警和错误信息。
- 注意,上面的只是消息类型,并不是真正的协议报文
1.1.2 LDP消息类型与封装格式
- LDP Header
- Version:2B,表示LDP版本,当前版本号为1
- PDU Length:2B,字节为单位,表示除了Version和PDU Length以外的其他部分的总长度
- LDP Identifier:6B,前4B用来唯一标识一个LSR,即LSR ID,后2B用来表示LSR的标签空间,LDP Identifier用来表示LDP会话的Peer ID(类比OSPF和BGP的Router ID,只是LDP的LSR ID一定要手工配置,另外如果没有配置Transport Address,LSR ID也会用作TCP连接和LDP Session的建立)
- LDP Message
- U:1B,为Unknown Message bit,当LSR收到一个无法识别的消息时,该消息的U=0时,LSR会返回给该消息的生成者一个通告,当U=1时,忽略该无法识别的消息,不发送通告给生成者
- Type:2B,表示具体的消息类型,可参考1.1.3
- Message Length:2B,以字节为单位表示Message ID、Mandatory Parameters和Optional Parameters的总长度
- Message ID:4B,用来标识一个消息
- Mandatory Parameters:该可变长消息的必须的参数
- Optional Parameters:该可变长消息的可选的参数
1.1.3 LDP消息作用
- Hello报文用的是UDP封装,Session Message用的是TCP封装
Label Mappping消息很重要,其实就是标签的映射信息(FEC对应一个标签,在华为设备中,默认情况是以IP前缀来划分FEC,所以不同的前缀就对应不同的标签)
补充说明:Label Withdraw Message:用来撤消FEC/Label映射。LSR通过发送Label Withdraw Message告诉对等体该对等体不可以继续使用自己以前通告给他的标签。
- Label Release Message:用来释放标签。当一个LSR不再需要以前从LDP Peer收到的标签时,就发送一个Label Release Message给该LDP Peer。
- Notification Message:用来通知LDP Peer错误信息或者其他一些辅助信息如LDP Session状态等。
1.1.4 LDP的四个阶段
- 发现(Discovery)消息:用于通告和维护网络中LSR的存在;
- 会话(Session)消息:用于建立、维护和终止LDP对等体之间的会话;
- 通告(Advertisement)消息:用于创建、改变和删除标签—FEC绑定;
- 通知(Notification)消息:用于提供建议性的消息和差错通知。
为保证LDP消息的可靠发送,除了发现阶段使用UDP传输外,LDP的Session消息、Advertisement消息和Notification消息都使用TCP传输。
1.2 LDP邻居发现机制
- LDP基本发现机制可以自动发现直连在同一条链路上的LDP Peers,所以这种情况下不需要明确指明LDP Peer
- 使用组播,只在本地链路有效,而扩展发现机制使用单播
1.2.1 LDP基本发现机制
- LSR通过周期性(5s)地发送Hello Message表明自己的存在。
- Hello Message消息是封装在UDP报文中的,目的端口号为646。在LDP基本发现机制中,该消息的目的IP地址为组播IP地址224.0.0.2,即该消息发给该网段上所有的路由器(如图中的SWA和SWB分别周期性地发送Hello Message给224.0.0.2)。
- Hello Message中携带了LDP Identifier(LSR ID)信息以便告诉对方自己使用的标签空间。
- 然后LSR ID IP地址(Transport Address )大的LSR作为主动方发起TCP连接。(原则:使用一个TCP Session就可以了)
- TCP连接建立之后,LSR会继续发送Hello Message以便发现新的邻居或者检测错误。
- 补充1:LDP基本发现机制分析
可以看到,Hello Message的源地址就是接口的IP地址,目的地址为224.0.0.2。
另外,Hello Message中有一个非常重要的字段:
就是Transport Address,可以看到,后面的TCP连接和LDP Session的建立都是通过该地址进行的。
默认情况,Transport Address是LSR ID,并且LSR ID一定要手工配置的。
1.2.2 LDP拓展发现机制
- Hello Message的源端口是否一定是646呢?是的
- 与LDP基本发现机制不同的是,LDP扩展发现机制是运行LDP协议的LSR(如SWA)周期性地发送Hello Message给特定的目的IP,所以需要通过配置指定建立Session的LDP Peer
- 另外一个LSR(如SWB)将决定是否要回应该报文,如果要回应,则通过发送Hello Message给特定的LSR(SWA)。
1.3 LDP会话建立过程
1.3.1 LDP Session建立和维护1
- 建立TCP连接之前,两个LSR(如图中SWA和SWB)首先会决定使用哪个地址建立TCP连接以及谁是主动方谁是被动方,然后由主动方发起连接。
- 如果Hello Message中携带了Transport Address,该Transport Address用于建立TCP连接,如果Hello Message中没有携带Transport Address,LSR ID用于建立TCP连接。两个LSR都从对端发来的Hello Message中获得对端用于建立TCP连接的地址,然后比较两个地址的大小,地址大的作为主动方发起TCP连接,图中SWB作为主动方发起TCP连接。
- TCP连接建立之后,由主动方(SWB)发出Initialization Message携带会话协商参数,如LDP协议号,标签分发方式等等,被动方(SWA)检查参数能够接受,如果接受则发送Initialization Message并携带自己希望使用的协商参数,并随后发KeepAlive Message。(实际测试的结果是,被动方的这两条消息是同时发送的)
- 直到双方都收到对端的KeepAlive Message后,会话建立。两个LSR就会成为LDP Peers并交换Advertisement Message。
- 补充1:Initialization Message报文示例
初始化消息,可以看到最后一个是标签空间。
- 补充2:协商完整过程
注意的第一点是,被动方回复的初始化消息和Keep Alive消息是封装在同一个数据包中的:
注意的第二点是,协商完成后会发送Address Message,这只是该peer上有的IP地址(宣告接口地址,就是peer所有使用了MPLS和MPLS LDP的接口的IP地址,当然LSR ID的l0口可以不使能),而不是FEC/Label映射消息:
注意的第三点是,接下来才会互相发送FEC/Label映射消息(Label Mapping):
可以看到,一个FEC一个Label Mapping Message,其关键的字段为:FEC Element Type(Prefix FEC),FEC Element Length(32),Prefix(10.1.3.3)
1.3.2 LDP Session建立和维护2
- 如果被动方(SWA)不接受协商参数,则发送Error Notification Message给对方取消连接。
1.4 LDP会话配置
本地LDP会话(Local LDP Session):建立会话的两个LSR之间是直连的;
远端LDP会话(Remote LDP Session):建立会话的两个LSR之间是非直连的。
1.4.1 本地LDP会话基本配置
- 图中,SWA 的Loopback1地址为1.1.1.1/32,SWB 的Loopback1地址为2.2.2.2/32,SWC 的Loopback1地址为3.3.3.3/32,SWD 的Loopback1地址为4.4.4.4/32。各交换机之间的互连地址如图所示。
- 配置SWA和SWB之间正确建立LDP Session,以便分发标签。
- 配置基本思路:
- 1、首先需要配置SWA和SWB的mpls lsr-id,用于建立和维护LDP Session。VRP没有缺省的LSR ID,必须手工配置; lsr-id使用IPv4地址格式,在MPLS域内唯一;通常使用Loopback接口的IPv4地址作为LSR ID。
- 2、lsr-id是用来建立LDP Session,缺省情况下使用lsr-id建立TCP连接(实际上TCP的建立和LDP Session的建立都是使用**Transport Address**建立的,只是默认情况下就是LSR ID)。所以交换机上要配置路由协议使得SWA和SWB的lsr-id之间可达。
- 3、全局模式下,使能MPLS和MPLS LDP。
- 4、相应的接口下,使能MPLS和MPLS LDP。
- 验证如下:
- Peer-ID为LDP Peer的LDP Identifier,由LDP Peer的lsr-id(这里为 2.2.2.2)和表示标签空间的2Bytes(这里为0,表示基于平台的标签空间)构成。
- 也可以使用dis mpls ldp peer来查看LDP Peer的信息,加个verbose就可以查看peer的Transport Address
- 可以指定使用直连接口来建立TCP连接
1.4.2 远端LDP会话基本配置
- 验证如下:
1.5 LDP状态机
- NON-EXISTENT状态:该状态为LDP Session最初的状态,在此状态双方发送HELLO消息,选举主动方,在收到TCP连接建立成功事件的触发后变为INITIALIZED状态。
- INITIALIZED状态:该状态下分为主动方和被动方两种情况,
- 主动方将主动发送Initialization消息,转向Opensent状态,等待回应的Initialization消息;
- 被动方在此状态等待主动方发给自己的Initialization消息,如果收到的Initialization消息的参数可以接受,则发送Initialization和KeepAlive转向OPENREC状态。
- 主动方和被动方在此状态下收到任何非Initialization消息或等待超时时,都会转向NON-EXISTENT状态。
- OPENSENT 状态:此状态为主动方发送Initialization消息后的状态,在此状态等待被动方回答Initialization消息和KeepAlive消息,如果收到的Initialization消息中的参数可以接受则转向OPENREC状态,如果参数不能接受或Initialization消息超时则断开TCP连接转向NON-EXISTENT状态。(实际测试是,被动方会同时发出Initialization和KeepAlive消息,所以主动方收到后直接进入OPERATIONAL状态)
- OPENREC状态:在此状态不管主动方还是被动方都是发出KeepAlive后的状态,在等待对方回应KeepAlive,只要收到KeepAlive消息就转向OPERATIONAL状态;如果收到其它消息或KeepAlive超时则转向NON-EXISTENT状态。(实际测试是,被动方会同时发出Initialization和KeepAlive消息,所以主动方收到后直接进入OPERATIONAL状态)
- OPERATIONAL状态:该状态是LDP Session成功建立的标志。在此状态下可以发送和接收所有其它的LDP消息。在此状态如果KeepAlive超时或收到致命错误的Notification消息(Shutdown消息)或者自己主动发送Shutdown消息主动结束会话,都会转向NON-EXISTENT状态。
1.6 LDP状态机案例分析
二、LDP标签管理
2.1 LDP标签空间
2.1.1 LDP标签空间报文
- LDP Header中包含6Bytes的LDP Identifier,其中前4Bytes表示Lsr-id,后2Bytes表示标签空间,LDP Identifier也用来表示LDP会话中的Peer ID
- 标签空间有基于平台的标签空间和基于接口的标签空间,当后2Bytes填充0时表示基于平台的标签空间。
- 帧模式封装的MPLS使用基于平台的标签空间,信元模式的MPLS使用基于接口的标签空间。
2.1.2 VRP标签空间
- 可以看到VRP使用基本平台的标签空间(2.2.2.2:0)
2.1.3 基本平台的标签空间
- 简单解释为:对于不同的前缀,分配的标签肯定是不一样的;而对于相同的前缀,分配给不同的邻居的标签都是一样的,不管从哪个接口发出。
- 基于平台的标签空间中,LSR为一个目的网段分配只分配一个标签,并将该标签发送给所有的LDP Peers。该标签基于平台,可以用于本LSR任意一个入接口。
- 故该方式可以节省标签。
- 节省设备的资源。
- 帧模式的MPLS缺省都使用基于平台的标签空间。
- 如上图,SWB为10.1.0.0分配一个标签1029并分别发送给他的LDP Peer SWC和SWE。所以SWC上到达10.1.0.0的数据包封装出标签1029并通过接口Vlanif2转发给下一跳SWB,同样SWE上到达10.1.0.0的数据包也封装出标签1029并通过接口Vlanif4和Vlanif3(在SWE和SWB之间存在两条链路)转发给下一跳SWB 。
- 在SWB上根据入标签转发,入标签为1029的数据包从接口Vlanif1转发出去。
- 另外还可以看出在SWE和SWB之间虽然存在两条链路,但是LDP只建立一个Session传递标签。故基于平台的标签空间可以最小化LDP Session的数量。
- 但是基于平台的标签空间在安全性上有这样一个弊端:假设SWB只向SWC分发了标签1029,并没有向SWE发送标签,即SWB不希望标签转发从SWE来的数据包。
- 但是如果在SWE上有攻击者伪造了标签为1029的报文发给了SWB,由于SWB转发的时候只是根据入标签去匹配但是并不检查入接口,所以按照SWB上的标签转发表,SWB也会将这个非法报文转发。
2.1.4 基于接口的标签空间
- 简单解释:即使是相同的前缀,从不同的接口分给不同的邻居,标签也是不一样的。
- 弊端:维护的标签空间多,设备资源消耗大。
2.2 LDP标签分发
2.2.1 DU下游自主
- DU:Distribution Unsolicited下游自主,下游指的是LSP的下游,**华为设备默认情况下就是下游自主方式(就是下游会自动为上游分发标签,记住标签一定是下游为上游分发的**)(帧模式使用的就是DU的方式)
- DU方式下,无需上游交换机请求,下游LSR将根据某一触发策略向上游LSR发送相应网段(通过配置可以分别实现对路由表中所有网段、对路由表中主机路由或者对特定的IP Prefix分发标签)的标签映射消息(Label Mapping Message)。
- 上游和下游的概念:对于2.2.2.2/32,下游LSR为SWB,上游LSR为SWA,SWC;对于1.1.1.1/32,下游LSR为SWA,上游LSR为SWB(从数据沿着LSP的路径去转发的角度去理解就好了)
2.2.2 DoD下游按需
- DoD:Distribution on Demand下游按需,收到上游交换机的标签请求消息才发送标签映射消息(信元模式使用的就是DoD的方式)
- DU方式不会发送标签请求消息,DoD方式下才会发送。
- DoD方式下,只有当收到上游交换机请求特定网段的标签请求消息(Label Request Message)时,才发送标签映射消息(Label Mapping Message)给上游交换机。如图中SWB只有收到SWA的标签请求消息(2.2.2.2/Label)时才会发送标签映射消息给SWA(2.2.2.2/1029)。
2.2.3 配置实例与分析
- 下面的说明,都是针对SWB上的2.2.2.2/32来作为下游。
- 上图中,SWA和SWB之间使用VRP5.30缺省的标签分发方式DU,SWB和SWC之间配置为DoD方式。
- 在SWA和SWC上都配置为触发建立LSP,分别观察SWB,SWA和SWC上的标签情况。
- 配置解释:
[SWB-mpls] lsp-trigger host
配置32位地址的主机IP路由触发建立LSP,默认情况也是这样[SWC-mpls] lsp-trigger none
不触发建立LSP,表示本设备不会产生任何前缀的LSP,即不会为任何前缀产生标签(还有all等其他参数)
- 可以看出,由于SWB和SWA之间采用DU方式分发标签,所以虽然上游交换机SWA没有向SWB请求标签,但是SWB依然发送标签映射消息给SWA,在SWA上能够看到SWB分发的标签。
- 而SWB和SWC之间采用DoD方式分发标签,因为上游交换机SWC没有请求标签,所以SWB没有发送标签映射消息给SWC,故SWC上没有相应的标签映射。(因为在SWC上配置了lsp-trigger none,即不会产生任何标签,所以SWC也不会发送标签请求消息,或者说也没有必要去发送请求了,但是如果重新配置为lsp-trigger host后,就会发送请求,即标签分发模式为DoD时,才会发送标签请求消息,分发方式为DU时,就没有这个必要了,另外需要注意的是,**同一链路上两个接口的标签分发模式相同才可以建立LDP Session**)
2.3 LDP标签控制
- 后面的说明都是以目的地为1.1.1.1/32的LSP来作为例子进行说明的。
2.3.1 Independent独立的(+DoD)
- 简单解释:只要我IGP有前缀,就马上去为这些前缀分配标签,同时发送给所有邻居,而不管是否有收到这些前缀的下一跳发来的标签信息(比如华为设备默认只为直连的/32主机分配标签,即lsp-trigger host,如果采用独立模式,那么,即使不是直连的/32主机,也会为其分配标签,并发送给它的所有邻居,显然独立模式跟华为设备默认的方式是相反的)
- 采用Independent控制方式时,每个LSR随时可以向邻居发送标签映射。
- 在使用DoD作为标签分发方式的情况下,当LSR(图中SWC)收到上游交换机(图中SWD)发来的标签请求消息时,不必等待自己的下游交换机(如图中SWB)发来标签映射,就可以立即响应该标签请求消息发送自己的标签映射给上游交换机(图中SWD)。
2.3.2 Independent(+DU)
- 在使用DU作为标签分发方式的情况下,无论何时,只要LSR准备好标签转发相应的FEC,就可以向其邻居发送标签映射。
如上图中,配置SWA不触发LSP,SWB对所有路由触发LSP,由于SWB使用Independent作为标签控制方式,所以尽管它的下游交换机(SWA)不会给它分发标签,它也会发送标签映射给它的上游交换机(SWD)。
案例如下:
- 上图中,SWA和SWB之间采用DU标签分发方式,SWB上配置采用Independent标签控制方式,SWB上通过路由协议学习到SWA所连接网段的路由,并且配置SWB所有静态路由和IGP路由项触发建立LSP,SWA配置为不触发LSP 。观察SWB和SWC上的标签信息。
- 验证如下:
- 可以看出,虽然SWA(下游交换机)没有分配标签给SWB,但SWB采用Independent控制方式,仍然发送标签映射消息给SWC(上游交换机)。
2.3.3 Ordered有序的(+DoD)
- 简单解释:SWB想为SWC分配1.1.1.1的标签,则必须收到通过前缀1.1.1.1/32的下一跳发来的标签消息之后,才能给SWC进行分配。
- 当标签控制方式为Ordered,只有当LSR收到特定FEC下一跳发送的特定FEC-标签映射消息或者LSR是LSP的出口节点时,LSR才可以向上游发送标签映射消息。(一定要注意上游和下游的概念是针对LSP的,而不是针对设备的)
- 上图给出了标签控制方式为Ordered,分发方式采用DoD时标签的分配情况 ,SWD向下游交换机(即特定FEC下一跳交换机)LSR SWC请求1.1.1.1的标签,SWC只有在收到他的下游交换机SWB发给他的标签映射消息之后才可能给SWD分发标签,所以SWC在给SWD分发标签之前,首先发送标签请求消息给SWB,SWB再发送标签请求消息给SWA,由于SWA是该LSP的出口节点,所以SWA分发标签给SWB,SWB收到SWA分发的标签后,再分发标签给SWC,SWC收到SWB分配的标签后,再为SWD分发标签。
2.3.4 Ordered(+DU)
- 华为设备默认就是使用DU+Ordered的方式。
- 上图给出了标签控制方式为Ordered,标签分发方式为DU时标签的分配情况。
下游交换机SWA发送1.1.1.1的标签映射消息给SWB,SWB收到下游交换机SWA分发的标签后给SWC分发标签,SWC收到SWB发来的标签后再给SWD发送标签。
案例如下:
将SWB上的标签控制方式改为Ordered。SWB是否会给1.1.1.1/32分发标签呢?
验证如下:
- 使用display mpls lsp查看SWB的LSP,可以看到SWB上配置了使用Ordered的标签控制方式后,由于SWB没有收到下游交换机SWA给1.1.1.1/32分发的标签(在SWA上使用lsp-trigger none命令禁止了触发对本地路由分发标签),所以SWB就不会给上游交换机SWC发送1.1.1.1/32标签映射消息,即不建立LSP。
2.3.5 标签分发和标签控制实例分析
- DU+Independent(下游自主+独立模式)
- 上图中,SWA和SWB之间采用DU标签分发方式,SWB上配置采用Independent标签控制方式,SWB上通过路由协议学习到SWA所连接网段的路由,并且配置SWB所有静态路由和IGP路由项触发建立LSP,SWA配置为不触发LSP 。观察SWB和SWC上的标签信息。
- 可以看出,虽然SWA(下游交换机)没有分配标签给SWB,但SWB采用Independent控制方式,仍然发送标签映射消息给SWC(上游交换机)。
- DU+Ordered(下游自主+有序模式)
- 将SWB上的标签控制方式改为Ordered。SWB是否会给1.1.1.1/32分发标签呢?
- 配置解释:
[SWB-mpls-ldp]label-distribution ordered
配置标签控制方式为Ordered。
- 使用display mpls lsp查看SWB的LSP,可以看到SWB上配置了使用Ordered的标签控制方式后,由于SWB没有收到下游交换机SWA给1.1.1.1/32分发的标签(在SWA上使用lsp-trigger none命令禁止了触发对本地路由分发标签),所以SWB就不会给上游交换机SWC发送1.1.1.1/32标签映射消息,即不建立LSP。
- 另外需要注意的是,对于AR2200系列路由器,无论是在真机设备还是模拟器上,都没有办法去进行修改。
2.4 LDP标签保持
- 简单解释:从多个邻居收到同一个前缀的标签,那么这个时候就需要使用一个,另外一个不使用的,保存方式是怎样的呢?有两种保存方式,一种是Conservative保守的,另外一种是Liberal自由的。
2.4.1 Conservative保守
- DU标签分发:当使用DU标签分发方式时,LSR可能从多个LDP Peer收到到同一网段的标签映射消息,如图中SWC会分别从SWB和SWE收到网段10.1.0.0/24的标签映射消息。如果采用Conservative保持方式,则SWC只保留下一跳SWB发来的标签(**这里的下一跳指的是从SWC去往10.1.0.0/24的下一跳**),丢弃非下一跳SWE发来的标签。
- 优点:维护的标签项少
- 缺点:当下一跳发生改变时,需要重新进行收敛
- DoD标签分发:当使用DoD标签分发方式时,如果采用Conservative保持方式, LSR根据路由信息只向它的下一跳请求标签。
- Conservative方式的优点在于只需保留和维护用于转发数据的标签,当标签空间有限时,这种方式非常实用,如ATM交换机;缺点在于如果路由表中到达目的网段的下一跳发生了变化,必须从新的下一跳那里获得标签然后才能够转发数据。
2.4.2 Liberal自由
- 华为设备默认的标签保持方式。
- DU标签分发:DU标签分发方式下,如果采用Liberal保持方式,则SWC保留所有LDP Peer SWB和SWE发来的标签,无论该LDP Peer是否为到达目的网段的下一跳。
- DoD标签分发:DoD标签分发方式下,如果采用Liberal保持方式, LSR会向所有LDP Peer请求标签。但通常来说,DoD分发方式都会和Conservative保持方式搭配使用。
- Liberal方式的最大优点在于路由发生变化时能够快速建立新的LSP进行数据转发,因为Liberal方式保留了所有的标签。**缺点是需要分发和维护不必要的标签映射**。
2.4.3 标签保持配置实例
- Liberal保持方式
从中可以看出SWC到10.1.0.0/24的下一跳为SWB。另外,缺省的标签保持方式为Liberal。
从中可以看出SWC保留了SWB和SWE分发的标签。
从中可以看出SWC保留了SWB和SWE分发的标签。
- Conservative保持方式
配置SWC采用conservative标签保持方式。
从中可以看出SWC只保留了SWB分发的标签。
从中可以看出SWC只保留了SWB分发的标签。
2.4.4 VPR推荐组合
- VRP推荐组合为DU+Ordered+Liberal。该组合为VRP缺省设置。
- 标签分发:DU下游自主
- 标签控制:Ordered有序
- 标签保持:Liberal自由模式
- 回顾LDP标签分配原则
- 标签分发:DU下游自主,原则2
- 标签控制:Ordered有序,原则3b
- 标签保持:Liberal自由模式,原则4
2.5 PHP
- PHP(Penultimate Hop Popping)倒数第二跳弹出,可以使得标签在倒数第二跳LSR上弹出。
- 次末跳是针对LSP或FEC,而不是针对设备的。
- 使用倒数第二跳弹出时,倒数第二个LSR依然根据上游LSR标签决定向哪里转发报文,然后直接去掉标签,进行转发,那么当最后一跳LSR(即Egress LER)收到这个报文时,就是传统的IP报文了,这时直接进行传统的IP转发。
- 那么LSR如何知道自己是倒数第二跳呢?倒数第一跳的交换机将为其分配一个特殊的标签3。
2.5.1 配置PHP
LER可以配置3种不同的标签分发方式,以通知倒数第二跳LSR是否应该弹出标签。
[SWD-mpls]label advertise ?
explicit-null explicit-null
implicit-null implicit-null
non-null non-null
explicit-null:为显式空标签,显式空标签值为0。这个值只有出现在标签栈底时才有效,表示报文的标签在分配该标签的这个LSR(即Egress LER)上必须被弹出,然后对此报文进行IP转发;
- implicit-null:标签值3表示隐式空标签(implicit-null),这个值不会出现在标签栈中。当一个LSR (倒数第二跳LSR)发现自己被分配了隐式空标签时,它并不用这个值替代栈顶原来的标签,而是直接执行Pop操作。
- non-null:表示不使用PHP特性,Egress节点向倒数第二跳正常分配标签。
- 缺省情况下,Egress节点向倒数第二跳节点分配隐式空标签implicit-null。
2.5.2 配置explicit-null
- 可以看出,SWD给SWC分配了显式空标签0,SWD收到入标签为0的报文后,由于标签0只在栈底出现,所以弹出该标签,然后进行IP转发。
- 在MPLS域部署了QoS的情况下,需要在整个MPLS域都进行基于标签的MPLS报文的转发。
- 正常情况下,SWD收到了标签为0的报文后,先查找LFIB表,再查找FIB表,但是华为设备对此做了优化,只要收到了标签为0的报文后,直接把标签去掉,去做IP的查询(直接查询FIB),而不需要做两表的查询
- 如果是其他普通标签还要判断是否是在栈底,如果不是还要取内层标签通过Mpls转发。(如果是普通的非PHP标签,是需要判断是否为栈底标签的,因为需要考虑Label多层嵌套的情况,也就是说,Label为0时就肯定不是嵌套,所以也不需要判断该标签是否为栈底标签)
2.5.3 配置non-null
- 表示不使用PHP特性,Egress节点向倒数第二跳正常分配标签。
- 可以看出,SWD给SWC分配了标签1031。
2.5.4 特殊标签固定值
三 LDP拓展特性
3.1 LDP Timer
3.2 LDP安全特性
3.2.1 MD5认证配置
3.2.2 Keychain认证查询
3.2.3 GTSM配置
3.3 LDP策略
- inbound和outbound在功能实现上是一样的,但是在细节上有所区别:
- 对于inbound配置的策略,例如只允许接收特定FEC的标签,其实际上还是会接收peer发送来的所有标签,通过dis mpls ldp lsp仍然可以查看,但是设备会通过该配置把不满足策略的过滤掉,最后在dis mpls lsp中看到的只有允许的FEC的标签;
- 对于outbound配置的策略,例如只允许发送特定FEC的标签,那么在peer上,无论是在lsp数据库还是转发表上,都会看到只有该允许的FEC的标签。
3.4 LDP IGP同步
3.4.1 LDP IGP同步介绍
以上面的拓扑图来进行说明。
- R1发送给R5的流量,默认情况直走的就是R2~R6的LSP路径,因为采用的是Liberal的标签保持方式,当R2~R6链路出现问题时,LSP路径可以很快切换到R2~R3上。
- 当R2~R6链路恢复时,会有两种情况:
- LDP收敛比IGP快
- 这种情况的话,当IGP收敛完成时,LSP路径也就可以切换了,LSP流量并没有丢失。
- IGP收敛比LDP快
- 这种情况下,当IGP收敛完成时,由于上面的路径更优,所以R2就不会使用从R3上得到的标签了,那么这时R1到R5的流量,R2~R6路径走的是IP数据报文,R6~R5走的是MPLS标签报文;
- 如果有上层应用,比如MPLS VPN,那么这时就会有问题了。
- 拓扑中的情况
- 在上面的拓扑中,LDP收敛肯定比IGP快的,当链路恢复时,互相发送LDP Hello Message,当收到时,R6就会向Transport Address发起TCP连接,因为R2-R3-R4-R5的链路是正常的,所以LDP很快就会收敛完成;
- 如果为了模拟效果,可以在R3上配置ACL,过滤R2与R6建立TCP连接时的流量;
- 这样之后,当主链路恢复时,会发现刚开始一段时间,R2~R6路径上的数据包为IP数据包,一段时间LDP会话建立后,又恢复为MPLS标签报文,可以查看保存的抓包。
- LDP收敛比IGP快
- 为了避免上面出现的情况,就可以使用LDP IGP同步了,主要是有两个时间:
- HoldDown Timer:等待10s后(为了给LDP建立会话一段时间),才开始建立OSPF邻居,10s过后,不管有没有建立 LDP会话,都会开始建立OSPF邻居;
- HoldMaxCost Timer:OSPF邻居建立后,如果LDP会话还没有建立,R6发送给R2关于R5的cost值是最大的,即65535(如果要模拟这个场景,可以把R2的g0/0/1接口关掉),10s后就会恢复为原来的cost值,当然,也可以配置成永远不恢复,也就是,只要LDP会话没有建立,cost值就一直保持为最大。
- 要模拟上面的情况,可以在R2上配置ACL,过滤掉R2与R6建立LDP会话的TCP连接流量。
3.4.2 配置命令
- 配置和介绍其实也可以参考HedEx文档
3.5 LDP与BGP交互
- 实现的原理如下
- 拓扑说明
- 上面三个区域分别是不同的BGP区域;
- R1、R2、R5、R7会有100.100.100.100和50.50.50.50的BGP路由;
- R7访问100.100.100.100时,先把数据发给R5;
- R5递归查询,发现去往100.100.100.100的下一跳是10.1.2.2(因为R2和R5通过l0口建立BGP邻居关系);
- 因为R2—>R5和R5—>R2建立了LSP隧道(10.1.2.2和10.1.5.5),所以R5到R2的数据转发是基于MPLS标签转发的;
- 这样的话,当数据到达R2时,R2看到的是去往100.100.100.100的纯IP报文,就可以发给R1了;
- 数据返回的过程也是这样的。
- 需要注意的是,上面的过程在华为设备上并没有办法实现,但是理论上是可行的。
3.6 LDP GR
LDP GR
LDP GR(Graceful Restart)利用MPLS转发平面与控制平面分离的特点,实现设备在协议重启或主备倒换时转发不中断。
产生原因
在MPLS网络中,设备协议重启或主备倒换时,设备会删除转发平面上的标签转发表项,导致数据转发中断。
通过LDP GR可以解决此问题,提高了网络的可靠性。LDP GR在设备协议重启或主备倒换时,利用控制平面和转发平面分离的特点,保留标签转发表项,设备依然根据该表项转发报文,从而保证数据传输不会中断。同时,协议重启或主备倒换后,设备在邻居的协助下恢复到重启之前的状态。
相关概念
LDP GR是基于NSF(None Stop Forwarding)理念设计的一种高可靠性技术。GR过程中有GR Restarter和GR Helper两种角色的设备:
- GR Restarter:具备GR能力,且要进行GR的设备。
- GR Helper:GR Restarter的邻居,具备GR能力,辅助GR设备完成GR功能的设备。
说明:
仅AR3260设备支持作为GR Restarter和GR Helper,其他设备只支持作为GR Helper。
LDP GR过程中引入了三个定时器:
- 转发状态保持定时器(Forwarding State Holding Timer):标识了LDP GR过程持续的时间。
- 重连接定时器(Reconnect Timer):GR Restarter发生协议重启或主备倒换后,GR Helper检测到和GR Restarter的LDP会话失败,将启动重连接定时器,等待LDP会话的重新建立。
- 恢复定时器(Recovery Timer):LDP会话重新建立后,GR Helper启动恢复定时器,等待LSP的恢复。
实现过程
LDP GR具体实现过程如图1所示:
图1 LDP GR实现过程
- GR Restarter和GR Helper之间建立LDP会话。LDP会话建立过程中,协商GR能力。
- GR Restarter协议重启或主备倒换时,启动MPLS转发状态定时器,保留标签转发表项,然后对GR Helper发送LDP初始化消息。GR Helper发现与GR Restarter之间的LDP会话失败后,将保留GR Restarter相关的标签转发表项,并启动重连接定时器。
- GR Restarter协议重启或主备倒换后,重新建立与GR Helper的LDP会话。如果在重连定时器超时前,没有建立LDP会话,则GR Helper删除GR Restarter相关的标签转发表项。
- GR Restarter和GR Helper之间重新建立LDP会话后,GR Helper启动恢复定时器。在恢复定时器超时前,GR Restarter和GR Helper在新建立的LDP会话上交互标签映射。GR Helper协助GR Restarter恢复转发表项,同时GR Restarter也会协助GR Helper恢复转发表项。定时器超时后,GR Helper会删除所有未恢复的与GR Restarter相关的MPLS转发表项。
- MPLS转发状态保持定时器超时后,GR Restarter删除标签转发表项,结束GR。