来自 MacOS/IOS 和来自 Windows/Ubuntu 的 ICMP Destination Host Unreachable Message 之间是否存在差异?

网络工程 IPv4 icmp 网络
2022-02-05 20:08:09

信息

我最近一直在学习使用 Python 进行网络编程,现在我正在使用ICMP Destination Unreachable Message构建主机扫描器

确实,我已经部分意识到了这一点。我可以识别所有连接到我家网络的 Windows/Linux/Android 系统,但问题是:

我无法用同样的方法找到所有 MacOS 和 IOS 系统的主机

我的代码

以下是我用来确定是否存在主机的主要部分: 在此处输入图像描述 我发送了一条消息“PYTHONRULES!” 到我的 IP 子网中每个可能的 IP 的端口。

我的结果如下: 在此处输入图像描述

但是,事实上,在我的房间里,我已经用 iPhone、MBP 和 Ubuntu 连接了 wifi(使用 VirtualBox 的桥接网络)。
我用它的ip检查了每台设备,

1.iPhone:192.168.0.4
2.MBP:192.168.0.2

3.Ubuntu:192.168.0.21
4.DNS 服务器:192.168.0.1

不难看出,问题是存在的。

我做了什么

  • 我已经直接检查了 MBP 返回的 ICMP 消息,以避免端口确实处于活动状态的情况。返回 ICMP 类型和代码都等于 3(即目标主机不可达)
  • 然后我检查了每条返回消息的长度。区别就在这里:
    • Ubuntu返回的消息长度为 68 字节,而MBP 的返回消息长度为 56 字节。
    • 我还尝试过使用Windows 系统的网络,该系统也返回68 字节的消息作为 Ubuntu。
  • 我已经通过谷歌搜索过这种现象,但找不到详细的解释。
  • 我通过 Google 搜索了有关ICMP Destination Unreachable Message的格式,其中声明为

    IP头(20字节)+ICMP头(8字节)+原始IP头(20字节)+原始消息的前8字节(8字节)(ps:我以为这是UDP头)

    这等于从 MBP 返回的内容的长度,56 字节。因此,来自 Ubuntu 的 12 个字节肯定是我发送的消息的长度,我实际上使用这些信息来确保返回的消息是对我发送的内容的响应。

问题

结果,我的问题来了,

  1. 如果我没有被误解,来自 MacOS/IOS 和 Windows 的 ICMP Destination Host Unreachable Message 之间确实存在差异??为什么???

  2. 如果我想使用相同的策略来确定是否有主机,我该如何修改我的代码并确保返回的消息是对我为每个系统(Windows、MacOS/IOS 和 Linux)发送的内容的响应。

1个回答

您所看到的是 ICMP 标准的旧版本和新版本之间的区别。原始规范声明必须包含标头 + 8 个字节(64 个八位字节),但RFC 1812指出:

从历史上看,每个 ICMP 错误消息都包含 Internet 标头和触发错误的数据报的至少前 8 个数据字节。由于使用了 IP-in-IP 隧道和其他技术,这已经不够了。因此,ICMP 数据报应该包含尽可能多的原始数据报,ICMP 数据报的长度不超过 576 字节。

显然 IOS 和 Mac OS 使用较旧的规范,该规范不包括您的 UDP 标头之外的任何内容。您的代码假定 ICMP 错误的最后 12 个字节是 your magic_message,这仅在其他设备实施修订的 RFC 1812 定义时发生。