不同的MAC地址

网络工程 MAC地址 第 2 层 第 3 层 联网
2022-02-22 13:31:13

如果网络上的主机收到一个 IP 数据包,其 MAC 源地址与该源 IP 的本地 ARP 表中的 MAC 地址不同,会发生什么情况。

该 IP 的 ARP 表条目曾经并将通过有效的 ARP 响应填充。

显然,在这种情况下(ICMP 回显响应或 TCP SYN/ACK ...等),Linux 主机不会只发送回复数据包。

我认为接收主机只是获取源 IP 并尝试在其本地表中找到相应的 MAC 地址。

编辑:

首先,非常感谢到目前为止的答案,但它们只是关于 ARP 数据包和表处理。那没有回答我的问题,所以我想我必须澄清一下情况:

在此处输入图像描述

如果主机 Hb 向 10.2.0.5(主机 Ha)发送 ping 请求,Ha 收到源 IP 为 10.1.0.3 的 ICMP 数据包,源 MAC 地址为路由器的 MAC 地址。但是主机 Ha 的 ARP 表有一个条目:10.1.0.3 -> Hb MAC 地址。因此MAC地址不同!

现在我注意到主机 Ha 只是没有发送回复数据包(没有数据包离开接口)。现在的问题是主持人 Ha 这样做的原因是什么。

2个回答

ARP 是一个独立的进程,就像 IP 是一个独立的进程一样。帧将具有以太网类型字段,该字段告诉数据链路(以太网、Wi-Fi 等)协议应将帧有效负载发送到哪个进程。

只有设置了以太网类型的帧才能0x0806将帧有效负载发送到 ARP,这可能会更新 ARP 表。如果 Ether Type 为0x0800,则将帧有效负载发送到 IPv4 进程。如果 Ether Type 为0x86DD,则将帧负载发送到 IPv6 进程。等等。

未将以太网类型字段设置为0x0806不更新 ARP 表的接收帧。这是设计使然,您可以在RFC 826, An Ethernet Address Resolution Protocol中阅读它,其中描述了 ARP 的工作原理。事实上,并非所有发送到 ARP 的内容都会更新 ARP 表。ARP 回复当然可以,但是如果该 IPv4 地址的条目已经存在,ARP 收到的其他内容只会更新 ARP 表:

?Do I have the hardware type in ar$hrd?
Yes: (almost definitely)
  [optionally check the hardware length ar$hln]
  ?Do I speak the protocol in ar$pro?
  Yes:
    [optionally check the protocol length ar$pln]
    Merge_flag := false
    If the pair <protocol type, sender protocol address> is
        already in my translation table, update the sender
        hardware address field of the entry with the new
        information in the packet and set Merge_flag to true.
    ?Am I the target protocol address?
    Yes:
      If Merge_flag is false, add the triplet <protocol type,
          sender protocol address, sender hardware address> to
          the translation table.
      ?Is the opcode ares_op$REQUEST?  (NOW look at the opcode!!)
      Yes:
        Swap hardware and protocol fields, putting the local
            hardware and protocol addresses in the sender fields.
        Set the ar$op field to ares_op$REPLY
        Send the packet to the (new) target hardware address on
            the same hardware on which the request was received.

编辑:

你的问题现在完全不同了,那是不好的形式。请在新问题中提出不同的问题。

您需要遵循数据包。如果Hb发送到不同的网络,那么它将包含数据包的帧发送到其配置的网关(路由器),网关将数据包路由到不同的网络,因此包含数据包的新帧到达具有 MAC 地址的不同接口因为路由器将剥离包含已更改的原始源 MAC 地址的原始帧。

Ha在其接口上从路由器接收帧10.2.0.5,然后将其发送到网络堆栈。Ha然后处理数据报,并将响应发送回Hb10.1.0.5接口,因为其内部路由表将该网络作为直接连接的网络。

听起来您认为因为在一个接口上收到了一个数据包,它应该在同一个接口上回复,但这不是它的工作原理。每个数据包都是单独路由的,无论之前可能有任何数据包。您的场景永远不会从接口发送Ha数据Hb10.2.0.5


编辑2:

如果您在正确的 ( 10.1.0.5) 界面上没有看到回复,那么您的主机有问题,它的行为在这里是题外话。我已经描述了主机应该做什么,但如果你的主机做了不同的事情,那么你有一些配置错误,测量问题,或者你的主机的行为是非标准的。这些问题都不是在这里要问的,因为你声称是一个实验室,所以对于Server Fault来说这将是题外话,但你可以尝试在Super UserUnix & LinuxAsk Ubuntu上询问它。

首先MAC地址表没有IP地址。您描述的是 ARP 表,其中包含将 IP 绑定到相应 MAC 的内容。

所以有 2 个 ARP 条目静态和动态一个。在大多数情况下,您将使用动态,因此如果主机收到具有不同 MAC 地址的相同 IP 地址,他只会使用新 MAC 更新动态 ARP 条目。对于静态主机将不会响应,直到您手动修改 arp 记录。

linux 主机不响应的原因可能更多,例如,如果网络使用 DHCP 欺骗和 DAI,如果用户手动设置其地址而不是使用 DHCP,它将过滤此数据包。