1. 简介
  LDP,标签分发协议,顾名思义,完成标签的分发功能。下面以协议的流程为线索来分析该协议

2. Neighbor Discovery,邻居的发现与维护
  要想建立LDP Session,首先要发现邻居。
  和其他协议大同小异,邻居的发现是通过Hello协议来实现的。
  LDP的hello报文是以组播的方式发送的,目的地址为224.0.0.2(所有路由器)。Hello报文是封装在UDP协议上的,源端口和目的端口都是646。
  有邻居发现,自然就有邻居维护,这是协议实现的一种思路。丢失 3个Hello报文,宣告邻居失效。这个Timer就是Holddown Timer。Holddown Timer值是携带在Hello报文的一个TLV中的,称为Common Hello Parameters TLV。和其他协议略有不同,这个Holddown Timer是Peer之间进行协商的,以值小的为准。
  C3600-R3#show mpls ldp discovery detail                                        
      Local LDP Identifier:                                                          
       3.3.3.3:0                                                                  
       Discovery Sources:
       Interfaces:                                                                
         Ethernet0/0 (ldp): xmit/recv                                          
             Enabled: Interface config                                          
             Hello interval: 5000 ms; Transport IP addr: 3.3.3.3  
             LDP Id: 1.1.1.1:0                                                  
               Src IP addr: 172.16.13.1; Transport IP addr: 1.1.1.1            
               Hold time: 15 sec; Proposed local/peer: 15/90 sec   -> 协商结果15sec,本地配置15sec,远端配置90sec    
               Reachable via 1.1.1.1/32    
     这里提到了TLV的概念,就先说明一下LDP的报文。LDP的报文内容都是TLV结构的,不同的报文类型,携带相应的TLV,后面还会有详细介绍。
     通常情况下,Hello报文中还携带了另外一种TLV,Transport Address TLV。这个TLV携带了建立LDP Session时使用的IP地址。由于LDP Session是基于TCP连接的,所有,要明确建立TCP连接的地址。如果Hello报文中没有携带这个TLV,就使用Hello报文的源IP作为 Transport Address来建立TCP连接。Transport IP即为LDP ID。注:要求transport address (LDP ID)可达,这样才能建立LDP邻居
     LDP邻居的发现分为两种:Basic discovery,通过link hello来发现;Extended discovery,通过target hello来发现。前面介绍就是Basic discovery了。所谓的Extended discovery,就是配置单播peer,发送单播hello(所谓的target hello)来发现邻居了。由于LDP Session是基于单播TCP连接的,所以,LDP可以跨越网络建立Session,并不一定要求直连。这一功能在L2×××中广泛应用。为哪种 discovery方式,由Hello Parameter TLV中的一个标志位(T)来确定。
  
  3. TCP连接的建立
    LDP Session是建立在TCP连接的基础上,端口号646。发现LDP邻居后,就开始建立TCP连接。连接是由Transport Address大的一方发起的,称为Active,另一方称为Passive。
  
  4. LDP Session的建立
   TCP连接建立成功后,开始建立LDP Session。
   首先,Session初始化。双方发送Init报文,协商LDP一些参数。这些参数是携带在Common Session Parameter TLV中的(对于ATM,Frame Relay有特定的TLV),包括:
    Protocol version:目前为1
    KeepAlive Time:维护LDP session;同hello holddown time一样,协商为两者最小值;
    A:Label Advertisement Discipline, DU/DOD
    D:Loop detection
    PVLim:Path Vector Limit
    ...
   协商成功后,发送KeepAlive,经历OPEN SENT,OPEN RECV,很快进入Operational状态。
   之后,周期性发送KeepAlive维护LDP Session。
  
  5. 标签分发
   经历前面几个阶段,进入了LDP协议的核心功能。
   Address/Address Withdrow,LDP Session建立后,LSR使用Address通告本地直连接口的地址。取消时,则使用Address Withdrow消息。通过Address List TLV来完成。
   在DoD环境中,Ru向Rd发送Label Request消息来请求标签绑定,Rd使用Label Mapping消息回应Ru。绑定关系是通过FEC和Label TLV来实现的。FEC TLV有3种子类型:1-> wildcard FEC,只有类型,无值,用于标签释放,释放所有标签;2->prefix FEC;3->host FEC。问题:3应该是2的一种特殊形式,为什么需要添加一种新的FEC??莫非在PPP接入时使用??
   在DU环境种,Rd直接发送Label Mapping消息完成标签分发。
   Label Withdrow:路由变化后,不再有某个FEC了,Rd向Ru发送该消息,收回Label
   Label Release:保守模式下,收到非下一跳发来的Mapping消息,或收到了Rd发来的Withdrow消息,需要发送Release消息,释放标签。
   Hop Count TLV:用于Loop detect,只记录跳数
   Path Vector TLV:用户Loop detect,记录经过的LSR ID,也有跳数限制
   Label Request Message ID TLV:回复Request消息的Mapping消息中,需要携带该TLV,表明回复的是哪个Request消息。
  
  6. LDP消息简介
   0x0001 Notification            错误通告
   0x0100 Hello                   邻居的发现与维护
   0x0200 Init                    Session参数的协商
   0x0201  KeepAlive               Session的维护
   0x0300  Address                 地址绑定
   0x0301  Address withdrow        地址去绑定
   0x0400  Label Mapping           标签映射
   0x0401  Label Request           标签请求
   0x0404  Label Abort Request     收回标签请求
   0x0402  Label Withdrow          标签撤销
   0x0403  Label Release           标签释放
  
  7. 主要诊断命令
   show mpls ldp discovery detail             hello协议中的详细信息
   show mpls ldp neighbor detail              邻居的详细信息,包括hello/init消息中的详细信息
   show mpls ldp parameters                   本地运行的LDP协议的基本参数
   show mpls ldp binding                      LIB的信息
   show mpls ip binding                       LIB的信息
   show mpls forwarding-table                 LFIB的信息