C/C++ Linux,如何在不使用 IP 的情况下在网络上查找邻居(仅限 MAC)

Posted

技术标签:

【中文标题】C/C++ Linux,如何在不使用 IP 的情况下在网络上查找邻居(仅限 MAC)【英文标题】:C/C++ Linux, How to find neighbors on a network Without Using IP (MAC Only) 【发布时间】:2014-01-13 16:35:22 【问题描述】:

在一个小型网络中,比如说 20 个节点或更少,我的程序在测试仪器上需要知道“谁在外面?”通过 MAC 而不是 IP。我将插入随机网络,并且需要能够做到这一点,而不必知道网络中的任何地址、MAC 或其他地址,并且知道我不能依赖 DHCP。 DHCP 服务器可能已关闭并且节点没有 IP 地址和/或我无法获得 IP 地址是完全合理的。说实话,我不需要IP,我们的测试协议是MAC层,不是IP。

那么,如何确定我的仪器邻居的 MAC 地址?这听起来很像 LLDP,但倒过来了,即“谁在外面”,而不是“我在这里,我可以做到……”。我必须假设没有分配给端点的 IP,所以没有 ARPing、没有 NMAP 等。

注意我要补充一下,这是有线网络。

【问题讨论】:

打开wireshark,抓包,查看所有源和目的mac地址。在C++中,以混杂模式打开网络接口,捕获所有数据包,并解析得到源和目标mac地址 还有网络拓扑? @Vardhan 可能只有一个其他节点(实际上很可能是这种情况)。我发送什么(广播?让其他 MAC 说出我可以捕获的内容?或者是否有一些 MAC 协议规定所有 MAC 时不时会说“你好”? 有广播 ping 等 .. 但有些操作系统可能会选择不响应广播 .. 因为这是一个安全问题.. 这里已经回答了这个问题:serverfault.com/questions/245136/… 【参考方案1】:

在一般情况下,没有 MAC 级别的协议可供您发送并保证网络上每台机器的响应(我假设您在这里使用以太网,因为我相信 WLAN 上的情况有所不同)。 IE 在 MAC 层没有广播(甚至是 IIRC 单播),主机可以保证响应。将 IP 放在上面,您可以进行 IP 广播并检查 ARP 缓存。

(在我看来)最好的方法是使用交换机/学习网桥在以太网上的工作方式,即在混杂模式下被动地监听数据包并记下它们的 MAC 地址。您不会发现完全静默的主机,但在它发送数据包之前也不会发现交换机。根据定义,无论如何都无法发现完全沉默的主机。

【讨论】:

+1 如果不幸的话,那真是天赐良机。你知道我可以复制并编译到测试仪器中的数据包嗅探器吗?在我的开发设置中,使用 wearshark 有点困难。太多的 MS Windows 和太多的虚拟机。 当然。使用 libpcap。如果这是一个好的答案,也许你想接受它:-) 我很擅长接受答案。我通常会等到第二天,这样我就可以给“夜间工作人员”一个回答的机会。

以上是关于C/C++ Linux,如何在不使用 IP 的情况下在网络上查找邻居(仅限 MAC)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数

如何在不安装的情况下修改 package.json 依赖项

如何在不使用 API 的情况下查找 IP 地址的位置?

如何在不使用外部主机的情况下以编程方式查找设备的外部 IP 地址?

如何在不编辑 iOS 中的 /etc/hosts 的情况下使用直接 ip 访问 HTTPS?

如何在不使用collect()和for循环的情况下将一个(IP地址)的特定部分与RDD python pyspark中另一列中的其他IP地址进行比较