我正在尝试为我的 Linux 2.6 路由器编写一个简单的网络发现。
我正在测试 busybox 内置的 arping。我不明白为什么向直接广播发送单个请求是不够的。
root@router:# arping -h
BusyBox v1.32.1 (2021-03-26 15:21:46 CET) multi-call binary.
Usage: arping [-fqbDUA] [-c CNT] [-w TIMEOUT] [-I IFACE] [-s SRC_IP] DST_IP
Send ARP requests/replies
-f Quit on first ARP reply
-q Quiet
-b Keep broadcasting, don't go unicast
-D Exit with 1 if DST_IP replies
-U Unsolicited ARP mode, update your neighbors
-A ARP answer mode, update your neighbors
-c N Stop after sending N ARP requests
-w TIMEOUT Seconds to wait for ARP reply
-I IFACE Interface to use (default eth0)
-s SRC_IP Sender IP address
DST_IP Target IP address
因此此时我尝试:
root@router:# arping -c1 -w1 -I br1 -s 10.10.11.5 10.10.11.255
ARPING 10.10.11.255 from 10.10.11.5 br1
Sent 1 probe(s) (0 broadcast(s))
Received 0 response(s) (0 request(s), 0 broadcast(s))
我这里漏掉了什么?我希望 LAN 内的所有设备都能响应 arp 请求,但似乎没有发生。我剩下的唯一选择是为每个可能的 IP 发送一个 arping,但考虑到设备很小,这非常耗费内存。
所以简而言之:我如何才能制作一个 arping 命令来请求完整子网做出响应,以便在网络映射时我的 arp 表可以被视为可靠的信息来源?
谢谢!
答案1
ARP(通过以太网)用于发现与目标 IP 地址关联的以太网 MAC 地址。ARP 请求始终一次针对一个目标。解释并不重要,但它最初是以以太网广播 (FF:FF:FF:FF:FF:FF) 的形式进行的,因此尚未知道的目标可以接收它,一旦知道目标,可以作为有针对性的单播发送以刷新缓存。
在 LAN 10.10.11.0/24 中,没有地址为 10.10.11.255 的系统,因为按照惯例,这是此 LAN 的定向广播地址:当 IP 数据报使用此地址作为目的地时,封装该地址的以太网帧会自动获取以太网广播地址 (FF:FF:FF:FF:FF:FF) 作为目的地,以便所有系统都能接收它。这意味着:
- 没有主机会发送这样的 ARP 请求,或者它行为不当,因为它不需要解析任何单播当已经知道向 IP 广播地址发送时要使用哪个目标 MAC 地址时,MAC 地址:播送以太网地址 FF:FF:FF:FF:FF:FF
- 没有主机拥有此 IP 地址(即:用作源)或配置错误(例如配置错误:此 IP 地址可能受到影响而未被视为广播地址,可能是因为存在不同的 LAN 网络掩码,如 10.10.11.255/21)
- 因此,即使 ARP 请求错误地要求该 IP 地址,也不会看到任何 ARP 回复。
因此,在所有系统都正确配置的网络中,向 IP LAN 广播地址发送 ARP 是没有意义的,并且不会导致任何答复,因为没有任何东西可以回答它。
简而言之:你不能用一个阿尔平命令,您必须循环执行它。