信息
我最近一直在学习使用 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 个字节肯定是我发送的消息的长度,我实际上使用这些信息来确保返回的消息是对我发送的内容的响应。
问题
结果,我的问题来了,
如果我没有被误解,来自 MacOS/IOS 和 Windows 的 ICMP Destination Host Unreachable Message 之间确实存在差异??为什么???
如果我想使用相同的策略来确定是否有主机,我该如何修改我的代码并确保返回的消息是对我为每个系统(Windows、MacOS/IOS 和 Linux)发送的内容的响应。