当我ping
在 LAN 上找到主机 IP 地址时,我的主机会广播请求ARP
。在收到ARP
目标主机的回复后,它会启动一个ICMP echo
包含回复的消息会话。
当目标主机从我的源主机接收时ARP request
,目标主机是否会ARP
使用请求中嵌入的信息更新缓存(因为源MAC address
存在于中ARP request
)?
如果是这样,为什么目标主机有时会ARP request
为我的源主机 IP 地址发送另一个请求,并丢弃所有ICMP echo
请求直到得到回复ARP reply
?
请注意,这种行为是偶然发生的,有时ICMP echo
会在ARP request
目标主机发出响应之前做出响应,但这种响应ARP request
总是出现在 ping 会话中间的某个地方。
我不知道这是否是由于早期 ping 会话中主机的 ARP 表更新所致,或者第二个只是一种协议,并且目标主机已经具有来自第一个的ARP request
源主机的信息。MAC address
ARP request
或者,目标主机根本不需要源主机MAC address
,因为它总是封装在每个ICMP echo
请求中,并且对每个此类请求的回复都使用收到的有关的信息MAC addresses
并在响应帧中切换它们?
编辑 1:经过一番研究,我发现目标主机实际上并没有ARP cache
从被动ARP requests
(即来自其他主机的请求)中填充其内容。它ARP cache
仅从ARP
其自身请求收到的回复中填充其内容。
编辑2:继之后,在任何回复之前来自目标主机的Edit 1
第二个回复表明源不在其内或已成为,从而在回复请求之前触发另一个回复。(有时首先通过探测检查地址,如果映射无效或探测超时,则发生新的回复。ARP request
ICMP echo
MAC address
ARP cache
STALE
ARP request
ICMP echo
STALE
ARP request
ARP request
因此,会话中间发生的第二个请求ping
表明,由于某些原因(在我的主机中配置为 60 秒),源MAC address
已进入STALE
我的目标主机,从而触发了第二个请求。此外,这些第二个请求澄清了虽然目标主机不需要源填充到其请求中并使用有关源的信息来回复它,但它确实需要知道源才能回复请求。ARP cache
ARP timeout value
ARP request
ARP
MAC address
ARP cache
ARP request
MAC address
MAC address
TCMP echo
尽管如此,我们仍然非常感谢任何能够详细说明或纠正上述调查结果中的错误的答案。
如果目标主机的 ARP 表中已有条目,则当它看到 ARP 请求时,它应该更新其 ARP 表。如果该条目不在其 ARP 表中,则它可能不会在其 ARP 表中创建条目。
如果主机是 ARP 请求的目标,它应该更新其 ARP 表,但实际上并不总是这样。如果主机看到不是针对它的广播 ARP 请求,它应该只在其 ARP 表中已有源的情况下更新其 ARP 表。
特定的操作系统实现决定了这是如何发生的,但是RFC 892(以太网地址解析协议)有伪代码来解释数据包接收过程。
RFC 末尾有一节讨论了这个问题。RFC 中没有任何内容要求 ARP 表条目超时,但这是操作系统供应商的常见做法。RFC 讨论是这样开始的: