Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk melaksanakan protokol LLDP dalam golang

Bagaimana untuk melaksanakan protokol LLDP dalam golang

PHPz
Lepaskan: 2023-04-18 09:24:41
asal
1028 orang telah melayarinya

LLDP (Protokol Penemuan Lapisan Pautan) ialah protokol lapisan pautan data yang membolehkan peranti menemui dan mempelajari maklumat tentang peranti jiran dalam rangkaian. Dalam rangkaian besar, LLDP digunakan untuk mengkonfigurasi topologi rangkaian dan maklumat sambungan secara automatik. Bahasa Go ialah bahasa pengaturcaraan berprestasi tinggi, boleh dipercayai, serentak dan mudah ditulis, jadi protokol LLDP boleh dilaksanakan menggunakan bahasa Go.

Apabila melaksanakan LLDP, anda perlu memahami struktur dan piawai bingkai LLDP. Berikut ialah struktur bingkai LLDP:

LLDP结构
LLDP头部(7个字节)
TLV Type(2个字节) TLV Length(2个字节) Value(0-507字节)
...
TLV Type(2个字节) TLV Length(2个字节) Value(0-507字节)
FCS(4个字节)

Dalam bingkai LLDP, pengepala terdiri daripada 7 bait: 2 bait pengepala LLDP (0x01 0x80), 4 bait Alamat MAC, menunjukkan Alamat MAC pengirim dan TTL 1-bait (Masa Untuk Hidup).

Dalam bingkai LLDP, berbilang elemen TLV (Type-Length-Value) disertakan. Setiap TLV terdiri daripada 3 bahagian: jenis (2 bait), panjang (2 bait) dan nilai (0 hingga 507 bait). Sebarang bilangan elemen TLV boleh ditambah, tetapi ia mesti berakhir dengan tag akhir enkapsulasi (pakej Tamat TLV).

Perlu diingat bahawa apabila menggunakan protokol LLDP, tidak perlu mendayakan mekanisme pengesahan mana-mana entiti, jadi kaedah lain mungkin diperlukan untuk memastikan maklumat yang diterima datang daripada peranti sebenar.

Apabila menggunakan bahasa Go untuk melaksanakan LLDP, anda boleh menggunakan perpustakaan pihak ketiga untuk pelaksanaan, seperti gopacket dan lldp. Pustaka ini menyediakan kaedah yang memudahkan penciptaan dan menghurai bingkai LLDP dan membantu melaksanakan pemprosesan yang sepadan dengan LLDP. Berikut ialah contoh penggunaan pustaka gopacket:

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,
        &eth,
        &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))
}
Salin selepas log masuk

Pustaka gopacket digunakan di sini untuk mencipta bingkai LLDP dan menggunakan jenis Ethernet sebagai alamat sumber dan destinasi LLDP. Kemudian, gunakan struktur jenis LLDPPacket untuk membina paket data. ID Chassis dan Port ID TLV ialah jenis TLV asas, dan ia boleh dibuat menggunakan struktur jenis LLDPBasicTLV. Selepas mencipta TLV, tambahkan End TLV pada pakej. Akhirnya bersiri pakej menggunakan pilihan bersiri. Paket akan ditulis ke antara muka rangkaian.

Dalam aplikasi praktikal, paket LLDP boleh dipantau dan dihuraikan melalui port. Berikut ialah contoh menggunakan perpustakaan lldp:

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)
        }
    }
}
Salin selepas log masuk

Dalam contoh ini, kami memulakan goroutine tak segerak untuk mendengar pada antara muka rangkaian yang ditentukan (di sini en0). Apabila menerima mesej LLDP, gunakan saluran ralat untuk mencetak ralat dan cetak mesej yang diterima melalui saluran mesej.

Ringkasnya, LLDP ialah protokol yang sangat berguna untuk mencari dan memahami maklumat tentang peranti jiran dalam rangkaian. Protokol LLDP boleh dilaksanakan dengan mudah menggunakan bahasa Go. Dengan sokongan perpustakaan pihak ketiga, kami boleh mencapai penciptaan dan penghuraian bingkai yang lebih pantas serta mengendalikan tugasan yang sepadan dengan LLDP dengan lebih baik.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan protokol LLDP dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan