向另一个子网发送 ARP 查询消息

网络工程 ARP
2022-03-03 23:01:52

在此处输入图像描述

主机 E 想向主机 B 发送一些数据。进一步假设主机 E 没有主机 B 的 MAC 地址。当路由器存在于子网 2 和 3 之间时,不会发送 ARP 查询消息,但是当该路由器被交换机替换时,主机 E 会发送 ARP 查询消息吗?为什么它会在交换机存在的情况下发送?为什么连接路由器后不能发送?我可以说只有交换机能够将ARP发送到另一个子网而路由器不能这样做吗?

2个回答

主机 E 想向主机 B 发送一些数据。进一步假设主机 E 没有主机 B 的 MAC 地址。

由于 B 和 E 在不同的子网上,它们的 MAC 地址对彼此没有影响。MAC 地址用于公共子网中的“直接”L2 通信。不同的子网需要通过路由器进行 L3 通信。

当路由器存在于子网 2 和 3 之间时,不会发送 ARP 查询消息,但是当该路由器被交换机替换时,主机 E 会发送 ARP 查询消息吗?

E 将 B 的所有通信发送到其间的路由器。路由器转发给 B。E ARP 路由器和路由器 ARP B。

为什么它会在交换机存在的情况下发送?

交换机是对 L2 及更高级别透明的设备。跨交换机的通信使用“物理”MAC 寻址。基本上,交换机使您能够创建具有两个以上节点的子网(在没有过时的中继器集线器或总线连接的物理层(如 10BASE5)的情况下)。

为什么连接路由器后不能发送?我可以说只有交换机能够将ARP发送到另一个子网而路由器不能这样做吗?

ARP 使用 L2 广播将请求发送到其广播域(由交换机跨越)内的所有主机。L2 广播不被路由器转发,因此 ARP 请求无法到达远程子网。

控制主机 E 行为的不是路由器的存在与否,而是寻址。

以太网之上的主机 IP 层本质上将针对其自己子网中的任何目标 IP 地址进行 ARP,由其自己的 IP 地址和网络掩码定义。如果目的地是本地的,它会根据需要对以太网地址进行 ARP,并在 Ether.dst = B.ether 的以太网帧中发送 IP.dst = B.ip 的数据包。

如果它不是本地的,并且配置了一个默认网关路由器,它会在必要时为路由器进行 ARP,然后在带有 Ether.dst = R.ether 的以太网帧中发送带有 IP.dst = B.ip 的数据包. (如果配置了多个路由器,它会根据自己的规则选择一个,通常是“最具体的”,但这是以后的问题。)

在伪代码中,它可能是

define send_packet_to(dstip, data)
    if (dstip & netmask) == (myip & netmask) then
       # it's local, send it direct
       send_etherframe_to(etheraddress_of(dstip), ...)
    else
       # it's not local, send to default gateway
       send_etherframe_to(etheraddress_of(mydefaultrouter), ...)
    end
end

define etheraddress_of(ipaddr)
    if has_cached(ipaddr) then
        return(arpcache[ipaddr])
    else
       etheraddr = arp_for_address(ipaddr) # send and receive ARP
       arpcache[ipaddr] = etheraddr
       return(etheraddr)
    end
end

(这个描述是纯 IPv4/ether 系统应该做的。你会发现历史上各种错误的实现,包括“不管地址总是 ARP”,但我至少有十年没见过其中之一了。 )