我想知道为什么我会得到以下结果:
如果我尝试访问本地网络上不存在的主机,例如使用命令 ping,我通过该tcpdump arp
命令看到我的计算机每秒都会发送一个请求,但每三秒我会连续who-has
收到三条消息。Destination Host Unreachable
你能解释一下为什么吗?
答案1
从http://linux-ip.net/html/ether-arp.html:
如果请求的目标 IP 不存在 ARP 缓存条目,则内核将生成 mcast_solicit ARP 请求,直到收到答复。在此发现期间,ARP 缓存条目将处于未完成状态。如果在指定数量的 ARP 请求后查找仍未成功,则 ARP 缓存条目将处于失败状态。如果查找成功,则内核将响应输入 ARP 缓存并重置确认和更新计时器。
您可以在例如中找到 mcast_solicit 的值/proc/sys/net/ipv4/neigh/eth0/mcast_solicit
。我不确定重新传输 arp 请求之前的超时是否可调,但根据经验,它是 1 秒。
由于需要重试 3 次才能得出主机无法访问的结论,因此 ping 数据包排队等待 3 秒,然后它们全部被拒绝,因为状态为“无法访问”。然后故事又开始了,解释了错误消息的 3 秒聚集。
答案2
主机不存在,无法响应 ARP 查询。因此,您的客户端甚至无法制作 ICMP 数据包,该数据包发往您尝试 ping 的 IP 的“可能的”MAC 地址。事实上,如果您的计算机无法通过 ARP 解析 MAC 地址,则无法制作这样的数据包。因此,目标主机毫无疑问无法到达。
如果该主机存在,它就会响应 ARP 请求,然后您的客户端就可以形成 ICMP Echo 数据包。如果主机随后选择不响应(可能是因为它正在丢弃 ICMP 流量),您的客户端将成功发送 ICMP Echo,但永远不会收到 ICMP Echo Reply。然后您的 Ping 将报告类似以下内容的内容请求超时。