ARP-Request - 从路由器的角度回复

网络工程 路由器 ARP
2022-03-04 12:09:30

假设我有一个包含此类条目的路由表:

typedef struct route_table_entry {
    uint32_t prefix;
    uint32_t next_hop;
    uint32_t mask;
    int interface;
} route_table_entry;

我有一个有 4 台主机和一个路由器的网络,所有主机都只绑定到路由器。 在此处输入图像描述

我尝试从 h0 ping 到 h1。第一个请求是 ARP 请求。因此,作为路由器,我必须首先:将 h0 IP 和 MAC 缓存到 ARP 表中,如下所示:

typedef struct arp_table_entry {
    uint32_t ipaddr;                /* IP address */
    uint8_t mac[ETH_ALEN];          /* MAC address */
    int interface;                  /* Interface number */
    int ttl;                        /* Time to live. */
} arp_table_entry;

但是如果 ARP 请求或 ether 标头不包含接口,我如何找到接口?我应该使用路由表吗?如果是这样,怎么做?不过,我收到了 ARP 请求并将其发送到所有可用的接口,对吗?

for (size_t i = 0; i < ROUTER_NUM_INTERFACES; ++i)  {
                rc = send_packet(interfaces[i], &m);
                DIE (rc < 0, "send_message");
            }

这不就是广播的意思吗?然后我等待响应,这次我又收到了一个 ARP-Reply 的响应,但是我不知道要发送给谁,因为我不知道请求来自哪个接口,我应该如何绕过它?

2个回答

我有一个有 4 台主机和一个路由器的网络,所有主机都只绑定到路由器。我尝试从 h0 ping 到 h1。第一个请求是 ARP 请求。

同一子网中的主机不使用路由器,而是通过使用 ARP 作为目标 IP 并使用生成的 MAC 进行封装,直接相互通信。不涉及路由器。

当主机位于不同的子网时,本地路由表告诉主机使用网关。主机 ARP 网关(如果不在缓存中)并将 IP 数据包发送到该 MAC。

反过来,路由器 ARP 目标 IP(或另一个网关,由其路由表确定)并将数据包发送到该 MAC。

详细地说,从 H0 到 H1 通过路由器发送如下所示:

  1. H0 检查 H1 的路由表,发现它需要 R-0 作为网关。
  2. H0 ARP 将 R-0 的 IP 用于其 MAC 地址。
  3. H0 将数据包发送到 R-0 的 MAC 地址。
  4. 路由器检查 H1 的路由表,发现它在本地连接到 R-1。
  5. 路由器 ARP 将 H1 的 IP 地址用于其在 R-1 上的 MAC。
  6. 路由器将数据包从 R-1 发送到 H1 的 MAC。

但是如果 ARP 请求或 ether 标头不包含接口,我如何找到接口?

该接口是发送 ARP 请求(通过广播)并收到 ARP 响应的接口。ARP 请求是从连接到目标 IP 子网的接口发送的。该接口由本地路由表确定。

如果您从主机的角度询问路由器对 ARP 的使用:路由器(或其他任何人)是否以及如何使用 ARP 对另一个子网中的主机没有影响。它不知道也不可能知道。

您的问题的答案是,您需要一个在接收数据包时填充的数据包描述符,其中包含接收到它的接口的信息。

但是如果 ARP 请求或 ether 标头不包含接口,我如何找到接口?我应该使用路由表吗?

不要使用路由表来确定您从哪里收到数据包。如果您使用原始套接字(例如在 Linux 中)从接口接收数据包,您知道哪个接口将该数据包传递给您的程序,因为您知道它到达哪个套接字。保存该信息以供您进一步处理步骤。