您的位置:

深入探究LLDP协议

一、什么是LLDP协议

LLDP(Link Layer Discovery Protocol)是一种基于链路层的协议,使设备能够发现直接相连的设备及其能力,包括设备名称、端口类型、VLAN等信息。LLDP用于网络拓扑发现、跟踪、识别和管理,对于现代计算机网络至关重要。它在多个供应商的设备之间交换信息,没有使用网络地址,不依赖于任何网络协议,因此是一种独立于厂商的协议。

二、LLDP的工作原理

LLDP协议允许设备通过一个局部区域网络(LAN)链路交换有关设备的信息。这种链路可能是一个直接连接的缆绳或是取决于任何份别的中间设备。LLDP通过发送和接收以LLDPDU(LLDP数据单元)为基础的消息来工作。每个LLDPDU包括类型、长度、操作和数据格式。LLDPDU本身不提供连接管理功能,而是提供一种机制来探测和了解连接中的设备。

当交换机上的一个端口启用LLDP后,该设备就会发送一些LLDPDU到与其连接的邻居设备。当收到这些信息后,邻居设备会决定使用哪个端口接受并发送LLDP信息。可以通过使用不同的TLV(Type,length,value)编码类型及具体的编码方式,在LLDP的基础上协定不同的信息,使用最多的是LLDP-MED(LLDP媒体端口参数协议)和LLDP-DCBX(LLDP数据中心桥接扩展)进行不同类型的信息交换和自动化管理。

三、LLDP的优点

相较于其他协议,LLDP的优点表现在以下几个方面:

1. 独立于厂商:LLDP协议是界限模糊的协议,对于设备类型、操作系统、供应商以及网络设备厂商的限定很少。这为网络管理员选择设备提供了更大的灵活性和选择性。

2. 自动化管理:LLDP使网络管理员能够自动跟踪和管理它们的网络。与其他协议相比较,LLDP可和网络配置管理(NCM)等自动化管理方法进行集成,大大降低了网络管理员的工作负荷。

3. 拓扑发现:LLDP协议能够识别拓扑结构,以及在什么情况下哪些设备与哪些接口连接。这使得对网络进行诊断和排除问题变得更加容易。

4. 灵活性:LLDP协议的淡昧使网络管理员能够在不需要考虑太多限制的情况下自由选择设备和网路配置。这就意味着,LLDP协议的使用和固定形式是不想关的。管理员可以使用它被视为网络拓扑信息的任何信息。

四、使用LLDP协议的代码实现示例

// LLDP source MAC address
private String sourceMacAddress = "01:80:C2:00:00:0E";
// LLDP packet type
private String packetType = "88-cc";
// Time-to-live in seconds for LLDP packet
private int ttl = 120;
// Value for chassis id LLDP field  
private String chassisId = "mac-address";
// Value for port id LLDP field  
private String portId = "ifname";
// TTL, ChassisID, PortID separators  
private static final byte SUBTYPE_LENGTH = 1;
private static final byte END_LENGTH = 0;

private LLDPPacket createLLDPFrame(EtherAddress src_mac, EtherAddress dst_mac, String port_name, String switch_name)
{
    // Prepare chassis ID TLV
    byte[] chassis = ByteUtils.concatAll(new byte[] {0x02, 0x07, 0x04}, 
                        ByteUtils.hexStringToByteArray(src_mac.toString()));
    byte[] chassisType = new byte[] {(byte) 
                        (0x0D /*MAC Address*/ | (SUBTYPE_LENGTH << 5))};
    byte[] chassisTLV = ByteUtils.concatAll(chassisType, chassis);
 
    // Prepare port ID TLV
    byte[] portIDValue = port_name.getBytes(UTF8);
    byte[] portType = new byte[] {(byte) 
                        (0x05 /*Interface Name*/ | (SUBTYPE_LENGTH << 5))};
    byte[] portTLV = ByteUtils.concatAll(portType, portIDValue);
 
    // Prepare TTL TLV
    byte[] ttlTotal = new byte[]
                               {(byte) ((ttl >> 8) & 0xff), (byte) (ttl & 0xff)};
    byte[] ttlType = new byte[] {(byte) (0x06 | (END_LENGTH << 5))};
    byte[] ttlTLV = ByteUtils.concatAll(ttlType, ttlTotal);
 
    // Prepare all TLV content
    byte[] allTLV = ByteUtils.concatAll(chassisTLV, portTLV, ttlTLV);
 
    // Prepare LLDP packet data
    byte[] packetData = ByteUtils.concatAll(
      ByteUtils.hexStringToByteArray(packetType),
      allTLV);
 
    // Create ethernet header
    Ethernet ethPacket = 
          (Ethernet) Ethernet.makePacket(src_mac, dst_mac, EthType.LLDP);
    // Wrap LLDP packet into an ethernet packet
    ethPacket.setPayload(packetData);
 
    return (LLDPPacket)Packet.fromBytes(ethPacket.serialize());
}

五、总结

本文详细介绍了LLDP协议的工作原理以及它在现代计算机网络中的作用,同时列举了LLDP协议的优点。通过代码实现示例,我们可以看到,使用LLDP的过程中需要先准备TLV(Type,length,value)格式的数据,然后再将这些数据填入LLDP数据包中。LLDP为网络拓扑发现、跟踪、识别和管理提供了一种灵活、自动化的管理方法,而且具有良好的可扩展性和独立性,使网络管理员可以更方便地管理网络。