首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用gopacket获取头部字节数/长度

如何使用gopacket获取头部字节数/长度
EN

Stack Overflow用户
提问于 2016-10-27 08:21:55
回答 1查看 1.2K关注 0票数 3

尝试使用gopacket创建以太网数据包(ARP、BGP、UDP、TCP)并获取其报头字节和长度。

尝试如下示例,尝试列出所有层并找到有效负载位置,然后计算出总的头部长度和字节数:

代码语言:javascript
复制
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())
    }
}

我得到的错误如下:

代码语言:javascript
复制
Packet layer: Ethernet
Packet layer: IPv4
Packet layer: DecodeFailure

我做错什么了吗?

有没有人能告诉我怎么才能得到头字节?

EN

回答 1

Stack Overflow用户

发布于 2016-10-27 11:19:20

首先,正如您注释掉的IPv4字段所暗示的那样,layer.Error()包含更多信息:

代码语言:javascript
复制
if withErr, ok := layer.(interface{ Error() error }); ok {
    fmt.Pritnln(withError.Error())
}

在这种情况下,当IHL字段被设置为5时,其表示4字节字中的报头长度。由于您指定的长度为24,因此在IHL中计算的长度与提供的长度之间存在不匹配,并且尝试将其解析为IPv6数据包时gopacket崩溃。您可以将长度调整为20,将报头长度调整为5,在这种情况下,它可以正确解析,但不包含tcp字段。

gopacket实际上并不是用来生成数据包的,而是用来解析捕获的数据包。

如果你真的想手动完成,我建议你阅读相关的RFC,并确保你涵盖了各种选项,计算校验和,设置协议(6对于tcp),正确的长度(tcp数据包实际上有一个32字节的报头,如果我没有弄错的话),等等,这是相当复杂的。

在正常情况下,这一切都应该由操作系统的套接字来处理。为什么要尝试手动生成此文件?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40274172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档