假设我在本地网络中有 3 台机器,分别是 A、B 和 C。现在 A 想要向 B 发送一些数据。
现在,A 需要知道 B 的 IP 和 MAC。为简单起见,我们假设已知 B 的 IP。
a) 要知道 B 的 MAC 地址,A 是否将消息广播到网络中的每台机器并将其填充到 ARP 表中,或者它只是与路由器对话,因为路由器是所有设备都必须注册的路由器,所以它应该知道?
b) 一旦知道 B 的 IP 和 MAC,A 是否仍会将消息发送到每台机器,即 B 和 C,而 C 只是拒绝它,或者它发送到路由器,而路由器只将其转发给 B,因此 C 永远不会收到它?
答案1
在继续之前,请记住家庭“路由器”的工作原理如下:
也就是说,它是一个“二合一”盒子,带有路由器和以太网交换机。
在此类设备中,MAC 地址之间的转发是不是由“路由器”完成 – 全部由以太网交换机完成。路由器的 CPU 不会接收任何未发送到其 MAC 地址(或广播地址)的数据包。
a) 要知道 B 的 MAC 地址,A 是否将消息广播到网络中的每台机器并将其填充到 ARP 表中,或者它只是与路由器对话,因为路由器是所有设备都必须注册的路由器,所以它应该知道?
路由器不是所有设备都必须注册到路由器。路由器实际上与单个子网的功能无关——它的唯一工作是转发数据包之间子网,但在同一个子网内,所有操作都直接在主机之间完成,并且可以存在一个独立的子网,而根本不需要路由器。
(最接近“路由器注册”的是通过 DHCP 自动配置 IP 地址,这只是为了方便而在路由器上运行,但对路由器“知道”的内容没有任何影响。)
连接主机的只是以太网本身:数据包通过以太网交换机,或(在过去)通过以太网集线器,或(在更早的时候)通过长同轴电缆,“直接”从一台主机传输到另一台主机。路由器只是连接到以太网的另一个设备,如果某些主机没有专门与路由器通信,它甚至可能完全不知道它们。
因此正常答案是“选项 1”:主机 A 必须播送ARP 查询并等待主机 B 本身在 ARP 响应中使用自己的 MAC 地址进行响应。
(当然,网络足够灵活,可能会有完全改变行为的例外情况,例如代理 ARP - 例如在 Wi-Fi 网络中,接入点通常可以“代表”其无线设备回答 ARP - 但它们仍然是例外,而不是以太网工作的“正常”方式。)
b) 一旦知道 B 的 IP 和 MAC,A 是否仍会将消息发送到每台机器,即 B 和 C,而 C 只是拒绝它,或者它发送到路由器,而路由器只将其转发给 B,因此 C 永远不会收到它?
从技术上来说,两者都不。
主持人 A 没有试图广播数据包,但它也不会尝试将其发送到路由器 - 它尝试将数据包直接发送到 B;这就是为什么 A 首先需要了解 B 的 MAC 地址。但接下来发生的事情更多地取决于网络本身:
在现代以太网中,设备通过以太网交换机连接,以确保发往 B 的 MAC 地址的数据包仅转发到 B 并且永远不会被 C 看到(就此而言,路由器也看不到)。
在非常古老的以太网网络(使用集线器或同轴电缆)中,所有数据包都会到达每个设备;主机必须忽略非 a) 广播或 b) 专门发送给它们的数据包。
当涉及到 Wi-Fi 时,您可以混合使用两种类型:完全停留在有线以太网上的数据包直接切换到目标主机,但通过 Wi-Fi 传输的数据包可能会到达所有无线设备(因为 Wi-Fi 是无线电,而无线电本质上是广播)。
因此,如果您有上述“路由器”图,其中主机 A 连接到“LAN1”,主机 B 连接到“LAN2”,则会发生以下情况:
- 主机 A 使用 ARP 了解 B 的 MAC 地址。
- 主机 A 发送“目标 MAC =(B 的 MAC 地址)”的数据包。
- 路由器内置交换机通过LAN1口接收。
- 交换机检查其 MAC 到端口表,以查看 B 的 MAC 位于哪个以太网端口。(交换机根据先前看到的数据包“学习”这一点。)
- 交换机仅通过“LAN2”将数据包转发到主机 B。