我想知道我在子网 A 中是否有一台具有 IP 地址192.168.123.1的计算机,以及192.168.124.1在不同子网中具有 IP 地址的计算机。
两个网络都通过路由器连接。如果我现在想将一个包从计算机 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 请求。路由器会回复它自己的信息,因为它知道如何访问 Google。下次您浏览另一个网站时,您将不得不再次执行相同的操作,并使用该网站的 IP 发送 arp 请求。这将导致许多 arp 请求(每个网站一个)。并且 arp 缓存会变得非常大。
我真的不知道答案。我发现了两个 YouTube 视频——这个和这个——每个都告诉我不同的事情:
我希望有人可以帮助我。
use*_*686 10
这是“方法A”。根本不会发送针对子网外地址的 ARP 请求。唯一的 ARP 请求将针对网关的IP 地址。
如果你只是192.168.123.1/24为计算机 A设置而没有做任何其他事情,它会有一个这样的路由表:
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确实会发送192.168.123.42.
但是,第二个条目定义了网关,因此假定它是非本地的,并且操作系统不会为这些其他 IP 地址发送 ARP 请求,因为它已经知道无法访问它们。因此,它将直接发送对网关地址的 ARP 请求,而不是其他任何内容。
(您可以通过查看 ARP 缓存来验证这一点;ip neigh或者arp -a取决于操作系统;或者使用诸如tcpdumpWireshark 之类的数据包捕获工具。)
在大多数操作系统中,您当然可以添加路由,明确告诉操作系统某些子网是本地的(例如ip route add 192.168.124.0/24 dev eth0)。
| 归档时间: |
|
| 查看次数: |
33114 次 |
| 最近记录: |