以下两种情况,从router1向router2发送ARP Request报文会怎样?是否会生成 ARP Reply 或丢弃 ARP Request 数据包?
- [路由器 1]Intf1(20.0.0.1/24) ======== (40.0.0.1/24)Intf2[路由器 2]
- [路由器 1]Intf1(20.0.0.1/24) ======== (20.0.0.2/8) Intf2[路由器 2]
上面的拓扑在路由器“router1”上有一个端口“Intf1”,通过直接链路(例如,1 Gbps 电缆)连接到另一个路由器“router2”上的端口“Intf2”。
ARP 仅在同一 IP 子网中的设备之间起作用。
当 IP 地址为 A 的设备 A 需要向 IP 地址为 B 的设备 B 发送数据包时,它做的第一件事是查询其路由表以确定 IP 地址 B 是否属于它可以通过其网络接口直接到达的子网); 如果是,则设备 A 使用 ARP 将 IP 地址 B 映射到物理以太网地址,然后将以太网帧发送到该地址。
但是,如果这两个 IP 地址位于不同的子网中,设备将遵循完全不同的逻辑:它将在其路由表中查找到目标网络的路由,然后将其数据包发送到适当的路由器(或它的默认网关(如果没有更具体的路由));在这种情况下,ARP 将用于查找路由器的硬件地址,因为目标 IP 地址已被视为不可直接到达,因此必须将数据包传递给能够处理它的路由器。
在某些情况下(我知道 Linux可以这样做,其他人不确定),但主机可以在“错误”接口上响应 ARP。以这个网络为例:
主机 A 在两个网络上都有一个地址;
10.0.0.1
让我们说192.168.0.1
如果主机 A 通过 10.0.0.1 接口接收到 192.168.0.1 的 ARP,它将使用 10.0.0.1 接口的 MAC 地址进行响应。
此行为由
arp_ignore
内核可调参数控制(来源:http: //blog.steve-miller.org/2010/03/tweaking-arp-behavior-in-linux.html):如上所述,默认响应任何本地地址(即主机 A 上配置的地址),而不管 ARP 在哪个接口上接收。
你的拓扑结构对我来说不清楚。你在router1/intf1上有一个ip地址,在router2/intf2上有2个ip地址吗?然而,当 router1/intf1 向 router2/intf2 发送 arp 请求时,router2 将发送 arp 回复,而 router1 将在其 arp 表中存储 ip 地址 20.0.0.2 的 mac 地址。这将起作用,因为 20.0.0.1/24 包含在网络 20.0.0.2/8 中。你为什么这样配置IP地址有点奇怪
有两个可能的答案都与 arp 无关,而是与转发表有关。
如果在 R1 上有一个路由声明,用于从 Intf1 转发以所有网络为目的地的流量(默认路由),那么在这两种情况下,ARP 回复将由 R2 生成并由 R1 接收。
ARP 是一种链路层协议,它使用硬件地址进行通信。它没有依赖性,也不受IP等高层协议的限制。