cloudman
主要专注于云计算方向,openstack研发
热爱技术和生活
导 言
在某些应用场景中,需要获取网络中的拓扑信息,比如服务器网口和交换机的连接关系。为了满足这个要求,可以利用lldp协议,来实现该要求。
1
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:
2
TLV 格式
TLV是组成LLDPDU的单元,其基本格式如下:
其中TLV Type 和 TLV Info String Length 称为TLV的header, 剩下的信息就是TLV的数据部分,根据TLV Length字段的值,就可以拿到具体的TLV数据。
其中 TLV Type的定义和分配如下表:
其中type 0-8为基本的TLV集合,其中Mandatory 则为必须的TLV,必须包含在lldp 数据报文中。
3
获取lldp邻居信息
上图中,我们可以看到,通过lldp ,抓取到该eth0网卡上联的交换机名称(System Name TLV),交换机端口(Port ID TLV)和 当前所述的VLAN信息(Port VLAN ID TLV)。
通过原始套接字,抓取lldp数据帧
当然除了使用lldptool 工具来获取拓扑 信息,还可以自己通过抓取lldp 报文来分析相关的TLV信息,进而获取相连的邻居信息。
可以看到,列表中的每一项均为,key,value的 元组形式,其中key表示的就是TLV type,value就是该type的所表示的具体信息,当前是以二进制的形式,需要将二进制解码为字符串,就可以得到与lldptool 一样的拓扑信息。
4
参考
1.https://learningnetwork.cisco.com/docs/DOC-26851
2.https://blog.csdn.net/goodluckwhh/article/details/10948065
3.http://www.023wg.com/message/message/cd_feature_lldp_message_format.html
猜你还想看这些内容
· END ·
记得文末点个好看鸭~
点就完事儿了!