数据链路层学习之LLDP
2013年09月02日 20:38:36 goodluckwhh 阅读数 42323
一、LLDP协议概述
随着网络技术的发展,接入网络的设备的种类越来越多,配置越来越复杂,来自不同设备厂商的设备也往往会增加自己特有的功能,这就导致在一个网络中往往会有很多具有不同特性的、来自不同厂商的设备,为了方便对这样的网络进行管理,就需要使得不同厂商的设备能够在网络中相互发现并交互各自的系统及配置信息。
LLDP(Link Layer Discovery Protocol,链路层发现协议)就是用于这个目的的协议。LLDP定义在802.1ab中,它是一个二层协议,它提供了一种标准的链路层发现方式。LLDP协议使得接入网络的一台设备可以将其主要的能力,管理地址,设备标识,接口标识等信息发送给接入同一个局域网络的其它设备。当一个设备从网络中接收到其它设备的这些信息时,它就将这些信息以MIB的形式存储起来。
这些MIB信息可用于发现设备的物理拓扑结构以及管理配置信息。需要注意的是LLDP仅仅被设计用于进行信息通告,它被用于通告一个设备的信息并可以获得其它设备的信息,进而得到相关的MIB信息。它不是一个配置、控制协议,无法通过该协议对远端设备进行配置,它只是提供了关于网络拓扑以及管理配置的信息,这些信息可以被用于管理、配置的目的,如何用取决于信息的使用者。
二、LLDP结构
LLDP的框架结构如图所示:
此图也表明LLDP就是一个信息发现与通告协议,LLDP的实体主要维护了两个MIB库,一个 local system MIB,一个remote system MIB。从其名字也可以看出,一个用于维护本地相关的设备MIB信息,一个用于维护远端设备MIB信息。
LLDP通过与上图中右侧的几个MIB库交互来初始化并维护 local system MIB,并将本地的相关信息通告出去;同时当接收到来自其它设备的信息时就将其更新到remote system MIB中。通过这种工作方式,一个设备就可以将自己的信息通告出去并获得网络中其它设备的相关信息,最终获得反应网络拓扑以及其它配置信息的两个MIB库。这两个库可以被其用户用来完成各种功能。
需要说明的是LLDP信息的通告以及接收处理不受端口的STP状态的影响。
三、LLDP基本概念
1.LLDP帧格式
封装有 LLDPDU 的报文称为 LLDP 帧,其封装格式有两种:Ethernet II 和 SNAP(Subnetwork Access Protocol,子网访问协议)。
1.1 Ethernet II格式封装的LLDP帧
上图是以Ethernet II格式封装的LLDP帧,其中各字段的含义如下:
DA:目的 MAC地址,为固定的组播 MAC地址 0x0180-C200-000E。
SA:源 MAC地址,为端口 MAC地址或设备MAC地址(如有端口地址则用端口MAC地址,否则用设备MAC地址)。
Type:帧类型,为 0x88CC。
Data:数据,为 LLDPDU。
FCS:帧检验序列。
1.2 SNAP格式封装的LLDP帧
上图是以SNAP格式封装的LLDP帧,其中各字段的含义如下:
DA:目的MAC地址,为固定的组播 MAC地址 01-80-C2-00-00-0E。
SA:源MAC地址,为端口MAC地址或设备MAC地址(如果有端口地址则用端口MAC地址,否则用设备MAC地址)。
Type:帧类型,为 0xAAAA-0300-0000-88CC。
Data:数据,为 LLDPDU。
FCS:帧检验序列。
1.3 目地地址
目地地址实际上包括三个,分别为01-80-C2-00-00-0E,01-80-C2-00-00-03,01-80-C2-00-00-00。这三个地址分别用于不同的目地,它们可以跨越不同的网络。
01-80-C2-00-00-0E,也被称为Nearest Bridge组地址:无论是Two-Port MAC Relay (TPMR)组件还是S-VLAN组件还是C-VLAN组件,还是802.1D网桥都不能转发目地为该地址的帧。简单的说任何类型的网桥都不能转发目地为该地址的帧,目地为该地址的帧被限制在连接两个网桥接口的连接上传输。
01-80-C2-00-00-03,也被称为Nearest non-TPMR Bridge组地址:对于目地地址为该地址的帧,Two-Port MAC Relay (TPMR)组件将成为一个中继器,即不接收它。而S-VLAN组件,C-VLAN组件,以及802.1D网桥不能转发它,而是需要进行接收并处理。因此目地地址为该地址的帧将跨越TPMR。
01-80-C2-00-00-00,也被称为Nearest non-Customer Bridge组地址:对于目地地址为该地址的帧,Two-Port MAC Relay (TPMR)组件以及S-VLAN组件将成为中继器,即不接收它。而C-VLAN组件,以及802.1D网桥不能转发它,而是需要进行接收并处理。因此目地地址为该地址的帧将跨越TPMR以及S-VLAN。
TPMR以及S-VLAN,C-VLAN都是802.1Q中的概念,包括这三者的网络以及各个地址的作用范围如下图所示:
2. LLDPDU
LLDPPDU是LLDP的有效负载,用于承载要发送的消息。LLPDU的格式如下图所示:
LLDPDU采用了TLV的格式,即type+lenght+value的格式,type表示TLV的类型,length是以字节为单位的TLV的长度,value是该TLV的值。其中Chassis ID TLV,Port ID TLV Time To Live TLV以及End Of LLDPDU TLV是强制的,必须包含的部分,除此之外在TLV Time To Live TLV和End Of LLDPDU TLV之间可以包含0个到多个可选的其它TLV。
3. TLV
TLV是组成 LLDPDU的单元,每个 TLV都代表一个信息。LLDPDU的TLV可以分为两大类:
被认为是网络管理的基础的TLV集合,所有的LLDP实现都需要支持。
组织定义的TLV扩展集和,包括 802.1组织定义 TLV、802.3组织定义TLV以及其他组织定义的TLV。这些TLV用于增强对网络设备的管理,可根据实际需要选择是否在 LLDPDU中发送。
TLV的基本格式如图所示:
TLV的类型域的定义及分配如下图所示:
其中type0-8属于基本的TLV集合。对于其中的Mandatory的TLV,它是必须包含在LLDP中的。
组织定义TLV集合的格式如下图所示:
其中:
OUI:组织机构的ID。
organizationally defined subtype:组织自定义的类型。
organizationally defined information string:传输的信息。
4. 基础TLV集合的TLV定义
几个强制的必须包含的TLV的定义如下。非强制的可以参考IEEE802.1AB。
4.1 End Of LLDPDU TLV
该TLV用于标识LLDPDU的结束。其格式如下:
由于length=0,因此它不包含value域。
4.2 Chassis ID TLV
该TLV用于通告该LLDPDU发送者的chassis ID。由于有很多方式可用来标识一个chassis,因此在该类TLV中包含一个子类型域用于告诉接收者,发送者的chassis ID采用的是哪一种标识方式。其格式如图所示:
每个LLDPDU必须包含且仅包含一个该类型的TLV。由于chassis ID实际上是用于标识设备的,因此在连接可用时它应该保持不变。
chassis子类型所可能的取值如图所示:
4.3 Port ID TLV
它用于标识发送该LLDPDU的设备的端口。类似于chassis ID,有很多方式可以标识一个Port,因此该TLV也包含一个子类型域。其格式如下图所示:
每个LLDPDU必须包含一个且只能包含一个该类型的TLV。同时,当端口可用时,从该端口发送出去的LLDPDU的该TLV应该保持不变。
其子类型的可能取值如下图所示:
4.4 Time To Live TLV
该TLV用于告诉接收端,它接收到的这些信息的有效期有多长。其格式如图所示:
TTL的时间单位是秒,由于只有2个字节长,因而最大有效时间是65536秒。如果在这个时间到期了还没有新的LLDPDU被收到,则该TLV所属的那个LLDPDU携带的信息会被从MIB中删除。如果收到了新的LLDPDU,则:
如果TTL不为0,则会用新收到的LLDPDU的信息替换MIB库中的相应的信息(即与该LLDPDU的发送者相关的MIB信息,LLDP使用Chassis ID + Port ID来判断是否来自于同一个源,这也是要求这两者保持不变的原因)。
如果TTL为0,则删除相应的MIB库中的信息(即与该LLDPDU的发送者相关的MIB信息)。因此TTL为0的LLDPDU又被称为SHUTDOWN LLDPDU。
每一个LLDPDU必须包含且只能包含一个该类型的TLV。
四、工作机制
LLDP是一个用于信息通告和获取的协议,但是需要注意的一点是,LLDP发送的信息通告不需要确认,不能发送一个请求来请求获取某些信息,也就是说LLDP是一个单向的协议,只有主动通告一种工作方式,无需确认,不能查询、请求(比如像ARP协议那样请求某个IP的MAC地址)。
LLDP主要完成如下工作:
初始化并维护本地MIB 库中的信息。
从本地MIB 库中提取信息,并将信息封装到LLDP 帧中。LLDP帧的发送有两种触发方式,一是定时器到期触发,一是设备状态发生了变化触发。
识别并处理接收到的LLDPDU帧
维护远端设备LLDP MIB 信息库。
当本地或远端设备MIB信息库中有信息发生变化时,发出通告事件。
1.LLDPDU发送
1.1 发送机制
LLDPDU的发送可以被如下事件触发:
与本地MIB信息库相关联的定时器txTTR到期时,这将确保远端接收系统中的相关信息不会因为TTL到期而过期。
本地MIB信息库中的信息发生了改变时,会立即发送LLDPDU,这将保证改变能及时被更新。
如果一个“新邻居”被识别,将会启用快速发送机制,在很短的时间内连续发送指定数量(txFastInit,默认值为4)的LLDPDU,以确保“新邻居”能被快速更新。如果远端系统MIB信息库因为过载(tooManyNeighbors)而不能容纳新的邻居信息,则会为了避免过多的PDU传输而抑制快速发送行为。
LLDP的常规发送时间是建立在系统的tick之上的,间隔为1秒一个,为了防止在共享介质的LAN(shared media LAN)中同时出现大量的LLDPDU(因为接入同一个LAN的多个系统的时间是同步的,因而多个系统上的基于tick的1秒定时器可能同时到期),发送定时器引入了一个随机的抖动,这就使得常规的LLDP帧的发送间隔时间的平均值仍是1秒,但是具体到某一次到期时间可能并不是准确的1秒。
同时为了防止在有多个端口需要发送LLDPDU的系统中,所有的端口的定时器都在同一时间到期,因而标准建议将采用某种机制将多个发送实例的定时器到期时间给错开,以避免一个系统在同一时刻发送大量的LLDPDU。
1.2 发送状态机
LLDPDU的发送状态机如图所示
对于该状态机:
为了防止过于频繁的重新初始化发送状态机,在LLDP的发送状态机中引入了一个延时,该延时限制了在关闭发送状态机后,必须至少等待多长时间才能重新初始化发送状态机。
是否发送SHUTDOWNLLDPDU由本地的LLDP工作状态决定。
是否发送正常的LLDPDU由txNow和txCredit决定。这两个变量都由发送定时器状态机更新。txNow决定是否发送,而txCredit则是一个信用量,决定了可以发送的量,如果是0则不允许发送,只有大于0的值才允许发送,每发送一个该值就减1。更重要的是在本地信息快速改变时,txCredit即允许连续发送多个LLDPDU,但是又对可以连续发送的LLDPDU帧数做了限制,这使得本地状态的快速改变可以及时被通告出去,但是又不能无限发送导致网络出现大量LLDPDU帧。
1.3发送定时器状态机
LLDP发送定时器状态机如图所示:
localChange表示本地信息是否//代码效果参考:http://hnjlyzjd.com/hw/wz_24956.html
发生改变;txTTR表示下一次定时器到期的时间;newNeighbor表示是否发现了新的邻居,并由接收状态设置,由该状态机清除;txTick表示基于系统时间的1秒定时器是否到期。对于该状态机:
SIGNAL_TX用于触发发送,它会将txNow设置为允许发送,并设置本地信息发生改变为FALSE,如果当前不是在快速发送状态(txFast = 0)就设置发送定时器下次到期时间为msgTxInterval(msgTxInterval默认为30秒,取值范围1-3600秒),否则设置发送定时器下次到期时间为msgFastTx(msgFastTx默认值为1秒,取值范围1-3600秒)
如果本地信息发生了改变,就立即进入SIGNAL_TX
如果定时器到期,则如果txFast大于0,则将其减1并进入SIGNAL_TX,否则直接进入SIGNAL_TX
如果发现了新邻居,则首先将发现新邻居的标识更新为没有发现新邻居,然后如果当前已经处于快速发送状态就直接进入发送定时器到期状态(以触发一次立即发送),否则设置txFast的值为txFastInit的值(txFastInit默认值为4,取值范围1-8)
如果基于系统时间的1秒定时器到期,则给txCredit增加信用量,其最大值为txCreditMax,txCreditMax是一个取值在1到10之间的值,默认值为5。
这里有取值范围的几个变量都是可配置的变量。
从上述两个状态机的//代码效果参考:http://hnjlyzjd.com/xl/wz_24954.html
工作状态可以看出,发送定时器状态机用于维护信用量以及是否允许发送LLDPDU帧,而发送状态机根据这两个信息来决定是否发送。另外需要注意的是LLDP所使用的所有定时器操作都是基于“基于系统时间的1秒定时器的”,每当这个定时器到期时它除了会将txTick设置为TRUE外,还会处理其它的定时功能。
2.LLDPDU 接收
2.1 接收机制
LLDP帧的接收由3个阶段组成:帧的识别、帧的校验以及LLDP远端MIB信息库更新。
2.1.1 帧的识别
帧识别由在LLDP/LSAP(链路服务访问点)进行,检查的内容是帧的目的地是否是LLDP的组播MAC地址,帧的类型是否是LLDP。
2.1.2 帧的验证
该过程会首先根据TLV的格式定义依次校验Chassis ID TLV,Port ID TLV, Time To Live TLV,如果这三个TLV都存在且有效,才会进一步的解码可选的TLV直到遇到End Of LLDPDU TLV,然后根据获得的信息更新远端MIB信息库。
2.1.3 远端MIB信息库更新
在前两步都通过之后,LLDPDU的接收者就需要根据解析出来的信息更新远端MIB信息库。在MIB信息库中,LLDP使用chassis ID + Port ID来标识、存储来自不同源的信息。
如果远端MIB库中已经有对应于该chassis ID + Port ID的信息,则使用收到的帧中的新的TTL来更新TTL。并用对于收到的新的LLDPPDU中的每一种type,如果有变化就进行更新,如果某种type原来不存在,则需要将其添加到MIB库中。
如果实现不支持某种类型的type,则
如果type不是127,则按照基本TLV的格式将其存储到远端MIB库,存储格式为type, length,value。
如果type是127,则按照组织定义TLV的格式将其存储到远端MIB库,存储格式为type, length,value,OUI,组织自定义子类型,以及信息域。
更新时,如果需要添加新的chassis ID + Port ID的表项,或者为某个chassis ID + Port ID添加新的TLV,则可能遇到没有内存的问题,标准没有规定必须如何处理,只是给出了一些建议:
忽略新的LLDPDU的信息
删除最旧的信息以释放空间给新的信息
随机删除一些旧的信息以释放空间给新的信息
LLDPDU 携带的TTL(Time To Live)值会影响接收端的处理方式,如果它不为0,则更新相应信息的老化时间,如果接收到的LLDPDU 中的TTL 等于0,则将立刻老化掉相应的信息(即与该LLDPDU的发送者相关的MIB信息)。
如果一个chassis ID + Port ID标识的信息的TTL超时,则相应的MIB信息会被删除。
2.2 接收状态机
LLDPDU的接收状态机如图所示:
3. LLDP工作模式
LLDP可以工作在多种模式下:
TxRx:既发送也接收LLDP 帧。
Tx:只发送不接收LLDP 帧。
Rx:只接收不发送LLDP 帧。
Disable:既不发送也不接收LLDP 帧(准确的说,这并不是一个LLDP的状态,这可能是LLDP功能被关闭了,也可能是设备就不支持)。
由于LLDP可以单独工作在发送或接收模式下,因此LLDP协议的实现需要支持单独初始化发送或者接收功能。当工作模式发生变化时,需要根据老的/新的工作模式来关闭/打开发送或者接收的功能。