当试图将数据包发送到另一个子网时,一个子网中的主机如何知道将数据包转发到路由器 MAC

网络工程 路由器 以太网 子网 arp 网关
2021-07-10 06:39:55

我试图理解 ARP 协议,但我无法理解上述内容。考虑拓扑如下:

H1(1.1.1.1) - (1.1.1.0)R(2.2.2.0) - H2(2.2.2.2)

我的理解是,如果主机 1 的 MAC 表没有主机 2 的目标 MAC 的条目,它将发送一个带有目标 IP(2.2.2.2)的 ARP 查询,在子网上找不到该 IP,并且数据包将是丢弃。但是如何将数据包发送到网关(路由器或 1.1.1.0)呢?

4个回答

发送设备使用子网掩码来确定远程主机是否在其本地网络中。

如果 IP 在本地机器的子网内,它使用 ARP 来确定远程主机的 MAC 地址。

如果它在外部,它会查询它的本地路由表以查找该 IP 的下一跳,并发出 ARP 查询以查找该下一跳的 MAC 地址。在大多数机器上,路由表只有一个默认路由,即上游路由器,但您可以手动定义多条路由。但是,默认路由只能有一个,因此如果您的机器有多个接口,则不应在多个接口上定义默认网关。(因为默认网关设置本质上为 0.0.0.0/0(也就是每台主机)添加了一条路由,网关设置为该 IP)。

补充其他答案:

  • 主机(或路由器,它只是具有多个接口并启用接口之间的数据包转发的主机)所做的第一件事是检查其路由表。

    最基本的路由表通常会有:

    • 本地网络的一个条目,指向相关接口

    • 一条默认路由,指向默认网关

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         1.1.1.0         0.0.0.0         UG        0 0          0 eth0
1.1.0.0         0.0.0.0         255.255.0.0     U         0 0          0 eth0

根据接口和实现,可能会有更多的路由,但这是最基本的形式。

路由总是首先被查找为“更具体的”。“更具体”是指路由覆盖的目的地址数量较少(前缀长度较长,或者如果还是用子网掩码的话,子网掩码中1的个数较多)。

这意味着单个主机的路由(a /32,网络掩码 255.255.255.255)比 /24(网络掩码 255.255.255.0)的路由更具体,它比默认路由 /0(网络掩码 0.0)更具体.0.0)。如果所有 3 条路由“匹配”,则将使用第一个路由,依此类推。

  • 对于发往本地网络上的 IP 的数据包,主机将找到告诉它该网络已连接到该接口的路由。它会发现它是一个使用 ARP 的以太网接口,并将查找其 ARP 表(有时会与路由表合并,具体取决于实现)。如果它没有找到相关的 ARP 条目,它就会发出一个 ARP 请求。

  • 对于发往不在本地网络上的 IP 的数据包,它将回退到默认路由,从而为其提供默认网关的 IP。然后使用该 IP 再次开始练习,该 IP 现在位于本地网络上(如果不是,则数据包将被丢弃)。

要执行此操作,您的计算机需要 3 条信息。在典型的设置中,它们都由 DHCP 提供。如果您分配静态 IP 地址,则必须提供所有这些地址才能使此工作正常进行。

我们将开始提供缺失的两部分数据。我们将两个网络的子网掩码设置为 255.255.0.0。我们将network1的默认网关设置为1.1.1.0,network2的默认网关设置为2.2.2.0

接下来...在您的场景中,host1 永远不会尝试向主机 2.2.2.2 发送 ARP 查询,因为它可以从 IP 地址和子网的组合中找出 2.2.2.2 的 IP 地址不在其网络上面具。每个 IP 与子网掩码组合(使用按位 AND 运算)以提供计算机所在的网络地址。1.1.1.1 和 255.255.0.0 = 1.1.0.0。2.2.2.2 AND 255.255.0.0 = 2.2.0.0。1.1.0.0 不等于 2.2.0.0,因此这些 IP 地址来自不同的网络。因为它们在不同的网络上,所以计算机不需要 ARP。默认网关被命名为这样(我至少假设),因为它是发送不同网络上的任何流量的默认位置。

它可能有助于区分 IP 层发生的事情(如果您在路由层使用不同的协议,行为会有所不同),以太网层发生的事情(如果您使用不同的协议,行为会有所不同)链路层),以及中间发生的事情(数据包封装,以及至少在概念上不是 IP 或以太网特定的 ARP 解析)。我将把这些描述为发生在三个不同的软件驱动程序中,尽管在实践中这些驱动程序中的两个或三个很可能被组合在一起。

首先,IP 驱动程序查询 IP 路由表以确定谁必须接收给定目标 IP 地址的数据包。对 IP 路由表的查询可能会返回以下三种可能结果之一:

  • 另一个 IP 地址,即该目标的网关。如果 IP 驱动程序得到这个结果,它会递归查询路由表以获取网关的 IP 地址,并重复此过程,直到 IP 驱动程序遇到另一个情况或确定递归过多(在这种情况下无法传递数据包)因为没有到目标主机的路由)。
  • 一个网络接口。在这种情况下,IP 驱动程序将在该接口上发送数据包。
  • 没有条目(如果没有默认路由,可能会发生这种情况)。在这种情况下,数据包无法传递,因为没有到目标主机的路由)。

如果找到路由,IP 驱动程序不仅会记住最终结果,即网络接口,还会记住在链路层将数据包发送到的 IP 地址(这是在递归查找中找到的最后一个网关,或原始网关)如果未找到网关,则为目标 IP 地址)。

在您的示例中,到 2.2.2.2 的路由经过网关 1.1.1.0,该网关位于主机的某个以太网接口上,我们称之为eth0因此 IP 驱动程序将数据包传递给 IP-over-Ethernet 驱动程序,告诉它在 .1.1.1.0 上传输它eth0

IP-over-Ethernet 驱动程序维护将 IP 地址与 MAC 地址关联的缓存。如果它在缓存中没有找到请求的 IP 地址,它会发送一个 ARP 请求并等待答案。如果它没有得到答案,它就会拒绝该数据包,因为它无法送达。请注意,IP-over-Ethernet 驱动程序只关心网关地址,而不关心数据包的最终目的地。

所以发送主机会向 ​​1.1.1.0 发出 ARP 请求。它永远不会尝试向 2.2.2.2 发出 ARP 请求,因为它知道它没有到它的直接路由。

当 IP-over-Ethernet 驱动程序找到 1.1.1.0 的 MAC 地址时,它将数据包传递给以太网驱动程序,告诉它发送到该特定 MAC 地址。以太网驱动程序发送以太网帧。它不关心 IP 地址。