![在 Linux 机器上的 ipv4 接口上配置网络掩码的目的是什么?](https://linux22.com/image/1502023/%E5%9C%A8%20Linux%20%E6%9C%BA%E5%99%A8%E4%B8%8A%E7%9A%84%20ipv4%20%E6%8E%A5%E5%8F%A3%E4%B8%8A%E9%85%8D%E7%BD%AE%E7%BD%91%E7%BB%9C%E6%8E%A9%E7%A0%81%E7%9A%84%E7%9B%AE%E7%9A%84%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我想知道 Linux 网络堆栈中的网络掩码用于什么。
假设我有一个接口 eth0,配置为 ip 1.1.1.1 和网络掩码 255.255.255.0
现在我向 1.1.1.2 发送一个数据包,向 1.2.3.4 发送一个数据包。为什么我的 Linux 机器需要知道网络架构才能满足这两个请求?
我希望在两种情况下都会发送一个 arp 请求,并且对于第一种情况,真正的主机会应答,而对于第二种情况,合格的路由器会应答。
答案1
我希望在两种情况下都会发送一个 arp 请求,并且对于第一种情况,真正的主机会应答,而对于第二种情况,合格的路由器会应答。
不,如果 ARP 请求针对的是路由器自身接口之一的 IP 地址,则路由器仅提供 ARP 响应。
客户端使用网络掩码来决定目标 IP 是否是 LAN 本地或需要路由。
如果客户端确定目标在 LAN 之外,它会从路由表中选择一个合适的路由器。通常,这将是启动时静态配置的“默认网关”,或者现在更可能由 DHCP 配置。
然后,客户端将广播 ARP 请求以查找路由器 IP 地址的 MAC 地址,在收到 arp 响应后,它可以将包含路由器 MAC 地址和最终目的地 IP 地址的数据包发送到路由器。客户端还将路由器的 MAC 地址和 IP 地址存储在其 ARP 缓存中,以避免对相同信息进行进一步的 ARP 请求。
答案2
您的本地计算机有一个 ARP 缓存。这是每个 IP 地址的 ARP 响应表。您不希望此缓存中有 40 亿个条目。网络掩码告诉您应该缓存哪些地址。
也就是说,合格的路由器(网关)将还具有本地地址,因为它必须是可访问的。(您也可以明确配置这一点)。这样,发往 1.2.3.4 的数据包实际上会触发针对已配置网关地址(例如 1.1.1.254)的 ARP 请求。由于它是一个路由器,因此 1.1.1.254 在收到发往 1.2.3.4 的数据包时不会感到惊讶。