我有一个如下所示的场景。
这里有两台主机通过集线器连接:
好的,主机 1 想要 ping 主机 2,并且我在连接到同一集线器的第三台主机上设置了 wireshark。现在令人惊讶的是,对于一个 ping 命令,我看到了 6 个数据包,而应该有 4 个。这是我从 wireshark 中看到的内容:
现在我无法理解的是,为什么会生成数据包 5 和 6,而 ARP 回复目的地却已经知道发送方 mac。
或者我的理解有问题,请帮忙。
答案1
原始答案
第一个响应来自集线器接口,而不是主机 1 接口。当发送回数据时,您仍然需要知道主机 1 的 IP 和接口的 mac。有些交换机会自动执行此操作,有些则不会。
改进的答案:
.-----------.
| hub |
| |
[host-1 i1]+--+hi1 hi2+--+[i2 host-2]
| |
`-----------´
network interfaces:
i1, i2, hi1, hi2
通过应用层的 IP 地址从主机 2 向主机 1 发送某些内容后,对主机 2 的初始响应(以及所有后续响应)将来自该hi2
接口,而不是i1
主机 1 中的接口。
为了向主机 1 的已知 IP 发送任何内容,主机 2 仍需要知道在链路层上将数据包发送到何处。为此,主机 2 必须请求主机 1 的 IP 所在接口的 MAC 地址。
有些交换机会自动进行这种转换 - 它们会记住 mac 路径向后。大多数集线器不具备此条件,因此提出第二个请求。
答案2
我认为给出的答案是错误的。在我看来,这种现象的发生是因为 Linux 内核的 ARP 实现会查找/避免陈旧的 ARP 条目。一旦获悉发送方的 MAC 地址,它就会更新接收方的本地 ARP 缓存,并将条目置于“延迟”状态。等待约 5 秒(默认值,可在 中更改delay_first_probe_time
)后,接收方将探测可达性,然后确定主机现在被视为“可到达”。
更多详情可在这找到:
https://osqa-ask.wireshark.org/questions/15792/arp-replies-appear-with-delay-in-wireshark-output/