我正在尝试从 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 代码。
我希望从 Wireshark 和我的应用程序回复数据包是相同的,但结果是这样的:
注意: 字节从 IP 标头开始我没有给出链路层字节。
去:
45004000000000003801c12cd8ef2678c0a8016d00007e72324f0000668e33570008ca4d08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
Wireshark:
45000054000000003801c12cd8ef2678c0a8016d00007e72324f0000668e33570008ca4d08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
如果我们查看 IP 标头的前 20 个字节,唯一的区别是数据报长度。从第3.字节开始到第4.字节。
去:4000
Wireshark:0054
我无法找到为什么它们不同,因为我正在监听具有相同序列号的相同数据报。感谢您的宝贵时间。
事实证明,macOS 正在更改原始套接字标头。 Wireshark 可以显示真实的结果,因为它是在内核级别工作的。当我运行 Fedora docker 容器并运行脚本时,它给出的结果与 Wireshark 中的结果相同。