arp 请求到另一个子网,如何?

use*_*517 7 networking arp

我想知道我在子网 A 中是否有一台具有 IP 地址192.168.123.1的计算机,以及192.168.124.1在不同子网中具有 IP 地址的计算机。

两个网络都通过路由器连接。如果我现在想将一个包从计算机 A 发送到计算机 B,我将不得不使用 ARP 来获取它们的 MAC 地址以发送帧(假设 ARP 缓存为空)。

我现在的问题是:这个 ARP 请求会是什么样子,我可以想到两种可能的方法:

  1. 计算机 A,看到计算机 B 的 IP 地址在他自己的子网之外。它决定将数据包发送到他的默认网关(路由器)并发送带有路由器 IP 地址的 ARP 请求。接下来:路由器回复他的 mac 地址,并将帧发送到路由器,路由器将处理该帧。

  2. 计算机 A 是“愚蠢的”,它发送了一个带有 B 的 IP 地址的 ARP 请求。路由器足够聪明,并且看到 IP 地址在它的路由表中。并回复自己的MAC地址。接下来,计算机 A 将帧发送到路由器,认为它是计算机 B。路由器将数据包发送到计算机 B。

我看到第二种方法的缺点是,当您浏览 google 时,它​​会使用 Google 的 IP 地址执行 arp 请求。路由器会回复它自己的信息,因为它知道如何访问 Google。下次您浏览另一个网站时,您将不得不再次执行相同的操作,并使用该网站的 IP 发送 arp 请求。这将导致许多 arp 请求(每个网站一个)。并且 arp 缓存会变得非常大。

我真的不知道答案。我发现了两个 YouTube 视频——这个这个——每个都告诉我不同​​的事情:

我希望有人可以帮助我。

use*_*686 10

这是“方法A”。根本不会发送针对子网外地址的 ARP 请求。唯一的 ARP 请求将针对网关的IP 地址。

如果你只是192.168.123.1/24为计算机 A设置而没有做任何其他事情,它会有一个这样的路由表:

  • 192.168.123.0/24 到设备 eth0
  • 0.0.0.0/0到网关192.168.123.254设备 eth0

在这样的路由表中,第一个条目声明192.168.123.0/24是本地的——无需网关即可通过 eth0 访问——因此尝试联系192.168.123.42确实会发送192.168.123.42.

但是,第二个条目定义了网关,因此假定它是非本地的,并且操作系统不会为这些其他 IP 地址发送 ARP 请求,因为它已经知道无法访问它们。因此,它将直接发送对网关地址的 ARP 请求,而不是其他任何内容。

(您可以通过查看 ARP 缓存来验证这一点;ip neigh或者arp -a取决于操作系统;或者使用诸如tcpdumpWireshark 之类的数据包捕获工具。)

在大多数操作系统中,您当然可以添加路由,明确告诉操作系统某些子网是本地的(例如ip route add 192.168.124.0/24 dev eth0)。