LLDP(Link Layer Discovery Protocol)链路层发现协议,协议设计的主要目的是进行信息的通告,进而获得关于网络拓扑以及相关管理配置信息。这是一个二层协议,它提供了一种标准方式来发现链路连接关系的能力,使得接入网络的一台设备可以将其主要的能力,管理地址,设备标识,接口标识等信息组织成不同的TLV(Type/Length/Value),并封装在LLDPDU(Link Layer Discovery Protocol Data Unit,链路层发现协议数据单元)中,发送给接入同一个局域网络的其它设备。
我们通常用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 数据报文中。
以上内容转自cloudman《如何通过LLDP获取网络拓扑?》
目前有两种方法来获取LLDP信息。
一种是lldpad,另一种是lldpd。
首先查看一下网卡信息。
[root@localhost ~]# lspci | grep Eth
1a:00.0 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
1a:00.1 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GbE SFP+ (rev 09)
1a:00.2 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)
1a:00.3 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)
当网卡是X722或者711类型时,需要一个共同配置,关闭网卡自身的lldp
echo 'lldp stop' > /sys/kernel/debug/i40e/0000\:1a\:00.2/command
然后分别介绍一下两种方法
首先安装
yum install lldpad
然后启动服务
lldpad -d
最后进行一下配置再显示
lldptool set-lldp -i eno3 adminStatus=rxtx
lldptool -T -i eno3 -V sysName enableTx=yes
lldptool -T -i eno3 -V portDesc enableTx=yes
lldptool -T -i eno3 -V sysDesc enableTx=yes
lldptool -T -i eno3 -V mngAddr enableTx=yes
最后进行查看
[root@localhost ~]# lldptool -t -n -i eno3
Chassis ID TLV
MAC: 5c:a7:21:b0:46:58
Port ID TLV
Ifname: GigabitEthernet1/0/11
Time to Live TLV
121
Port Description TLV
GigabitEthernet1/0/11 Interface
System Name TLV
H3C
System Description TLV
H3C Comware Platform Software, Software Version 7.1.070, Release 6318P01
H3C S5130S-28TP-EI
Copyright (c) 2004-2020 New H3C Technologies Co., Ltd. All rights reserved.
System Capabilities TLV
System capabilities: Bridge, Router
Enabled capabilities: Bridge, Router
Management Address TLV
IPv4: 192.168.32.5
Ifindex: 635
Port VLAN ID TLV
PVID: 1
Link Aggregation TLV
Aggregation capable
Currently not aggregated
Aggregated Port ID: 0
MAC/PHY Configuration Status TLV
Auto-negotiation supported and enabled
PMD auto-negotiation capabilities: 0x6c01
MAU type: 1000 BaseTFD
Power via MDI TLV
Bad Power Via MDI TLV: 0101011000000000
Maximum Frame Size TLV
10240
End of LLDPDU TLV
可以看到本机插在了交换机的“GigabitEthernet1/0/11 Interface”口上。包含的TLV还真多,真是小孩光屁股-----有啥让你知道啥。
安装软件
yum install lldpd -y
启动服务
systemctl start lldpd.service
调用命令
[root@localhost ~]# lldpcli show neighbors
-------------------------------------------------------------------------------
LLDP neighbors:
-------------------------------------------------------------------------------
Interface: eno3, via: LLDP, RID: 1, Time: 0 day, 00:00:51
Chassis:
ChassisID: mac 5c:a7:21:b0:46:58
SysName: H3C
SysDescr: H3C Comware Platform Software, Software Version 7.1.070, Release 6318P01
H3C S5130S-28TP-EI
Copyright (c) 2004-2020 New H3C Technologies Co., Ltd. All rights reserved.
MgmtIP: 192.168.32.5
Capability: Bridge, on
Capability: Router, on
Port:
PortID: ifname GigabitEthernet1/0/11
PortDescr: GigabitEthernet1/0/11 Interface
TTL: 121
-------------------------------------------------------------------------------
还可以用socket模拟方式,接收lldp协议,主要函数为
int sock = socket(PF_PACKET, SOCK_RAW, htons(0x88CC));
接收的以太网帧类型为0x88cc。
如果是真的话,那真是挺险恶的