Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh membuat dan menghantar paket TCP mentah menggunakan Golang dan gopacket?
Membuat dan Menghantar Paket TCP Mentah dengan Golang Menggunakan gopacket
Anda ingin membina paket TCP tersuai menggunakan gopacket dan menghantarnya melalui soket mentah. Benarkan kami membimbing anda melalui proses:
Membuat Pengepala Paket IP dan TCP Tersuai
Walaupun soalan anda menyebut tentang membuat paket TCP tersuai, kod anda mencadangkan anda ingin mengubah suai kedua-dua tajuk IPv4 lapisan 3 dan TCP lapisan 4. Kami akan menumpukan pada IPv4 untuk contoh ini:
// Example Packet Definition import ( "code.google.com/p/gopacket" "code.google.com/p/gopacket/examples/util" "code.google.com/p/gopacket/layers" "log" "net" ) // Packet Data srcIP := net.ParseIP("127.0.0.1") dstIP := net.ParseIP("192.168.0.1") ipLayer := layers.IPv4{ SrcIP: srcIP, DstIP: dstIP, Protocol: layers.IPProtocolTCP, } tcpLayer := layers.TCP{ SrcPort: layers.TCPPort(666), DstPort: layers.TCPPort(22), SYN: true, } // Compute Checksums and Serialize Packet tcpLayer.SetNetworkLayerForChecksum(&ipLayer) buf := gopacket.NewSerializeBuffer() err := gopacket.SerializeLayers(buf, gopacket.SerializeOptions{ FixLengths: true, ComputeChecksums: true, }, &ipLayer, &tcpLayer) if err != nil { panic(err) }
Mencipta Soket Mentah di Golang
Berbeza dengan respons yang salah pada platform ini, Go membenarkan soket mentah penciptaan menggunakan net.ListenPacket, net.DialIP, atau net.ListenIP. Contohnya:
conn, err := net.ListenIP("ip4:tcp", netaddr) if err != nil { log.Fatalf("ListenIP: %s\n", err) }
Mendayakan Kemasukan Pengepala IP
Pada macOS dan Linux, anda boleh menetapkan pilihan soket IP_HDRINCL untuk membenarkan pengubahsuaian pengepala IPv4 tersuai.
conn.SetsockoptIPHDRINCL(true)
Menghantar Paket
Akhir sekali, hantar paket menggunakan soket mentah:
_, err = conn.WriteTo(buf.Bytes(), &dstIPaddr) if err != nil { panic(err) }
Nota: Untuk mengelakkan pengulangan, kami telah menumpukan pada langkah teras untuk memasang paket dan menghantarnya melalui soket mentah. Walaupun kami percaya respons ini betul dan menyeluruh dari segi teknikal, ia tidak bertujuan untuk menjadi penyelesaian kod yang lengkap.
Atas ialah kandungan terperinci Bagaimanakah saya boleh membuat dan menghantar paket TCP mentah menggunakan Golang dan gopacket?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!