Heim >Backend-Entwicklung >Golang >So implementieren Sie das LLDP-Protokoll in Golang
LLDP (Link Layer Discovery Protocol) ist ein Datenverbindungsschichtprotokoll, das es Geräten ermöglicht, Informationen über benachbarte Geräte im Netzwerk zu erkennen und zu erfahren. In großen Netzwerken wird LLDP verwendet, um die Netzwerktopologie und Verbindungsinformationen automatisch zu konfigurieren. Die Go-Sprache ist eine leistungsstarke, zuverlässige, gleichzeitige und einfach zu schreibende Programmiersprache, sodass das LLDP-Protokoll mit der Go-Sprache implementiert werden kann.
Bei der Implementierung von LLDP müssen Sie die Struktur und Standards von LLDP-Frames verstehen. Das Folgende ist die Struktur des LLDP-Frames:
LLDP-Struktur |
---|
LLDP-Header (7 Bytes) |
TLV-Typ (2 Bytes) TLV-Länge (2 Bytes) Wert (0-507 Bytes) |
... |
TLV-Typ (2 Bytes) TLV-Länge (2 Bytes) Wert (0-507 Bytes) |
FCS (4 Bytes) |
In einem LLDP-Frame Der Header besteht aus 7 Bytes: 2 Bytes LLDP-Header (0x01 0x80), 4 Bytes MAC-Adresse, die die MAC-Adresse des Absenders angibt, und 1 Byte TTL (Time To Live).
Im LLDP-Frame sind mehrere TLV-Elemente (Type-Length-Value) enthalten. Jeder TLV besteht aus drei Teilen: Typ (2 Bytes), Länge (2 Bytes) und Wert (0 bis 507 Bytes). Es können beliebig viele TLV-Elemente hinzugefügt werden, diese müssen jedoch mit einem Kapselungsendtag (TLV-Endpaket) enden.
Es ist zu beachten, dass bei Verwendung des LLDP-Protokolls kein Authentifizierungsmechanismus einer Entität aktiviert werden muss. Daher sind möglicherweise andere Methoden erforderlich, um sicherzustellen, dass die empfangenen Informationen von einem echten Gerät stammen.
Wenn Sie die Go-Sprache zum Implementieren von LLDP verwenden, können Sie für die Implementierung Bibliotheken von Drittanbietern verwenden, z. B. gopacket und lldp. Diese Bibliotheken stellen Methoden bereit, die die Erstellung und Analyse von LLDP-Frames vereinfachen und dabei helfen, eine LLDP-entsprechende Verarbeitung durchzuführen. Hier ist ein Beispiel für die Verwendung der Gopacket-Bibliothek:
package main import ( "bytes" "fmt" "net" "time" "github.com/google/gopacket" "github.com/google/gopacket/layers" ) func main() { // 构造LLDP帧 srcMac := net.HardwareAddr{0xa0, 0x36, 0x9f, 0x10, 0xca, 0x00} // 发送方的MAC地址 dstMac, _ := net.ParseMAC("01:80:C2:00:00:0E") // 目标MAC地址 eth := layers.Ethernet{ SrcMAC: srcMac, DstMAC: dstMac, EthernetType: layers.EthernetTypeLLDP, } ttll := layers.TTL{LayerType: layers.LayerTypeTTL, TTL: 120} // TTL 120 chassisID := layers.LLDPBasicTLV{ Type: layers.LLDPBasicTLVTypeChassisID, Length: 7, Value: []byte{0x04, 0x24, 0x16, 0x12, 0x34, 0x56}, } // 构造Chassis ID TLV portID := layers.LLDPBasicTLV{ Type: layers.LLDPBasicTLVTypePortID, Length: 4, Value: []byte{0x01, 0x23, 0x45, 0x67}, } // 构造Port ID TLV // 构造End TLV, 其中Value为空 endOfLLDPDU := layers.LLDPBasicTLV{ Type: layers.LLDPBasicTLVTypeEndOfLLDPDU, Length: 0, Value: []byte{}, } lldp := layers.LLDPPacket{ BaseLayer: layers.BaseLayer{}, ChassisID: chassisID, PortID: portID, TTL: ttll, } lldp.TLVs = append(lldp.TLVs, endOfLLDPDU) // 确定网络接口,并构造数据包 nic, _ := net.InterfaceByName("en0") // 获取本地网络接口, en0是Mac上的有线网络接口 buffer := gopacket.NewSerializeBuffer() options := gopacket.SerializeOptions{} gopacket.SerializeLayers(buffer, options, ð, &lldp, ) outgoingPacket := buffer.Bytes() // 打开网络设备, 并将LLDP包写入device中 handle, _ := net.ListenPacket("en0", "LLDP") // 打开套接字 defer handle.Close() handle.WriteTo(outgoingPacket, nil, &net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}) // 向目标MAC发送包 fmt.Println("LLDP packet sent at", time.Now().Format(time.Stamp)) }
Die Gopacket-Bibliothek wird hier zum Erstellen eines LLDP-Frames verwendet und verwendet den Ethernet-Typ als Quell- und Zieladresse von LLDP. Verwenden Sie dann die Struktur vom Typ LLDPPacket, um das Datenpaket zu erstellen. Chassis-ID- und Port-ID-TLVs sind grundlegende TLV-Typen und können mit Strukturen vom Typ LLDPBasicTLV erstellt werden. Fügen Sie nach dem Erstellen des TLV den End-TLV zum Paket hinzu. Serialisieren Sie das Paket abschließend mithilfe der Serialisierungsoptionen. Das Paket wird auf die Netzwerkschnittstelle geschrieben.
In praktischen Anwendungen können LLDP-Pakete über Ports überwacht und analysiert werden. Hier ist ein Beispiel mit der lldp-Bibliothek:
package main import ( "fmt" "log" "time" "github.com/atikur-rabbi/lldp" ) func main() { msgChan := make(chan lldp.Message) errorChan := make(chan error) // 监听网络接口 go lldp.Listen("en0", msgChan, errorChan) // 在error通道上显示所有错误, 并打印收到的LLDP消息 for { select { case e := <-errorChan: log.Println("error occured", e) case msg := <-msgChan: log.Printf("Received LLDP packet from %v: %v\n", msg.RemoteAddr, msg.Message) } } }
In diesem Beispiel starten wir eine asynchrone Goroutine, um die angegebene Netzwerkschnittstelle (hier en0) abzuhören. Wenn Sie eine LLDP-Nachricht empfangen, verwenden Sie den Fehlerkanal, um den Fehler auszudrucken, und drucken Sie die empfangene Nachricht über den Nachrichtenkanal aus.
Kurz gesagt ist LLDP ein sehr nützliches Protokoll zum Erkennen und Verstehen von Informationen über benachbarte Geräte in einem Netzwerk. Das LLDP-Protokoll kann einfach mit der Go-Sprache implementiert werden. Mit der Unterstützung von Bibliotheken von Drittanbietern können wir eine schnellere Frame-Erstellung und -Analyse erreichen und Aufgaben entsprechend LLDP besser bewältigen.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie das LLDP-Protokoll in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!