gopacketを使用して、イーサネットパケット(ARP、BGP、UDP、TCP)を作成し、ヘッダーバイトと長さを取得してみます。すべてのレイヤーをリストアップし、ワークアウトに続い総ヘッダ長やバイトをペイロードの場所を見つけようと、以下のような例を用いて再生するgopacketでヘッダーバイト/長さを取得する方法
試してみてください。
Packet layer: Ethernet
Packet layer: IPv4
Packet layer: DecodeFailure
:
package main
import (
"fmt"
"net"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
)
func main() {
var (
buffer gopacket.SerializeBuffer
options gopacket.SerializeOptions
)
// Create the layers
ethernetLayer := &layers.Ethernet{
SrcMAC: net.HardwareAddr{0xff, 0xaa, 0xfa, 0xaa, 0xff, 0xaa},
DstMAC: net.HardwareAddr{0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd},
EthernetType: layers.EthernetTypeIPv4,
}
ipLayer := &layers.IPv4{
SrcIP: net.IP{192, 168, 1, 3},
DstIP: net.IP{8, 8, 8, 8},
// Version: 4,
// IHL: 5,
Length: 24,
}
tcpLayer := &layers.TCP{
SrcPort: layers.TCPPort(4321),
DstPort: layers.TCPPort(80),
}
fmt.Println(tcpLayer)
payload := []byte{10, 20, 30, 40, 50, 60}
buffer = gopacket.NewSerializeBuffer()
gopacket.SerializeLayers(buffer, options, ethernetLayer, ipLayer, tcpLayer, gopacket.Payload(payload))
outgoingPacket := buffer.Bytes()
packet := gopacket.NewPacket(outgoingPacket, layers.LayerTypeEthernet, gopacket.Default)
for _, layer := range packet.Layers() {
fmt.Println("Packet layer:", layer.LayerType())
}
}
私は以下のようにエラーが発生しました
私は何か間違っていましたか?
誰でも私にどのようにヘッダバイトを得ることができますか考えてもらえますか?この場合
if withErr, ok := layer.(interface{ Error() error }); ok {
fmt.Pritnln(withError.Error())
}
、IHLフィールドは5に設定され、4バイトワードのヘッダの長さを示す: