IP 标头中不同的数据报长度字段

问题描述 投票:0回答:1

我正在尝试从 IP 标头开始解析 ICMP 数据包。

func main() {
    fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_ICMP)
    if err != nil {
        fmt.Println(err)
        return
    }

    for {
        buf := make([]byte, 1024)
        numRead, err := syscall.Read(fd, buf)
        if err != nil {
            fmt.Println(err)
        }

        fmt.Println(hex.EncodeToString(buf[:numRead]))

    }
}

这是我的起始 Go 代码。

  1. 我运行这个应用程序
  2. 我运行 Wireshark 来监听 ICMP 数据包。过滤器:ip.src==192.168.1.109||ip.dst==192.168.1.109
  3. 我 ping 到 google.com 以捕获回显回复。

我希望从 Wireshark 和我的应用程序回复数据包是相同的,但结果是这样的:

注意: 字节从 IP 标头开始我没有给出链路层字节。

去:

45004000000000003801c12cd8ef2678c0a8016d00007e72324f0000668e33570008ca4d08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637

Wireshark:

45000054000000003801c12cd8ef2678c0a8016d00007e72324f0000668e33570008ca4d08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637

如果我们查看 IP 标头的前 20 个字节,唯一的区别是数据报长度。从第3.字节开始到第4.字节。

去:4000

Wireshark:0054

我无法找到为什么它们不同,因为我正在监听具有相同序列号的相同数据报。感谢您的宝贵时间。

go sockets networking wireshark icmp
1个回答
0
投票

事实证明,macOS 正在更改原始套接字标头。 Wireshark 可以显示真实的结果,因为它是在内核级别工作的。当我运行 Fedora docker 容器并运行脚本时,它给出的结果与 Wireshark 中的结果相同。

© www.soinside.com 2019 - 2024. All rights reserved.