LLDP协议详解:如何获取网络拓扑信息
LLDP协议详解:如何获取网络拓扑信息
LLDP(链路层发现协议)是一种用于网络设备间信息通告的协议,主要用于获取网络拓扑和相关管理配置信息。它是一个二层协议,通过将设备的主要能力、管理地址、设备标识、接口标识等信息组织成不同的TLV(Type/Length/Value),并封装在LLDPDU(链路层发现协议数据单元)中,发送给接入同一个局域网络的其他设备。
LLDP协议的工作模式
LLDP协议有四种工作模式:
- TxRx:既发送也接收LLDP帧
- Tx:只发送不接收LLDP帧
- Rx:只接收不发送LLDP帧
- Disable:既不发送也不接收
LLDP的工作原理
LLDP协议本质上是一个信息发现和通告协议。设备中的LLDP实体维护了两个MIB(Management Information Base)库:
- Local System MIB:维护本地设备的相关信息
- Remote System MIB:维护远端设备的相关信息
LLDP通过与相关的MIB库交互来初始化并维护本地MIB,并将本地的相关信息通告出去,同时接收其他设备的通告信息,并将其更新到remote system MIB。通过这种方式,就可以获取设备的邻居信息。用户就可以使用这两个MIB库来完成自己的需求。
LLDP报文格式
封装有LLDPDU(lldp协议的协议数据单元)的报文,称之为LLDP帧。其封装格式有两种:Ethernet II 和 SNAP(Subnetwork Access Protocol,子网访问协议)。我们经常使用的就是以太帧,所以这儿就重点说一下基于Ethernet II 的LLDP报文。
- Destination MAC address:目的MAC地址,为固定的组播MAC地址0x0180-C200-000E。
- Source MAC address:源MAC地址,为端口MAC地址或设备桥MAC地址(如果有端口地址则使用端口MAC地址,否则使用设备桥MAC地址)
- Type:报文类型,固定为0x88CC。
- Data:数据,为LLDPDU
- FCS:帧检验序列
其中LLDPDU就是封装在LLDP报文数据部分的数据单元。只不过在组成LLDPDU之前,设备会先将本地的相关信息封装成TLV,然后再将多个TLV组合成一个LLDPDU,封装在LLDP报文的数据部分进行传送。
LLDPDU格式
每个LLDPDU最多可以携带28种TLV,LLDP报文预订,Chasis ID TLV, Port ID TLV, TTL TLV 和 End TLV 这四种是必须携带的,其余的TLV则是可选的。
下面是一个基本TLV的list:
TLV格式
TLV是组成LLDPDU的单元,其基本格式如下:
其中TLV Type 和 TLV Info String Length 称为TLV的header, 剩下的信息就是TLV的数据部分,根据TLV Length字段的值,就可以拿到具体的TLV数据。
其中 TLV Type的定义和分配如下表:
其中type 0-8为基本的TLV集合,其中Mandatory 则为必须的TLV,必须包含在lldp 数据报文中。
获取lldp邻居信息
通过lldptool
Linux提供了一个工具 lldptool 来查询和管理lldp信息。在安装了lldptool 相关工具的服务器上,我们可以获取到该服务器的物理拓扑信息:连接的交换机和交换机的相关端口信息。
通过原始套接字,抓取lldp数据帧
当然除了使用lldptool 工具来获取拓扑 信息,还可以自己通过抓取lldp 报文来分析相关的TLV信息,进而获取相连的邻居信息。
下面是一个通过原始套接字抓取的lldp 信息:
可以看到,列表中的每一项均为,key,value的 元组形式,其中key表示的就是TLV type,value就是该type的所表示的具体信息,当前是以二进制的形式,需要将二进制解码为字符串,就可以得到与lldptool 一样的拓扑信息。