c# - 如何发现连接到第 2 层交换机的所有主机?

c# - How to discovery all hosts connected to a Layer 2 Switch?

我有一个这样的局域网:

我正在用 C# 编写程序。该软件在所有主机上运行。 软件需要知道哪些主机连接到它自己的第 2 层交换机。在不干扰服务器的情况下完成此操作非常重要,因为这个软件是给LanParty用的,服务器上的硬件和软件都变了,局域网也是一样的。

知道所有主机的位置并不重要,但您只需要知道哪些主机连接到同一个交换机即可。

在示例中,"Host A" 知道 "Host C" 和 "Host E" 连接到同一交换机,而所有其他主机都不是。

如果交换机使用 SNMP,您只需询问他们的 MAC 地址表并找出哪些主机连接到哪里。

如果他们不这样做,您将不得不求助于这样的技巧:

  • 假设所有主机都连接到一个交换机
  • 建立所有主机之间的通信
  • 分配角色给3个任意主机:sender, receiver, sink
  • 选择网络中当前未使用的MAC地址
  • receiver 将其 NIC 配置为新的 MAC 地址,并将一个数据包发送到 sink(该数据包通过的所有交换机通过现在知道那个地址)
  • 所有其他主机将其 NIC 设置为混杂模式
  • sender 将数据包发送到 receiver(如果 sender 连接到交换机没有学习 接收者的 新地址,那台交换机将在所有端口上溢出数据包。如果这些端口中的一个或多个连接到其他也没有学习地址的交换机,这些开关也会泛滥)

所以如果 receiver 以外的任何主机看到了第二个数据包,这证明主机和 sender 分别连接到一个交换机在 receiversink.

之间的直接路由上 not

假设sinkreceiver和所有没有看到第二个数据包的监听器都连接到一个交换机,sender 和所有看到它的听众都连接到另一个。 使用新的 MAC 地址和三个角色的新分配再次尝试,直到您有足够的信息来计算网络拓扑(或者直到您放弃并接受单个交换机的第一个假设)。