gpt4 book ai didi

macos - Mac更改IP总长度字段

转载 作者:行者123 更新时间:2023-12-03 00:16:12 25 4
gpt4 key购买 nike

我正在 Mac 10.6.8 中使用套接字进行编程。每当我收到数据包时,它都会以 IP header 开始。我一直在使用 Wireshark 来分析传入的数据包,我注意到我的机器的套接字实现将持续更改 IP header 中的“总长度”字段。具体来说,它将减去 IP header 长度并反转字节(从网络顺序到主机顺序)。

例如,以下是 Wireshark 报告的 IP header 的开头:

45 c0 00 38 ...

分割如下:

  • 4 位 (0x4):IP 版本:4
  • 4 位 (0x5):IP header 长度:5 个字(20 字节)
  • 8位(0xc0):差异化服务标志
  • 16位(0x0038):总长度:56字节

但是,当我打印同一个数据包的 recvfrom 填充的缓冲区内容时,我得到了不同的 lede:

ssize_t recvbytes = recvfrom(sock->fd, buffer, size, /*flags=*/0,
(struct sockaddr*)src, &src_len);

返回

45 c0 24 00 ...
  • 4 位 (0x4):IP 版本:4
  • 4 位 (0x5):IP header 长度:5 个字(20 字节)
  • 8位(0xc0):差异化服务标志
  • 16 位 (0x2400):总长度:9216 字节(?!)

我发现在访问缓冲区之前,套接字实现正在读取总长度,减去IP header 长度,然后按主机顺序(我的机器上的小端)而不是网络顺序将其写回(大端)。在此示例中,这意味着:

  • 读取总长度:0x0038 = 56
  • 减去 header 长度:56 - 20 = 36
  • 按主机顺序写回:36 = 0x0024(大端)= 0x2400(小端 = 我机器上的主机顺序)

问题变得更糟。它不仅仅会更改最外层 IP header 的总长度。它还将更改内部 IP header 的总长度字段,例如,埋藏在 ICMP“超时”消息中的总长度字段(其中必须包括丢弃数据包的原始 IP header )。更有趣的是,它不会从内部 header 中减去 IP header 长度;它只是颠倒了字节顺序。

其他人也遇到过这种情况吗?它是我不知道的标准的一部分吗?有没有办法修复我的机器的套接字实现以停止篡改数据包? Wireshark 如何解决这个问题?

预先感谢您的考虑。

编辑:我的代码和 Makefile 可用 on GitHub 。我编写了一个 fixip_osx 函数来允许验证 IP 校验和:

https://github.com/thejohnfreeman/netutils/blob/master/lib/ip.c

void fixip_osx(struct ip* ip) {
/* Something on my Mac subtracts the header length from `ip_len` and stores
* it in host order (little endian). */
u16_t ip_hdrlen = ip->ip_hl << 2;
u16_t ip_totlen = ip->ip_len + ip_hdrlen;
ip->ip_len = htons(ip_totlen);
}

但是,当有效负载包含另一个 IP header 时,验证 ICMP 校验和仍然是一个问题。

无论我使用 Clang 3.2(从 trunk 构建)还是 GCC 4.7(MacPorts 端口)进行编译,都存在问题,因此我认为问题在于套接字实现(与 Mac OS 一起打包)或 Mac OS X 本身。

最佳答案

BSD 平台套件(不包括 OpenBSD)以主机字节顺序显示 IP 偏移量和长度。所有其他平台均以接收到的网络字节顺序存在。这是一个“功能”,并在 IP(4) - Internet Protocol 的手册页中引用。 (FreeBSD,OS X)。

The ip_len and ip_off fields must be provided in host byte order . All other fields must be provided in network byte order.

在 FreeBSD/NetBSD 中,IP 长度可以等于数据包长度 - IP header 长度

引用:Stevens/Fenner/Rudolph,Unix 网络编程第 1 卷,第 739 页

我必须用PGM网络协议(protocol)的用户空间实现来处理这些异常,具体代码:

https://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/packet_parse.c#76

检测 AutoConf 实际上非常烦人,我认为所有软件包都在每个平台的基础上进行了硬编码。我看到了本周针对这个问题提出的错误报告 ( header byte order config options detected incorrectly )。

关于macos - Mac更改IP总长度字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com