我想知道我是否有一台位于子网 A 且 IP 地址为 的计算机,以及一台位于不同子网的192.168.123.1
IP 地址为 的计算机。192.168.124.1
两个网络都通过路由器连接。如果我现在想从计算机 A 向计算机 B 发送数据包,我必须使用 ARP 获取它们的 MAC 地址以发送帧(假设 ARP 缓存为空)。
我现在的问题是:这个 ARP 请求是什么样的,我能想到两种可能的方法:
计算机 A 发现计算机 B 的 IP 地址位于其自己的子网之外。它决定将数据包发送到其默认网关(路由器),并使用路由器的 IP 地址发送 ARP 请求。接下来:路由器使用其 mac 地址进行回复,并将帧发送到路由器,路由器将负责处理该帧。
计算机 A 很“愚蠢”,它发送了一个带有计算机 B 的 IP 地址的 ARP 请求。路由器很聪明,它看到 IP 地址在它的路由表中。然后用它自己的 MAC 地址回复。接下来,计算机 A 将帧发送到路由器,认为它是计算机 B。路由器将数据包发送到计算机 B。
我认为第二种方法的缺点是,当您浏览 Google 时,它会使用 Google 的 IP 地址发出 arp 请求。路由器会用自己的 IP 地址回复,因为它知道如何访问 Google。下次您浏览另一个网站时,您将不得不再次执行相同的操作,并使用该网站的 IP 发送 arp 请求。这将导致许多 arp 请求(每个网站一个)。并且 arp 缓存将变得非常大。
我真的不知道答案。我在 YouTube 上找到了两个视频——这个和这个—每个人都告诉我不同的事情:
我希望有人能帮助我。
答案1
它是“方法A”。子网外地址的 ARP 请求将不会被发送。唯一的 ARP 请求将是网关的IP地址。
如果你只是为计算机 A 设置192.168.123.1/24
而不执行任何其他操作,它将具有如下路由表:
192.168.123.0/24
到设备 eth00.0.0.0/0
到网关192.168.123.254
设备 eth0
在这样的路由表中,第一个条目声明是192.168.123.0/24
本地的——无需网关就可以通过 eth0 访问——因此尝试联系192.168.123.42
确实会发送 ARP 请求192.168.123.42
。
但是,第二个条目已定义网关,因此假定为非本地,操作系统不会费心发送针对这些其他 IP 地址的 ARP 请求,因为它已经知道无法访问它们。因此,它将直接发送针对网关的地址,仅此而已。
(您可以通过查看 ARP 缓存来验证这一点;ip neigh
或者arp -a
取决于操作系统;或者通过使用像tcpdump
Wireshark 这样的数据包捕获工具。)
当然,在大多数操作系统中,您可以添加路由,明确告知操作系统某些子网是本地的(例如ip route add 192.168.124.0/24 dev eth0
)。
答案2
仅当没有其他路由(只有接口路由)匹配时,才使用地址解析协议和邻居发现协议 (IPv6)。如果有匹配的路由(无论是默认路由还是显式路由),将联系指定的网关。当然,解析网关地址仍使用 ARP/NDP。
答案3
这是两种不同的 IPv4 网络配置方法,均可运行,且各有优缺点。
(A)经典网络: 客户端至少需要知道三件事:IPv4 地址、子网大小、默认网关地址。当客户端 A 想要与客户端 B 通信时,它会查看 B 的地址,并根据其对子网大小的了解来确定 B 是本地的还是远程的。如果是本地的,它将为 B 的 MAC 地址进行 arp,然后进行通信;如果是远程的,则 A 会将数据发送到网关,并让网关处理路由。
优点:客户端的 ARP 表大小有限,将知道客户端是本地的还是远程的,因此可以相应地“调整”网络超时。
缺点:客户端需要更多的配置信息,如果网关发生变化,则所有客户端都需要更新,子网大小需要是 2 的幂(例如 256、512、2048 等)。
(B)基于代理 ARP 的路由 客户端只需要知道自己的 IPv4 地址。子网大小设置为全世界(子网掩码 0.0.0.0),不需要网关。IE 客户端认为它直接连接到全世界的所有其他计算机。当客户端 A 想要与客户端 B 对话时,它只需对 B 的 MAC 地址进行 ARP 操作,它会得到回复并开始对话。
子网上需要有一个具有特殊配置的网关:启用代理 ARP 并设置正确的子网大小。当网关“看到”arp 请求时,它会检查目标(B)客户端是否在本地子网上。如果是,网关将保持安静并让 B 响应,如果是远程的,则网关将使用自己的 MAC 地址响应 A。因此,客户端 A 将获得一个可用的 MAC 地址,而不必担心/知道 B 是本地的还是远程的。
优点:客户端配置更简单,能够拥有奇数大小的子网(例如 768 个主机),从而具有更好的地址利用率。
缺点:客户端的 ARP 表可能非常庞大,且客户流失率较高,arp 请求流量占比较大。诊断故障可能更加困难。在双栈情况下,与 IPv6 配合使用效果也不好。
我们曾经对一些客户端子网使用过代理 arp 路由,但发现它带来的麻烦多于其本身的价值,所以现在我们对所有子网都使用了经典路由。