会话状态机
LDP Session 协商过程可以通过状态机来描述,LDP 使用 5 种状态描述 LDP 会话状态机:Non-Existent,Initialized,OpenRec,OpenSent,Operational;
LDP 状态切换信息可以通过指令 debug mpls ldp session 看到;
Non-Existent:该状态为 LDP Session 最初的状态,在此状态双方发送 HELLO 消息,选举主动方,在收到 TCP 建立成功事件的触发后变为 Initialized 状态;
Initialized:该状态下分为主动方和被动方两种情况:
1)主动方将主动发送 Initialization 消息,转向 OpenSent 状态,等待回应的 Initialization 消息;
2)被动方在此状态等待主动方发给自己的 Initialization 消息;
3)被动方如果收到的 Initialization 消息,并且参数可以接受,则发送 Initialization 和 KeepAlive 报文,并转向 OpenRec 状态;
4)主动方和被动方在此状态下收到任何非 Initialization 消息或等待超时时,都会转向 Non-Existent 状态;
OpenSent:此状态为主动方发送 Initialization 消息后的状态,在此状态等待被动方回答 Initialization 和 KeepAlive 消息,
如果收到的 Initialization 消息中的参数可以接受,则转向 OpenRec 状态;
如果参数不能接受或 Initialization 超时,则断开 TCP 连接转向 Non-Existent 状态;
OpenRec:在此状态,不管主动方还是被动方,都是发出 KeepAlive 后的状态,在等待对方回应 KeepAlive 消息;
只要收到 KeepAlive 消息就转向 Operational 状态;
如果收到其它消息或 KeepAlive 超时,则转向 Non-Existent 状态;
Operational:该状态是 LDP Session 成功建立的标志。在此状态下可以发送和接收所有其它的 LDP 消息;
在此状态如果 KeepAlive 超时或收到致命错误的 Notification(Shutdown 消息)或自己发送 Shutdown 消息主动结束会话,都会转向 Non-Existent 状态;
发现阶段与连接建立(Non-Existent ⇒ Initialized)
发现阶段
设备通过周期性地发送 LDP Link Hello(LDP 链路 Hello 报文),实现 LDP 基本发现机制;
如果 LSR 在特定接口接收到 LDP Link Hello,表明该接口存在 LDP 邻接体;
除了基本发现机制外,可以通过拓展发现机制,来发现非直连的远端邻接体(该内容不属于我们学习的范围,详细内容可以查阅 RFC5036 文档);
Q:当配置 LDP 协议后,设备就开始发送 LDP-Hello 报文来建立 LSP?
A:事实并非如此。缺省,根据 /32 的主机 IP-Route 触发 LDP 建立 LSP,所以只会看到 /32 路由被分配标签。华为设备,能够通过手工配置触发非 32 位路由的 LSP 建立,[mpls] lsp-trigger,all:所有静态路由和 IGP 路由项触发建立 LSP。配置该命令后,所有静态路由及 IGP-Route(BGP-Route 也可以触发 LDP LSP 的建立,但此内容不在这里讨论)会触发 LDP 建立 LSP,会导致 LSP 数量庞大,占用过多的标签资源,以及整网 LSP 收敛速度变慢。故一般情况下不推荐配置此命令;host:32 位地址的 IP 路由触发建立 LSP;ip-prefix ip-prefix-name:根据 IP 地址前缀列表触发建立 LSP;none:不触发建立 LSP;
TCP 连接建立阶段
两台 LSR 之间,在建立 LDP Session 之前,需要先建立 TCP 连接,以便进行 LDP 协议报文的交换:
1)建立 TCP 连接需要使用传输地址,而设备的传输地址包含在 LDP Hello 中,LSR 通过 Hello 报文知晓邻居的传输地址;
2)当通过 Hello 报文发现得知对方的传输地址后,邻居间便开始通过传输地址来建立 TCP 连接(必须拥有到达邻居的传输地址的路由);
3)传输地址较大的一方,将作为主动方,主动发起建立 TCP 连接。当经过 TCP 握手后,两者建立起 TCP 连接;
3)并且交互 LDP 的初始化报文、标签映射报文等,这些报文都使用双方的传输地址作为源、目的 IP 地址;
缺省情况,公网的 LDP 传输地址等于设备的 LSR-ID(所以 LDP 必须使用可达的地址作为 LSR-ID),私网的传输地址等于接口的 Primary IP 地址;
华为设备,在接口视图下,使用 mpls ldp transport-address 命令,可以修改传输地址;
会话建立与保持(OpenSent ⇒ OpenRec)
当 TCP 连接建立成功后:
R2,作为主动方(传输地址大的)发送 LDP Init 报文,协商建立 LDP 会话的相关参数;
LDP 会话的相关参数包括:LDP 协议版本、标签分发方式、KeepAlive 保持定时器的值、最大 PDU 长度、标签空间 等等;
R1,作为被动方,当收到 LDP-Init 报文后,若接受 R2 的相关参数,则回应 KeepAlive 作为确认,为了提高发送效率同时发送自己的 LDP-Init 报文;
R2 收到 R1 的 LDP-Init 报文后,若接受相关参数,则回复 KeepAlive 报文给 R1;
双方都收到对端的 KeepAlive 报文后,会话建立成功;
后续通过周期性发送的 KeepAlive 报文;