假设我有一个包含此类条目的路由表:
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 的响应,但是我不知道要发送给谁,因为我不知道请求来自哪个接口,我应该如何绕过它?