2台设备如何通过以太网交换机进行通信

How do 2 devices communicate over an ethernet switch

在我继续之前,我想提一下我确实尝试在互联网上研究这个主题,但我仍然需要澄清。

假设我有两台 Linux 机器连接到一个交换机(并且只连接到一个交换机)。机器 A 的 IP 地址为 10.0.0.1,机器 B 的 IP 地址为 10.0.0.2。我使用 nmcli 命令设置 IP 地址并为每台机器创建一个以太网接口。一切都按预期工作。

现在,令人困惑的部分是机器 A 如何找到机器 B,反之亦然?我正在使用以下命令从机器 A 连接到机器 B:

ssh userB@10.0.0.2

它有效,即使这是第一次数据传输。这肯定意味着机器 A 不知何故已经知道机器 B MAC 地址;否则,框架不会找到通往机器 B 的路。但是如何呢?既然IP地址对交换机(Level2)没有意义,为什么我做ping 10.0.0.2ssh 10.0.0.2,它仍然有效?

可能 ARP 缓存已经填充。也许有一个 grations ARP 广播:

Every time an IP interface or link goes up, the driver for that interface will typically send a gratuitous ARP to preload the ARP tables of all other local hosts.

如果不是,很可能是 ARP request/reply 在第一次 ping 之前发生。检查 arp 命令或 ip neigh.

一般来说,我建议您使用 Wireshark 来探索正在发生的事情,或者如果您正在远程工作,则使用 tcpdump -n -i eth0 not ssh 之类的东西(请注意 -n 以防止名称解析)。您还可以使用 tcpdump -s 9999 -w output.pcap 记录流量,稍后在 Wireshark 中查看。

如果您在第三台 PC 上嗅探网络流量,请记住交换机在了解目标位置后不会将流量发送到所有端口。一些交换机允许您配置镜像端口以观察进出某个端口的所有流量。无论哪种方式,您都应该始终能够在广播时观察到 ARP 请求。

基本上,当第一个数据包到达交换机(虚拟或物理交换机)时,交换机将填充 arp 广播数据包以获取所有设备 mac 和 ip 地址。因此,即使 ip 地址对交换机来说似乎毫无意义(因为它们是第 3 层概念,但交换机是针对第 2 层的),交换机仍然需要这些数据来处理数据包。因为这就是我们作为人类与计算机交互以使用 IP 地址传输数据的方式。 当你 ping 一个设备,比如 10.0.0.2,交换机会在它的 arp table 中搜索并找到相应的 mac 地址以及到达目的地的接口。 理解整个过程的最佳方式是使用 wireshark 捕获数据,甚至在 cisco packet tracer 等软件中实现简单的拓扑。